@almadar/std 16.241.0 → 16.242.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 (109) hide show
  1. package/behaviors/behaviors-registry.json +4650 -535
  2. package/behaviors/lolo/agent/atoms/std-agent-memory.lolo +38 -1
  3. package/behaviors/lolo/agent/atoms/std-agent-session.lolo +1074 -47
  4. package/behaviors/lolo/agent/atoms/std-agent-tool-loop.lolo +8 -7
  5. package/behaviors/lolo/agent/organisms/std-agent-assistant.lolo +56 -37
  6. package/behaviors/lolo/infra/atoms/std-page-open.lolo +59 -0
  7. package/behaviors/lolo/infra/atoms/std-page-search.lolo +134 -0
  8. package/behaviors/lolo/infra/atoms/std-page-treat.lolo +59 -0
  9. package/behaviors/lolo/infra/atoms/std-page-watch.lolo +86 -0
  10. package/behaviors/lolo/ui/core/atoms/std-book-reader.lolo +25 -1
  11. package/behaviors/lolo/ui/core/atoms/std-card-grid.lolo +9 -0
  12. package/behaviors/lolo/ui/core/atoms/std-doc-page.lolo +153 -0
  13. package/behaviors/lolo/ui/learning/atoms/std-learn-arrangement.lolo +124 -92
  14. package/behaviors/lolo/ui/learning/atoms/std-learn-classify.lolo +114 -55
  15. package/behaviors/lolo/ui/learning/atoms/std-learn-compare.lolo +40 -14
  16. package/behaviors/lolo/ui/learning/atoms/std-learn-coupled-sim.lolo +363 -123
  17. package/behaviors/lolo/ui/learning/atoms/std-learn-derivation.lolo +93 -48
  18. package/behaviors/lolo/ui/learning/atoms/std-learn-diagram.lolo +60 -28
  19. package/behaviors/lolo/ui/learning/atoms/std-learn-doser.lolo +193 -96
  20. package/behaviors/lolo/ui/learning/atoms/std-learn-estimate.lolo +75 -32
  21. package/behaviors/lolo/ui/learning/atoms/std-learn-goal-seek.lolo +142 -86
  22. package/behaviors/lolo/ui/learning/atoms/std-learn-grid-sim.lolo +266 -98
  23. package/behaviors/lolo/ui/learning/atoms/std-learn-hotspot.lolo +103 -65
  24. package/behaviors/lolo/ui/learning/atoms/std-learn-live-sim.lolo +223 -109
  25. package/behaviors/lolo/ui/learning/atoms/std-learn-measure.lolo +232 -64
  26. package/behaviors/lolo/ui/learning/atoms/std-learn-param-explorer.lolo +69 -29
  27. package/behaviors/lolo/ui/learning/atoms/std-learn-perturb.lolo +363 -123
  28. package/behaviors/lolo/ui/learning/atoms/std-learn-predict.lolo +73 -41
  29. package/behaviors/lolo/ui/learning/atoms/std-learn-sample-accumulator.lolo +96 -38
  30. package/behaviors/lolo/ui/learning/atoms/std-learn-sandbox.lolo +65 -45
  31. package/behaviors/lolo/ui/learning/atoms/std-learn-scatter-fit.lolo +243 -117
  32. package/behaviors/lolo/ui/learning/atoms/std-learn-scenario.lolo +76 -28
  33. package/behaviors/lolo/ui/learning/atoms/std-learn-sim-3d.lolo +228 -109
  34. package/behaviors/lolo/ui/learning/atoms/std-learn-speed-drill.lolo +95 -44
  35. package/behaviors/lolo/ui/learning/atoms/std-learn-stepper.lolo +199 -125
  36. package/behaviors/lolo/ui/learning/atoms/std-learn-tour-3d.lolo +92 -48
  37. package/behaviors/lolo/ui/learning/atoms/std-learn-trace-player.lolo +239 -78
  38. package/behaviors/lolo/ui/learning/atoms/std-learn-transport.lolo +147 -38
  39. package/behaviors/lolo/ui/learning/atoms/std-learn-tree.lolo +123 -58
  40. package/behaviors/lolo/ui/learning/atoms/ui-algo-graph-canvas.lolo +22 -0
  41. package/behaviors/lolo/ui/learning/atoms/ui-algorithm-canvas.lolo +26 -0
  42. package/behaviors/lolo/ui/learning/atoms/ui-biology-canvas.lolo +26 -0
  43. package/behaviors/lolo/ui/learning/atoms/ui-chemistry-canvas.lolo +27 -1
  44. package/behaviors/lolo/ui/learning/atoms/ui-learning-canvas.lolo +27 -1
  45. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +29 -9
  46. package/behaviors/lolo/ui/learning/atoms/ui-physics-canvas.lolo +26 -0
  47. package/behaviors/lolo-behavior-contracts.json +1 -1
  48. package/behaviors/registry/agent/atoms/std-agent-memory.orb +372 -2
  49. package/behaviors/registry/agent/atoms/std-agent-session.orb +4752 -348
  50. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +54 -42
  51. package/behaviors/registry/agent/organisms/std-agent-assistant.orb +356 -122
  52. package/behaviors/registry/factory-signatures.json +1 -1
  53. package/behaviors/registry/infra/atoms/std-page-open.orb +435 -0
  54. package/behaviors/registry/infra/atoms/std-page-search.orb +867 -0
  55. package/behaviors/registry/infra/atoms/std-page-treat.orb +494 -0
  56. package/behaviors/registry/infra/atoms/std-page-watch.orb +554 -0
  57. package/behaviors/registry/ui/core/atoms/std-book-reader.orb +119 -0
  58. package/behaviors/registry/ui/core/atoms/std-card-grid.orb +61 -0
  59. package/behaviors/registry/ui/core/atoms/std-doc-page.orb +594 -0
  60. package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +903 -369
  61. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1002 -232
  62. package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +253 -74
  63. package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +3624 -921
  64. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +685 -144
  65. package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +404 -52
  66. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +1787 -210
  67. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +699 -71
  68. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +1102 -578
  69. package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +2760 -872
  70. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +689 -152
  71. package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +1431 -633
  72. package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +2485 -512
  73. package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +501 -197
  74. package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +3642 -928
  75. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +705 -125
  76. package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +624 -114
  77. package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +405 -153
  78. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +1911 -611
  79. package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +436 -128
  80. package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +2482 -485
  81. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +896 -192
  82. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +2001 -759
  83. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +734 -228
  84. package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +2501 -764
  85. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +1591 -173
  86. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +883 -122
  87. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +176 -0
  88. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +211 -0
  89. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +211 -0
  90. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +212 -1
  91. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +212 -1
  92. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +203 -9
  93. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +211 -0
  94. package/behaviors/signatures.lolo +325 -655
  95. package/dist/behaviors/exports-reader.js +16092 -9747
  96. package/dist/behaviors/functions/index.d.ts +1052 -136
  97. package/dist/behaviors/functions/index.js +16063 -9745
  98. package/dist/behaviors/index.d.ts +1 -1
  99. package/dist/behaviors/index.js +16093 -9748
  100. package/dist/behaviors/query.js +16092 -9747
  101. package/dist/behaviors-embeddings.hash.json +3 -3
  102. package/dist/behaviors-embeddings.json +45 -25
  103. package/dist/behaviors-registry.json +4650 -535
  104. package/dist/index.d.ts +1 -1
  105. package/dist/index.js +16093 -9748
  106. package/dist/knob-embeddings.hash.json +3 -3
  107. package/dist/knob-embeddings.json +607 -263
  108. package/dist/registry/factory-signatures.json +1 -1
  109. package/package.json +3 -3
@@ -11335,7 +11335,7 @@ pattern meter {
11335
11335
  ;; an `Alias.orbitals.X` reference overrides config + identifiers, never
11336
11336
  ;; the imported orbital's own topology.
11337
11337
 
11338
- ;; === atoms (281 behaviors, 281 apps, 281 orbitals, 281 entities, 302 traits, 284 pages) ===
11338
+ ;; === atoms (280 behaviors, 280 apps, 281 orbitals, 281 entities, 302 traits, 284 pages) ===
11339
11339
 
11340
11340
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-completion.orb)
11341
11341
  app std-agent-completion {
@@ -11391,7 +11391,7 @@ app std-agent-planner {
11391
11391
  app std-agent-session {
11392
11392
  alias : AgentSession
11393
11393
  version : "3.0.0"
11394
- orbitals : (AgentSessionOrbital)
11394
+ orbitals : (AgentSessionOrbital AgentChatsOrbital)
11395
11395
  override-surface : (config)
11396
11396
  ;; via uses Alias from "std/behaviors/std-agent-session" { config { ... } }
11397
11397
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb)"
@@ -12337,16 +12337,6 @@ app std-lifecycle {
12337
12337
  source : "@almadar/std (behaviors/registry/infra/atoms/std-lifecycle.orb)"
12338
12338
  }
12339
12339
 
12340
- ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-list.orb)
12341
- app std-list {
12342
- alias : List
12343
- version : "1.0.0"
12344
- orbitals : (ListItemOrbital)
12345
- override-surface : (config)
12346
- ;; via uses Alias from "std/behaviors/std-list" { config { ... } }
12347
- source : "@almadar/std (behaviors/registry/ui/core/atoms/std-list.orb)"
12348
- }
12349
-
12350
12340
  ;; From @almadar/std (behaviors/registry/ui/game/atoms/std-lives.orb)
12351
12341
  app std-lives {
12352
12342
  alias : Lives
@@ -14197,6 +14187,16 @@ orbital std-agent-planner.orbitals.AgentPlannerOrbital {
14197
14187
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-planner.orb orbitals[0])"
14198
14188
  }
14199
14189
 
14190
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1])
14191
+ orbital std-agent-session.orbitals.AgentChatsOrbital {
14192
+ alias : AgentSession
14193
+ entity : AgentChat
14194
+ traits : (AgentChatKeeper AgentChatList)
14195
+ pages : ("/agent-session/chats")
14196
+ override-surface : (entity fields extend pages omit only config events roles entities mounts)
14197
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1])"
14198
+ }
14199
+
14200
14200
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[0])
14201
14201
  orbital std-agent-session.orbitals.AgentSessionOrbital {
14202
14202
  alias : AgentSession
@@ -15147,16 +15147,6 @@ orbital std-lifecycle.orbitals.LifecycleOrbital {
15147
15147
  source : "@almadar/std (behaviors/registry/infra/atoms/std-lifecycle.orb orbitals[0])"
15148
15148
  }
15149
15149
 
15150
- ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-list.orb orbitals[0])
15151
- orbital std-list.orbitals.ListItemOrbital {
15152
- alias : List
15153
- entity : ListItem
15154
- traits : (ListItemBrowse ListItemPersistor ListItemCreateButton = Button.traits.ButtonRender ListItemCreateGate = RoleGate.traits.RoleGate ListItemCreate = Modal.traits.ModalRecordModal ListItemEdit = Modal.traits.ModalRecordModal ListItemDelete = Confirmation.traits.ConfirmActionConfirmation)
15155
- pages : ("/listitems")
15156
- override-surface : (entity fields extend pages omit only config events roles entities mounts)
15157
- source : "@almadar/std (behaviors/registry/ui/core/atoms/std-list.orb orbitals[0])"
15158
- }
15159
-
15160
15150
  ;; From @almadar/std (behaviors/registry/ui/game/atoms/std-lives.orb orbitals[0])
15161
15151
  orbital std-lives.orbitals.LivesOrbital {
15162
15152
  alias : Lives
@@ -17008,13 +16998,24 @@ entity std-agent-planner.entity {
17008
16998
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-planner.orb orbitals[0].entity)"
17009
16999
  }
17010
17000
 
17001
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1].entity)
17002
+ entity std-agent-session.entity {
17003
+ alias : AgentSession
17004
+ name : AgentChat
17005
+ persistence : persistent
17006
+ collection : agentChats
17007
+ fields : (id! ownerId! title startedAt lastActiveAt pendingMessage pendingReply)
17008
+ override-surface : (extends name fields persistence collection)
17009
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1].entity)"
17010
+ }
17011
+
17011
17012
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[0].entity)
17012
17013
  entity std-agent-session.entity {
17013
17014
  alias : AgentSession
17014
17015
  name : AgentMessage
17015
17016
  persistence : persistent
17016
17017
  collection : agentMessages
17017
- fields : (id! ownerId! role content! createdAt)
17018
+ fields : (id! ownerId! role content! createdAt chatId)
17018
17019
  override-surface : (extends name fields persistence collection)
17019
17020
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[0].entity)"
17020
17021
  }
@@ -17709,7 +17710,7 @@ entity std-learn-coupled-sim.entity {
17709
17710
  alias : LearnCoupledSim
17710
17711
  name : CoupledSimScene
17711
17712
  persistence : runtime
17712
- fields : (id! active title t p q coefA coefB running pSamples qSamples curves)
17713
+ fields : (id! active title t p q coefA coefB running speed pSamples qSamples curves)
17713
17714
  override-surface : (extends name fields persistence collection)
17714
17715
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb orbitals[0].entity)"
17715
17716
  }
@@ -17779,7 +17780,7 @@ entity std-learn-grid-sim.entity {
17779
17780
  alias : LearnGridSim
17780
17781
  name : GridSimScene
17781
17782
  persistence : runtime
17782
- fields : (id! active title cells generation aliveCount running cellShapes)
17783
+ fields : (id! active title cells generation aliveCount running speed elapsedMs cellShapes)
17783
17784
  override-surface : (extends name fields persistence collection)
17784
17785
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb orbitals[0].entity)"
17785
17786
  }
@@ -17809,7 +17810,7 @@ entity std-learn-measure.entity {
17809
17810
  alias : LearnMeasure
17810
17811
  name : MeasureScene
17811
17812
  persistence : runtime
17812
- fields : (id! active title t value running traceSamples traceCurves points sampleCount meanValue)
17813
+ fields : (id! active title t value running speed traceSamples traceCurves points sampleCount meanValue)
17813
17814
  override-surface : (extends name fields persistence collection)
17814
17815
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-measure.orb orbitals[0].entity)"
17815
17816
  }
@@ -17829,7 +17830,7 @@ entity std-learn-perturb.entity {
17829
17830
  alias : LearnPerturb
17830
17831
  name : PerturbScene
17831
17832
  persistence : runtime
17832
- fields : (id! active title t value setpoint rate running traceSamples curves)
17833
+ fields : (id! active title t value setpoint rate running speed traceSamples curves)
17833
17834
  override-surface : (extends name fields persistence collection)
17834
17835
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-perturb.orb orbitals[0].entity)"
17835
17836
  }
@@ -17909,7 +17910,7 @@ entity std-learn-speed-drill.entity {
17909
17910
  alias : LearnSpeedDrill
17910
17911
  name : SpeedDrillScene
17911
17912
  persistence : runtime
17912
- fields : (id! active title itemIndex totalItems remaining running verdict score streak bestStreak done promptText options correctIndex feedback view)
17913
+ fields : (id! active title itemIndex totalItems remaining running verdict score streak bestStreak done promptText options correctIndex feedback pickedIndex view)
17913
17914
  override-surface : (extends name fields persistence collection)
17914
17915
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb orbitals[0].entity)"
17915
17916
  }
@@ -17939,7 +17940,7 @@ entity std-learn-trace-player.entity {
17939
17940
  alias : LearnTracePlayer
17940
17941
  name : TracePlayerScene
17941
17942
  persistence : runtime
17942
- fields : (id! active title frameIndex running bars frameLabel frameCaption statusNote)
17943
+ fields : (id! active title frameIndex running speed elapsedMs bars frameLabel frameCaption statusNote)
17943
17944
  override-surface : (extends name fields persistence collection)
17944
17945
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb orbitals[0].entity)"
17945
17946
  }
@@ -17949,7 +17950,7 @@ entity std-learn-transport.entity {
17949
17950
  alias : LearnTransport
17950
17951
  name : LearnTransportScene
17951
17952
  persistence : runtime
17952
- fields : (id! active title running steps elapsedMs done)
17953
+ fields : (id! active title running steps elapsedMs done speed)
17953
17954
  override-surface : (extends name fields persistence collection)
17954
17955
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-transport.orb orbitals[0].entity)"
17955
17956
  }
@@ -17975,17 +17976,6 @@ entity std-lifecycle.entity {
17975
17976
  source : "@almadar/std (behaviors/registry/infra/atoms/std-lifecycle.orb orbitals[0].entity)"
17976
17977
  }
17977
17978
 
17978
- ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-list.orb orbitals[0].entity)
17979
- entity std-list.entity {
17980
- alias : List
17981
- name : ListItem
17982
- persistence : persistent
17983
- collection : listitems
17984
- fields : (id! name! description status createdAt pendingId)
17985
- override-surface : (extends name fields persistence collection)
17986
- source : "@almadar/std (behaviors/registry/ui/core/atoms/std-list.orb orbitals[0].entity)"
17987
- }
17988
-
17989
17979
  ;; From @almadar/std (behaviors/registry/ui/game/atoms/std-lives.orb orbitals[0].entity)
17990
17980
  entity std-lives.entity {
17991
17981
  alias : Lives
@@ -19890,9 +19880,9 @@ trait std-agent-memory.traits.AgentMemoryRecall {
19890
19880
  linkedEntity : AgentMemory
19891
19881
  category : lifecycle
19892
19882
  states : (ready* recalling remembering)
19893
- events : (INIT MEMORY_STORED RECALL REMEMBER MemoryEmbedded MemoriesForRecall MemoryEmbedFailed AgentMemoriesLoadFailed RECALLED)
19894
- transitions : ((ready -> ready on INIT) (ready -> ready on MEMORY_STORED) (ready -> recalling on RECALL) (ready -> remembering on REMEMBER) (recalling -> recalling on MemoryEmbedded) (recalling -> ready on MemoriesForRecall) (recalling -> ready on MemoryEmbedFailed) (recalling -> ready on AgentMemoriesLoadFailed) (remembering -> ready on MemoryEmbedded) (remembering -> ready on MemoryEmbedFailed))
19895
- emits : (RECALLED MEMORY_STORED AgentMemoriesLoadFailed MemoriesForRecall MemoryEmbedded MemoryEmbedFailed)
19883
+ events : (INIT MEMORY_STORED LIST MemoriesForList MemoryListFailed RECALL REMEMBER MemoryEmbedded MemoriesForRecall MemoryEmbedFailed AgentMemoriesLoadFailed RECALLED ASSISTANT_MEMORIES_LOADED)
19884
+ transitions : ((ready -> ready on INIT) (ready -> ready on MEMORY_STORED) (ready -> ready on LIST) (ready -> ready on MemoriesForList) (ready -> ready on MemoryListFailed) (ready -> recalling on RECALL) (ready -> remembering on REMEMBER) (recalling -> recalling on MemoryEmbedded) (recalling -> ready on MemoriesForRecall) (recalling -> ready on MemoryEmbedFailed) (recalling -> ready on AgentMemoriesLoadFailed) (remembering -> ready on MemoryEmbedded) (remembering -> ready on MemoryEmbedFailed))
19885
+ emits : (RECALLED ASSISTANT_MEMORIES_LOADED MemoriesForList MemoryListFailed MEMORY_STORED AgentMemoriesLoadFailed MemoriesForRecall MemoryEmbedded MemoryEmbedFailed)
19896
19886
  config {
19897
19887
  recallLimit : number = 3 @label "Memories recalled per request" @description "How many of the closest memories go to the model with each request." @tier "policy"
19898
19888
  }
@@ -19925,19 +19915,56 @@ trait std-agent-planner.traits.PlannerListener {
19925
19915
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-planner.orb orbitals[0].traits[1])"
19926
19916
  }
19927
19917
 
19918
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1].traits[0])
19919
+ trait std-agent-session.traits.AgentChatKeeper {
19920
+ alias : AgentSession
19921
+ linkedEntity : AgentChat
19922
+ category : lifecycle
19923
+ states : (ready*)
19924
+ events : (INIT LOAD_HISTORY ChatsForHistory SEND ChatsForSend ChatReadyForSend REPLIED ChatsForReply NEW_CHAT NewChatStarted SELECT_CHAT ChatsForSelect ChatSelected LIST_CHATS ChatsForList AgentChatsLoadFailed ASSISTANT_CHAT_OPENED ASSISTANT_SEND_IN_CHAT ASSISTANT_REPLY_IN_CHAT ASSISTANT_CHATS_CHANGED ASSISTANT_THREAD_FAILED ASSISTANT_CHATS_LOADED)
19925
+ transitions : ((ready -> ready on INIT) (ready -> ready on LOAD_HISTORY) (ready -> ready on ChatsForHistory) (ready -> ready on SEND) (ready -> ready on ChatsForSend) (ready -> ready on ChatsForSend) (ready -> ready on ChatReadyForSend) (ready -> ready on REPLIED) (ready -> ready on ChatsForReply) (ready -> ready on NEW_CHAT) (ready -> ready on NewChatStarted) (ready -> ready on SELECT_CHAT) (ready -> ready on ChatsForSelect) (ready -> ready on ChatSelected) (ready -> ready on LIST_CHATS) (ready -> ready on ChatsForList) (ready -> ready on AgentChatsLoadFailed))
19926
+ emits : (ASSISTANT_CHAT_OPENED ASSISTANT_SEND_IN_CHAT ASSISTANT_REPLY_IN_CHAT ASSISTANT_CHATS_CHANGED ASSISTANT_THREAD_FAILED ASSISTANT_CHATS_LOADED ChatsForList ChatsForHistory ChatsForSend ChatsForReply ChatsForSelect ChatReadyForSend NewChatStarted ChatSelected AgentChatsLoadFailed)
19927
+ override-surface : (linkedEntity name events effects listens emitsScope config)
19928
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1].traits[0])"
19929
+ }
19930
+
19931
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1].traits[1])
19932
+ trait std-agent-session.traits.AgentChatList {
19933
+ alias : AgentSession
19934
+ linkedEntity : AgentChat
19935
+ category : interaction
19936
+ states : (loading* browsing)
19937
+ events : (INIT AgentChatsLoaded AgentChatsLoadFailed CHATS_CHANGED OPEN_CHAT NEW_CHAT_CLICKED ASSISTANT_CHAT_SELECTED ASSISTANT_NEW_CHAT)
19938
+ transitions : ((loading -> loading on INIT) (loading -> browsing on AgentChatsLoaded) (loading -> browsing on AgentChatsLoadFailed) (browsing -> loading on INIT) (browsing -> browsing on CHATS_CHANGED) (browsing -> browsing on AgentChatsLoaded) (browsing -> browsing on AgentChatsLoadFailed) (browsing -> browsing on OPEN_CHAT) (browsing -> browsing on NEW_CHAT_CLICKED))
19939
+ emits : (ASSISTANT_CHAT_SELECTED ASSISTANT_NEW_CHAT AgentChatsLoaded AgentChatsLoadFailed)
19940
+ config {
19941
+ newChatLabel : string = "New conversation" @label "New conversation button" @tier "presentation"
19942
+ untitledLabel : string = "New conversation" @label "Name of a conversation with no messages yet" @tier "presentation"
19943
+ }
19944
+ override-surface : (linkedEntity name events effects listens emitsScope config)
19945
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1].traits[1])"
19946
+ }
19947
+
19928
19948
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[0].traits[1])
19929
19949
  trait std-agent-session.traits.AgentConversation {
19930
19950
  alias : AgentSession
19931
19951
  linkedEntity : AgentConversationView
19932
19952
  category : interaction
19933
19953
  states : (idle*)
19934
- events : (INIT THREAD_LOADED ASK STEP REPLIED REPLY_FAILED SEND)
19935
- transitions : ((idle -> idle on INIT) (idle -> idle on THREAD_LOADED) (idle -> idle on ASK) (idle -> idle on STEP) (idle -> idle on REPLIED) (idle -> idle on REPLY_FAILED))
19936
- emits : (SEND ASK)
19954
+ events : (INIT THREAD_LOADED ASK STEP REPLIED NEW_CHAT_CLICKED OPEN_CHATS_CLICKED CHATS_LISTED CHAT_PICKED OPEN_MEMORY_CLICKED MEMORIES_LISTED BACK_TO_CHAT REPLY_FAILED ASSISTANT_HISTORY_REQUESTED ASSISTANT_NEW_CHAT ASSISTANT_SEND ASSISTANT_CHATS_REQUESTED ASSISTANT_CHAT_SELECTED ASSISTANT_MEMORIES_REQUESTED)
19955
+ transitions : ((idle -> idle on INIT) (idle -> idle on THREAD_LOADED) (idle -> idle on ASK) (idle -> idle on STEP) (idle -> idle on REPLIED) (idle -> idle on NEW_CHAT_CLICKED) (idle -> idle on OPEN_CHATS_CLICKED) (idle -> idle on CHATS_LISTED) (idle -> idle on CHAT_PICKED) (idle -> idle on OPEN_MEMORY_CLICKED) (idle -> idle on MEMORIES_LISTED) (idle -> idle on BACK_TO_CHAT) (idle -> idle on REPLY_FAILED))
19956
+ emits : (ASSISTANT_HISTORY_REQUESTED ASSISTANT_NEW_CHAT NEW_CHAT_CLICKED ASSISTANT_SEND ASSISTANT_CHATS_REQUESTED ASSISTANT_CHAT_SELECTED ASSISTANT_MEMORIES_REQUESTED OPEN_CHATS_CLICKED OPEN_MEMORY_CLICKED CHAT_PICKED ASK)
19937
19957
  config {
19958
+ backLabel : string = "Back" @label "Back to the conversation" @tier "presentation"
19959
+ chatsEmptyTitle : string = "No conversations yet" @label "Empty conversation list" @tier "presentation"
19960
+ chatsLabel : string = "Conversations" @label "Past conversations button" @description "Shows the person's past conversations in place of the chat; picking one reopens it." @tier "presentation"
19938
19961
  emptyTitle : string = "Ask me to do something in this app" @label "Empty conversation title" @tier "presentation"
19939
- links : [AgentLink] = [] @label "Links above the conversation" @description "Related pages (e.g. the run history)." @tier "presentation"
19962
+ links : [AgentLink] = [{"href":"/agent-session/chats","label":"All conversations"}] @label "Links above the conversation" @description "Related pages (e.g. the run history)." @tier "presentation"
19963
+ memoryEmptyTitle : string = "Nothing remembered yet" @label "Empty memory list" @tier "presentation"
19964
+ memoryLabel : string = "What I remember" @label "Memory button" @description "Shows what the assistant remembers for this person in place of the chat." @tier "presentation"
19965
+ newChatLabel : string = "New conversation" @label "New conversation button" @description "Starts a fresh conversation; earlier ones stay in the conversation list." @tier "presentation"
19940
19966
  placeholder : string = "Ask the assistant…" @label "Message placeholder" @tier "presentation"
19967
+ untitledLabel : string = "New conversation" @label "Title of a conversation with no messages yet" @tier "presentation"
19941
19968
  }
19942
19969
  override-surface : (linkedEntity name events effects listens emitsScope config)
19943
19970
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[0].traits[1])"
@@ -19949,9 +19976,9 @@ trait std-agent-session.traits.AgentThread {
19949
19976
  linkedEntity : AgentMessage
19950
19977
  category : lifecycle
19951
19978
  states : (ready*)
19952
- events : (INIT SEND AgentMessageSaved AgentConversationLoaded REPLIED AgentMessagesLoadFailed AgentMessageSaveFailed THREAD_FAILED CONVERSE AgentMessagesLoaded)
19953
- transitions : ((ready -> ready on INIT) (ready -> ready on SEND) (ready -> ready on AgentMessageSaved) (ready -> ready on AgentConversationLoaded) (ready -> ready on REPLIED) (ready -> ready on AgentMessagesLoadFailed) (ready -> ready on AgentMessageSaveFailed))
19954
- emits : (THREAD_FAILED CONVERSE AgentMessagesLoaded AgentMessagesLoadFailed AgentConversationLoaded AgentMessageSaved AgentMessageSaveFailed)
19979
+ events : (INIT OPEN_CHAT SEND_IN_CHAT AgentMessageSaved AgentConversationLoaded REPLY_IN_CHAT AgentMessagesLoadFailed AgentMessageSaveFailed ASSISTANT_THREAD_FAILED CONVERSE AgentMessagesLoaded)
19980
+ transitions : ((ready -> ready on INIT) (ready -> ready on OPEN_CHAT) (ready -> ready on OPEN_CHAT) (ready -> ready on SEND_IN_CHAT) (ready -> ready on AgentMessageSaved) (ready -> ready on AgentConversationLoaded) (ready -> ready on REPLY_IN_CHAT) (ready -> ready on AgentMessagesLoadFailed) (ready -> ready on AgentMessageSaveFailed))
19981
+ emits : (ASSISTANT_THREAD_FAILED CONVERSE AgentMessagesLoaded AgentMessagesLoadFailed AgentConversationLoaded AgentMessageSaved AgentMessageSaveFailed)
19955
19982
  override-surface : (linkedEntity name events effects listens emitsScope config)
19956
19983
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[0].traits[0])"
19957
19984
  }
@@ -19987,9 +20014,9 @@ trait std-agent-tool-loop.traits.AgentToolLoop {
19987
20014
  linkedEntity : AgentTurn
19988
20015
  category : interaction
19989
20016
  states : (idle* thinking)
19990
- events : (INIT CONVERSE ANSWERED ASK_FAILED STEP REPLIED REPLY_FAILED)
20017
+ events : (INIT CONVERSE ANSWERED ASK_FAILED ASSISTANT_STEP ASSISTANT_REPLIED ASSISTANT_REPLY_FAILED)
19991
20018
  transitions : ((idle -> idle on INIT) (idle -> thinking on CONVERSE) (thinking -> idle on ANSWERED) (thinking -> idle on ASK_FAILED))
19992
- emits : (STEP REPLIED REPLY_FAILED ANSWERED ASK_FAILED)
20019
+ emits : (ASSISTANT_STEP ASSISTANT_REPLIED ASSISTANT_REPLY_FAILED ANSWERED ASK_FAILED)
19993
20020
  config {
19994
20021
  instructions : string = "You operate this app for the signed-in user. Use the tools to act and to look things up; when a tool reports that something was refused or denied, say so plainly." @label "How should the assistant behave?" @description "Standing instructions sent with every conversation." @synonyms "system prompt, persona, guidance" @tier "domain"
19995
20022
  maxSteps : number = 8 @label "Model round-trips per request" @description "How many model calls one request may take before it fails." @tier "policy"
@@ -20238,6 +20265,7 @@ trait std-billable-hour.traits.BillableHourTimesheet {
20238
20265
  columns : [ColumnSpec] = [{"align":"left","field":"workerName","header":"Worker","key":"workerName","width":"minmax(8rem, 1fr)"},{"align":"left","field":"matterId","header":"Matter","key":"matterId","width":"8rem"},{"align":"left","field":"workDate","format":"date","header":"Date","key":"workDate","width":"8rem"},{"align":"right","field":"hours","format":"number","header":"Hours","key":"hours","width":"6rem"},{"align":"right","field":"rate","format":"currency","header":"Rate","key":"rate","width":"7rem"},{"align":"center","field":"invoiceStatus","format":"badge","header":"Status","key":"invoiceStatus","width":"8rem"}] @label "Table columns" @description "ColumnSpec list for the dense hours ledger table." @tier "presentation"
20239
20266
  invoiceRoles : [string] = [] @label "Roles that can invoice" @description "Roles (matched against viewerRole) that see the Invoice button. Empty = everyone." @tier "policy"
20240
20267
  itemActions : [ItemAction] = [{"event":"OPEN_HOURS","icon":"arrow-right","label":"Open","variant":"ghost"},{"event":"WRITE_OFF_HOURS","label":"Write Off","variant":"danger"}] @label "Row actions" @description "Per-row actions rendered by the hours table." @tier "presentation"
20268
+ showHeader : boolean = true @label "Show the list's own title row?" @description "Off when the page already carries a page header naming the same thing, so the page shows one title." @tier "presentation"
20241
20269
  statLook : string = "elevated" @label "Stat display look" @description "Layer 2 visual treatment for stat / KPI cards." @tier "presentation" @values (elevated flat progress-backed gauge sparkline)
20242
20270
  tableLook : string = "dense" @label "Table look" @description "Layer 2 visual treatment for the data table rendered by this atom." @tier "presentation" @values (dense spacious striped borderless bordered)
20243
20271
  title : string = "Time Entries" @label "Section title" @description "Heading shown above the time-entries list" @tier "presentation"
@@ -20258,8 +20286,9 @@ trait std-board.traits.BoardItemBoard {
20258
20286
  transitions : ((loading -> loading on INIT) (loading -> viewing_board on BoardItemsLoaded) (loading -> error on BoardItemsLoadFailed) (loading -> loading on BoardItemsSaved) (loading -> loading on BoardItemDeleted) (loading -> error on BoardItemsSaveFailed) (viewing_board -> loading on INIT) (viewing_board -> viewing_card on OPEN_CARD) (viewing_board -> adding on ADD_CARD) (viewing_board -> viewing_board on MOVE_CARD) (viewing_board -> viewing_board on REORDER_CARD) (viewing_board -> viewing_board on REORDER_POSITION) (viewing_board -> viewing_board on BoardItemsSaved) (viewing_board -> viewing_board on REFETCH_QUERY) (viewing_board -> viewing_board on REFETCH_FILTER) (viewing_board -> viewing_board on REFETCH_PAGE) (viewing_board -> viewing_board on BoardItemsLoaded) (viewing_board -> viewing_board on BoardItemsSaveFailed) (viewing_board -> viewing_board on BoardItemsLoadFailed) (viewing_card -> loading on CLOSE_CARD) (viewing_card -> loading on MOVE_CARD) (viewing_card -> loading on DELETE_CARD) (adding -> loading on SAVE_CARD) (adding -> viewing_board on CANCEL_ADD) (error -> loading on INIT))
20259
20287
  emits : (OPEN_CARD CLOSE_CARD ADD_CARD CANCEL_ADD SAVE_CARD MOVE_CARD REORDER_CARD DELETE_CARD EDIT_CARD BoardItemsLoaded BoardItemsLoadFailed BoardItemsSaved BoardItemDeleted BoardItemsSaveFailed)
20260
20288
  config {
20289
+ addPlacement : string = "floating" @label "Add button placement" @description "Where the add-item button sits: 'floating' (default) pins a floating action button to the screen corner; 'inline' renders an ordinary Add button above the columns, for a board embedded in a card or panel." @synonyms "add button position, floating add, inline add, add item button placement. user phrases: 'put the add button inside the board' / 'no floating button' -> inline" @tier "presentation" @values (floating inline)
20261
20290
  boardLook : string = "columns" @label "Board look" @description "Layer 3 body layout: default N-column data-grid ('columns'), or a Trello-style wide-column kanban with sticky column headers ('kanban-classic')." @tier "presentation" @values (columns kanban-classic)
20262
- bodyContent : render-ui = {"children":[["if","@config.showHeader",{"children":[{"align":"center","children":[{"name":"kanban-square","size":"lg","type":"icon"},{"content":"@config.title","type":"typography","variant":"h3"}],"direction":"horizontal","gap":"sm","type":"stack"},{"type":"divider"}],"direction":"vertical","gap":"md","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BoardView","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"cols":"@config.gridCols","dndRoot":true,"entity":"@entity.boards","fields":[],"gap":"md","renderItem":["fn","col",{"children":[{"children":[{"align":"center","children":[{"name":"@col.icon","type":"icon"},{"content":"@col.label","type":"typography","variant":"h4"},{"label":"@col.count","type":"badge","variant":"@col.variant"}],"direction":"horizontal","gap":"xs","type":"stack"},{"accepts":"*","dragGroup":"@col.key","dropEvent":"MOVE_CARD","entity":"@col.items","fields":[],"gap":"sm","positionEvent":"REORDER_POSITION","renderItem":["fn","item",{"children":[{"children":[{"content":"@config.cardTitleBinding","type":"typography","variant":"h4"},{"color":"muted","content":"@config.cardDescriptionBinding","type":"typography","variant":"caption"},{"align":"center","children":[{"action":"OPEN_CARD","actionPayload":{"description":"@config.cardDescriptionBinding","id":"@config.cardIdBinding","notes":"@config.cardNotesBinding","row":"@item","stage":"@config.cardStageBinding","title":"@config.cardTitleBinding"},"icon":"arrow-right","label":"Open","type":"button","variant":"ghost"}],"direction":"horizontal","gap":"xs","type":"stack"}],"direction":"vertical","gap":"xs","type":"stack"}],"look":"@config.cardLook","type":"card"}],"reorderEvent":"REORDER_CARD","sortable":true,"type":"data-list"}],"direction":"vertical","gap":"sm","type":"stack"}],"look":"@config.cardLook","type":"card"}],"type":"data-grid"},{"action":"ADD_CARD","icon":"plus","label":"Add item","type":"floating-action-button","variant":"primary"}],"direction":"vertical","gap":"md","type":"stack"} @label "Body content tree" @description "Render-ui SExpr rendered after the board loads for boardLook='columns' — the canonical column data-grid with nested per-column data-lists. boardLook='kanban-classic' renders kanbanClassicBodyContent instead; both share this trait's state machine, emits, and listens." @tier "internal"
20291
+ bodyContent : render-ui = {"children":[["if",["=","@config.addPlacement","inline"],{"children":[{"action":"ADD_CARD","icon":"plus","label":"Add item","size":"sm","type":"button","variant":"secondary"}],"direction":"horizontal","gap":"sm","justify":"end","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if","@config.showHeader",{"children":[{"align":"center","children":[{"name":"kanban-square","size":"lg","type":"icon"},{"content":"@config.title","type":"typography","variant":"h3"}],"direction":"horizontal","gap":"sm","type":"stack"},{"type":"divider"}],"direction":"vertical","gap":"md","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BoardView","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"cols":"@config.gridCols","dndRoot":true,"entity":"@entity.boards","fields":[],"gap":"md","renderItem":["fn","col",{"children":[{"children":[{"align":"center","children":[{"name":"@col.icon","type":"icon"},{"content":"@col.label","type":"typography","variant":"h4"},{"label":"@col.count","type":"badge","variant":"@col.variant"}],"direction":"horizontal","gap":"xs","type":"stack"},{"accepts":"*","dragGroup":"@col.key","dropEvent":"MOVE_CARD","entity":"@col.items","fields":[],"gap":"sm","positionEvent":"REORDER_POSITION","renderItem":["fn","item",{"children":[{"children":[{"content":"@config.cardTitleBinding","type":"typography","variant":"h4"},{"color":"muted","content":"@config.cardDescriptionBinding","type":"typography","variant":"caption"},{"align":"center","children":[{"action":"OPEN_CARD","actionPayload":{"description":"@config.cardDescriptionBinding","id":"@config.cardIdBinding","notes":"@config.cardNotesBinding","row":"@item","stage":"@config.cardStageBinding","title":"@config.cardTitleBinding"},"icon":"arrow-right","label":"Open","type":"button","variant":"ghost"}],"direction":"horizontal","gap":"xs","type":"stack"}],"direction":"vertical","gap":"xs","type":"stack"}],"look":"@config.cardLook","type":"card"}],"reorderEvent":"REORDER_CARD","sortable":true,"type":"data-list"}],"direction":"vertical","gap":"sm","type":"stack"}],"look":"@config.cardLook","type":"card"}],"type":"data-grid"},["if",["=","@config.addPlacement","floating"],{"action":"ADD_CARD","icon":"plus","label":"Add item","type":"floating-action-button","variant":"primary"},{"children":[],"gap":"none","type":"stack"}]],"direction":"vertical","gap":"md","type":"stack"} @label "Body content tree" @description "Render-ui SExpr rendered after the board loads for boardLook='columns' — the canonical column data-grid with nested per-column data-lists. boardLook='kanban-classic' renders kanbanClassicBodyContent instead; both share this trait's state machine, emits, and listens." @tier "internal"
20263
20292
  bodySearch : boolean = false @label "Show the board's own search box?" @description "Renders an inline search box above the columns. Defaults false: unlike std-browse, std-board has never had a search box, so defaulting this true would silently add one to every existing consumer. The wired path — composing std-search beside the board and routing its FILTER/SEARCH event to REFETCH_QUERY — works regardless of this knob; set true only for a standalone board with no page-level search affordance." @synonyms "inline search, board search, built-in search, show search, duplicate search" @tier "presentation"
20264
20293
  cardActions : [ItemAction] = [{"event":"DELETE_CARD","icon":"trash-2","label":"Delete","variant":"danger"}] @label "Card panel action list" @description "Buttons on the open-card panel's actions row, built by the default cardActionsContent. Give an item `roles` to show it only to those viewer roles." @tier "presentation"
20265
20294
  cardActionsContent : render-ui = {"align":"center","children":["array/map",["array/filter","@config.cardActions",["fn","action",["or",["=",["array/len",["object/get","@action","roles",[]]],0],["array/includes",["object/get","@action","roles",[]],"@config.viewerRole"]]]],["fn","a",{"action":"@a.event","actionPayload":{"id":"@entity.currentId"},"icon":"@a.icon","label":"@a.label","type":"button","variant":"@a.variant"}]],"direction":"horizontal","gap":"sm","type":"stack"} @label "Card panel actions" @description "Actions row of the open-card panel. Default is the Delete button only. Override to add consumer-wired actions — e.g. an Edit button with action: EDIT_CARD and actionPayload: { id: @entity.currentId, row: @entity.currentRow }, listened to by the organism's edit modal. Never leave a button here without a listener." @tier "presentation"
@@ -20276,7 +20305,7 @@ trait std-board.traits.BoardItemBoard {
20276
20305
  gridCols : number = 3 @label "Grid columns" @description "Outer grid column count before the board wraps" @tier "presentation"
20277
20306
  groupByField : string = "stage" @label "Group-by field" @description "Entity field whose value matches a column key — items are filtered into columns by it. Default 'stage'; set to 'status' (or any field) for entities that track state under a different name." @tier "presentation"
20278
20307
  include : [string] = [] @label "Which relation fields to hydrate?" @description "Entity relation field names to hydrate on fetch (e.g. an `assignee : TeamMember` field named `assignee`), so card bindings can use dot-paths like @item.assignee.name. Empty = no hydration, the default." @synonyms "relation hydration, populate relations, joined fields, hydrate relations" @tier "domain"
20279
- kanbanClassicBodyContent : render-ui = {"children":[["if","@config.showHeader",{"children":[{"align":"center","children":[{"name":"kanban-square","size":"xl","type":"icon"},{"content":"@config.title","type":"typography","variant":"h2"}],"className":"px-card-md","direction":"horizontal","gap":"sm","type":"stack"},{"type":"divider"}],"direction":"vertical","gap":"md","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"px-card-md","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BoardView","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"px-card-md","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"className":"w-full pb-2","dndRoot":true,"entity":"@entity.boards","fields":[],"gap":"lg","minCardWidth":300,"renderItem":["fn","col",{"children":[{"children":[{"align":"center","children":[{"name":"@col.icon","type":"icon"},{"className":"flex-1","content":"@col.label","type":"typography","variant":"h4"},{"label":"@col.count","size":"sm","type":"badge","variant":"primary"}],"className":"p-card-md border-b border-[var(--color-border)] sticky top-0 bg-[var(--color-surface)]","direction":"horizontal","gap":"sm","type":"stack"},{"accepts":"*","className":"p-card-md min-h-[120px]","dragGroup":"@col.key","dropEvent":"MOVE_CARD","entity":"@col.items","fields":[],"gap":"sm","positionEvent":"REORDER_POSITION","renderItem":["fn","item",{"children":[{"children":[{"content":"@config.cardTitleBinding","type":"typography","variant":"body","weight":"medium"},{"className":"line-clamp-2","color":"muted","content":"@config.cardDescriptionBinding","type":"typography","variant":"caption"},{"align":"center","children":[{"label":"@config.cardStageBinding","size":"sm","type":"badge","variant":"@col.variant"},{"action":"OPEN_CARD","actionPayload":{"description":"@config.cardDescriptionBinding","id":"@config.cardIdBinding","notes":"@config.cardNotesBinding","row":"@item","stage":"@config.cardStageBinding","title":"@config.cardTitleBinding"},"className":"ml-auto","icon":"arrow-right","label":"Open","size":"sm","type":"button","variant":"ghost"}],"className":"pt-1","direction":"horizontal","gap":"xs","type":"stack"}],"direction":"vertical","gap":"xs","type":"stack"}],"className":"cursor-grab hover:shadow-lg transition-shadow","look":"@config.cardLook","padding":"sm","type":"card"}],"reorderEvent":"REORDER_CARD","sortable":true,"type":"data-list"}],"direction":"vertical","gap":"none","type":"stack"}],"className":"w-[300px] bg-[var(--color-surface-subtle)] rounded-lg overflow-hidden","look":"elevated","padding":"none","type":"card"}],"scrollX":true,"type":"data-grid"},{"action":"ADD_CARD","icon":"plus","label":"Add card","type":"floating-action-button","variant":"primary"}],"className":"h-full","direction":"vertical","gap":"md","type":"stack"} @label "Kanban classic body content tree" @description "Render-ui SExpr for boardLook='kanban-classic' — Trello-style wide elevated columns with sticky headers, dense cards with a status badge; per-item cards honor config.cardLook (the column wrapper stays elevated — it is column chrome, not a card)." @tier "internal"
20308
+ kanbanClassicBodyContent : render-ui = {"children":[["if",["=","@config.addPlacement","inline"],{"children":[{"action":"ADD_CARD","icon":"plus","label":"Add card","size":"sm","type":"button","variant":"secondary"}],"direction":"horizontal","gap":"sm","justify":"end","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if","@config.showHeader",{"children":[{"align":"center","children":[{"name":"kanban-square","size":"xl","type":"icon"},{"content":"@config.title","type":"typography","variant":"h2"}],"className":"px-card-md","direction":"horizontal","gap":"sm","type":"stack"},{"type":"divider"}],"direction":"vertical","gap":"md","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"px-card-md","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BoardView","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"px-card-md","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"className":"w-full pb-2","dndRoot":true,"entity":"@entity.boards","fields":[],"gap":"lg","minCardWidth":300,"renderItem":["fn","col",{"children":[{"children":[{"align":"center","children":[{"name":"@col.icon","type":"icon"},{"className":"flex-1","content":"@col.label","type":"typography","variant":"h4"},{"label":"@col.count","size":"sm","type":"badge","variant":"primary"}],"className":"p-card-md border-b border-[var(--color-border)] sticky top-0 bg-[var(--color-surface)]","direction":"horizontal","gap":"sm","type":"stack"},{"accepts":"*","className":"p-card-md min-h-[120px]","dragGroup":"@col.key","dropEvent":"MOVE_CARD","entity":"@col.items","fields":[],"gap":"sm","positionEvent":"REORDER_POSITION","renderItem":["fn","item",{"children":[{"children":[{"content":"@config.cardTitleBinding","type":"typography","variant":"body","weight":"medium"},{"className":"line-clamp-2","color":"muted","content":"@config.cardDescriptionBinding","type":"typography","variant":"caption"},{"align":"center","children":[{"label":"@config.cardStageBinding","size":"sm","type":"badge","variant":"@col.variant"},{"action":"OPEN_CARD","actionPayload":{"description":"@config.cardDescriptionBinding","id":"@config.cardIdBinding","notes":"@config.cardNotesBinding","row":"@item","stage":"@config.cardStageBinding","title":"@config.cardTitleBinding"},"className":"ml-auto","icon":"arrow-right","label":"Open","size":"sm","type":"button","variant":"ghost"}],"className":"pt-1","direction":"horizontal","gap":"xs","type":"stack"}],"direction":"vertical","gap":"xs","type":"stack"}],"className":"cursor-grab hover:shadow-lg transition-shadow","look":"@config.cardLook","padding":"sm","type":"card"}],"reorderEvent":"REORDER_CARD","sortable":true,"type":"data-list"}],"direction":"vertical","gap":"none","type":"stack"}],"className":"w-[300px] bg-[var(--color-surface-subtle)] rounded-lg overflow-hidden","look":"elevated","padding":"none","type":"card"}],"scrollX":true,"type":"data-grid"},["if",["=","@config.addPlacement","floating"],{"action":"ADD_CARD","icon":"plus","label":"Add card","type":"floating-action-button","variant":"primary"},{"children":[],"gap":"none","type":"stack"}]],"className":"h-full","direction":"vertical","gap":"md","type":"stack"} @label "Kanban classic body content tree" @description "Render-ui SExpr for boardLook='kanban-classic' — Trello-style wide elevated columns with sticky headers, dense cards with a status badge; per-item cards honor config.cardLook (the column wrapper stays elevated — it is column chrome, not a card)." @tier "internal"
20280
20309
  pageSize : number = 10 @label "Fetch page size" @description "Records fetched per REFETCH_PAGE request. std-board renders no pagination control itself — this only feeds the fetch limit/offset when a consumer wires a composed std-pagination to REFETCH_PAGE." @synonyms "fetch limit, records per page, batch size, page limit" @tier "presentation"
20281
20310
  searchField : string = "title" @label "Which column does the search box match against?" @description "Name the field on this entity the search box's str/includes filter matches against. Declared, never inferred: an entity with no `title` column must set this to a real field (e.g. name, summary) or the search box can never match a card." @synonyms "search column, search on field, match field, search key" @tier "policy"
20282
20311
  searchPlaceholder : string = "Search…" @label "Search box placeholder text" @description "Hint text inside the board's embedded search box (e.g. 'Search cards…'). Only shown when bodySearch is true." @synonyms "search hint, placeholder, search box text, search label" @tier "presentation"
@@ -20326,16 +20355,12 @@ trait std-browse.traits.BrowseItemBrowse {
20326
20355
  transitions : ((loading -> loading on INIT) (loading -> browsing on BrowseItemLoaded) (loading -> error on BrowseItemLoadFailed) (browsing -> loading on INIT) (browsing -> browsing on REFETCH_QUERY) (browsing -> browsing on REFETCH_FILTER) (browsing -> browsing on REFETCH_PAGE) (browsing -> browsing on VIEW) (browsing -> browsing on CLOSE) (browsing -> browsing on BrowseItemLoaded) (browsing -> browsing on BrowseItemLoadFailed) (error -> loading on INIT))
20327
20356
  emits : (BrowseItemLoaded BrowseItemLoadFailed VIEW EDIT DELETE)
20328
20357
  config {
20329
- avatarBinding : string = "@item.name" @label "Avatar name binding" @description "Binding path whose value names the leading avatar when feedLeading = avatar (e.g. @item.authorName) — the person, not the post title." @tier "internal"
20330
- badgeBinding : string = "@item.status" @label "Badge field binding" @description "Binding path for the status/badge slot." @tier "internal"
20331
- bodyContent : render-ui = {"children":[["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"cols":"@config.cols","emptyDescription":"@config.emptyDescription","emptyIcon":"@config.emptyIcon","emptyTitle":"@config.emptyTitle","entity":"@payload.data","fields":"@config.fields","gap":"@config.gap","imageField":"@config.imageField","itemActions":["array/filter","@config.itemActions",["fn","item",["or",["=",["array/len",["object/get","@item","roles",[]]],0],["array/includes",["object/get","@item","roles",[]],"@config.viewerRole"]]]],"itemClickEvent":"@config.itemClickEvent","maxInlineActions":"@config.maxInlineActions","pageSize":"@config.displayPageSize","type":"data-grid"}],"direction":"vertical","gap":"md","type":"stack"} @label "Body content tree" @description "Render-ui SExpr rendered after rows load when browseLook = table (the default). Toolbar (search when bodySearch, filter bar when filters is non-empty) above the canonical data-grid call. Until 2026-08-27 this was the only one of the six looks with no search affordance at all. See denseBodyContent/feedBodyContent/galleryBodyContent for the other browseLook bodies; any may be overridden directly while inheriting the same trait, state machine, emits, and listens. Inlined directly (not via a composed sibling trait) 2026-09-08 — a separately-listening DataGrid1 sibling fired unconditionally on every BrowseItemLoaded regardless of browseLook, racing the correct body for slot main (a listens guard can't gate this: both the Rust interpreter and the TS codegen path restrict a listens guard's context to @payload only, so a browseLook config check there always evaluates undefined)."
20358
+ bodyContent : render-ui = {"children":[["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"cols":"@config.cols","emptyDescription":"@config.emptyDescription","emptyIcon":"@config.emptyIcon","emptyTitle":"@config.emptyTitle","entity":"@payload.data","fields":"@config.fields","gap":"@config.gap","imageField":"@config.imageField","itemActions":["array/filter","@config.itemActions",["fn","item",["or",["=",["array/len",["object/get","@item","roles",[]]],0],["array/includes",["object/get","@item","roles",[]],"@config.viewerRole"]]]],"itemClickEvent":"@config.itemClickEvent","maxInlineActions":"@config.maxInlineActions","pageSize":"@config.displayPageSize","surface":"@config.surface","type":"data-grid"}],"direction":"vertical","gap":"md","type":"stack"} @label "Body content tree" @description "Render-ui SExpr rendered after rows load when browseLook = table (the default). Toolbar (search when bodySearch, filter bar when filters is non-empty) above the canonical data-grid call. Until 2026-08-27 this was the only one of the six looks with no search affordance at all. See denseBodyContent/feedBodyContent/galleryBodyContent for the other browseLook bodies; any may be overridden directly while inheriting the same trait, state machine, emits, and listens. Inlined directly (not via a composed sibling trait) 2026-09-08 — a separately-listening DataGrid1 sibling fired unconditionally on every BrowseItemLoaded regardless of browseLook, racing the correct body for slot main (a listens guard can't gate this: both the Rust interpreter and the TS codegen path restrict a listens guard's context to @payload only, so a browseLook config check there always evaluates undefined)."
20332
20359
  bodySearch : boolean = true @label "Show the list's own search box?" @description "The dense/feed/gallery looks embed their own search box above the rows. Set false when the page already provides a search affordance (a toolbar Search molecule), so the surface shows one search box instead of two." @synonyms "inline search, list search, built-in search, show search, duplicate search" @tier "presentation"
20333
20360
  browseLook : string = "table" @label "Browse look" @description "Layer 2 visual treatment for the whole browse surface. table = the default data-grid (bodyContent); dense = spreadsheet-style table with toolbar search (denseBodyContent); feed = chronological card stream (feedBodyContent); gallery = image-first responsive card grid (galleryBodyContent); master-detail = record-work split view — dense list left, clicked record's detail right (masterDetailBodyContent); triage = inbox-register compact rows for queue work (triageBodyContent). Selecting a non-table look swaps which body tree renders after rows load; any body may still be overridden directly at the call site for a one-off layout." @tier "presentation" @values (table dense feed gallery master-detail triage)
20334
- categoryBinding : string = "@item.category" @label "Category field binding" @description "Binding path for the category/tag slot." @tier "internal"
20335
20361
  cols : number = 1 @label "How many columns in the grid?" @description "Number of columns in the responsive card/grid layout." @synonyms "columns, grid width, card columns, num columns" @tier "presentation"
20336
20362
  columns : [ColumnSpec] = [{"align":"left","field":"name","header":"Name","key":"name","weight":"medium"},{"align":"left","field":"description","header":"Detail","key":"description"},{"align":"center","field":"status","format":"badge","header":"Status","key":"status"}] @label "Table columns" @description "Column definitions for table-style variants (dense). Each maps an entity field to a column with optional width / align / weight / format." @tier "presentation"
20337
- denseBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"children":[{"columns":"@config.columns","emptyDescription":"@config.emptyDescription","emptyIcon":"@config.emptyIcon","emptyTitle":"@config.emptyTitle","entity":"@payload.data","itemActions":["array/filter","@config.itemActions",["fn","item",["or",["=",["array/len",["object/get","@item","roles",[]]],0],["array/includes",["object/get","@item","roles",[]],"@config.viewerRole"]]]],"itemClickEvent":"@config.itemClickEvent","look":"dense","maxInlineActions":"@config.maxInlineActions","pageSize":"@config.displayPageSize","selectable":"@config.selectable","type":"table-view"}],"className":"overflow-x-auto","direction":"vertical","gap":"none","type":"stack"}],"className":"rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] shadow-sm overflow-hidden","direction":"vertical","gap":"none","type":"stack"} @label "Dense look body" @description "Render-ui SExpr rendered after rows load when browseLook = dense. Spreadsheet-style sticky-header data-table with a search bar; composes columns/itemActions/maxInlineActions/displayPageSize/searchPlaceholder. Folded from std-browse-dense (Phase 5.B). Inlined directly (not via a composed sibling trait) 2026-09-08 — see the table-default body's note for why." @tier "internal"
20338
- descriptionBinding : string = "@item.description" @label "Description field binding" @description "Binding path for the card body/subtitle slot." @tier "internal"
20363
+ denseBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"children":[{"columns":"@config.columns","emptyDescription":"@config.emptyDescription","emptyIcon":"@config.emptyIcon","emptyTitle":"@config.emptyTitle","entity":"@payload.data","itemActions":["array/filter","@config.itemActions",["fn","item",["or",["=",["array/len",["object/get","@item","roles",[]]],0],["array/includes",["object/get","@item","roles",[]],"@config.viewerRole"]]]],"itemClickEvent":"@config.itemClickEvent","look":"dense","maxInlineActions":"@config.maxInlineActions","pageSize":"@config.displayPageSize","selectable":"@config.selectable","surface":"none","type":"table-view"}],"className":"overflow-x-auto","direction":"vertical","gap":"none","type":"stack"}],"className":["if",["=","@config.surface","auto"],"surface-content overflow-hidden",""],"direction":"vertical","gap":"none","type":"stack"} @label "Dense look body" @description "Render-ui SExpr rendered after rows load when browseLook = dense. Spreadsheet-style sticky-header data-table with a search bar; composes columns/itemActions/maxInlineActions/displayPageSize/searchPlaceholder. Folded from std-browse-dense (Phase 5.B). Inlined directly (not via a composed sibling trait) 2026-09-08 — see the table-default body's note for why." @tier "internal"
20339
20364
  detailActions : [BrowseDetailAction] = [{"event":"CLOSE","label":"Close"}] @label "Master-detail record pane actions" @description "Action buttons on the master-detail record pane (detail-panel `actions` descriptors: label/event/icon/variant). Consumers add their own record actions (Edit/Delete/…) alongside or instead of Close." @synonyms "record actions, detail actions, pane actions" @tier "presentation"
20340
20365
  detailCloseEvent : event = "CLOSE" @label "Which pane action closes the record?" @description "The detailActions entry whose event matches renders as the pane's close (×) button." @synonyms "close event, dismiss event, pane close" @tier "presentation"
20341
20366
  detailFields : [FieldSpec] = [{"label":"Name","name":"name","variant":"h4"},{"label":"Description","name":"description","variant":"body"},{"label":"Status","name":"status","variant":"badge"},{"format":"date","label":"Created","name":"createdAt"}] @label "Which fields appear in the master-detail record pane?" @description "Fields shown in the detail panel when browseLook = master-detail; the field declared variant h3/h4 is the pane title. Consumers overriding columns/fields should override this list to match their entity." @synonyms "detail columns, record fields, detail pane fields" @tier "presentation"
@@ -20343,17 +20368,12 @@ trait std-browse.traits.BrowseItemBrowse {
20343
20368
  emptyDescription : string = "" @label "Empty-state description" @description "What will appear here once rows exist." @synonyms "empty text, no data message, empty hint" @tier "presentation"
20344
20369
  emptyIcon : icon = "inbox" @label "Empty-state icon" @description "Domain icon shown when there are no rows." @synonyms "empty icon, no data icon" @tier "presentation"
20345
20370
  emptyTitle : string = "" @label "Empty-state title" @description "Specific title shown when there are no rows (\"No orders yet\"). Left blank, a generic line shows." @synonyms "empty title, no data title, empty heading" @tier "presentation"
20346
- feedBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"align":"center","children":[{"className":"w-full","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"w-full","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"w-full","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"emptyDescription":"@config.emptyDescription","emptyIcon":"@config.emptyIcon","emptyTitle":"@config.emptyTitle","entity":"@payload.data","fields":[],"gap":["if",["=","@config.feedSurface","cards"],"md","none"],"itemActions":["array/filter","@config.itemActions",["fn","item",["or",["=",["array/len",["object/get","@item","roles",[]]],0],["array/includes",["object/get","@item","roles",[]],"@config.viewerRole"]]]],"itemClickEvent":"@config.itemClickEvent","renderItem":["fn","item",{"align":"start","children":[["if",["=","@config.feedLeading","avatar"],{"className":"flex-shrink-0","name":"@config.avatarBinding","size":"md","type":"avatar"},["if",["=","@config.feedLeading","icon"],{"align":"center","children":[{"color":"primary","name":"@config.feedIcon","size":"md","type":"icon"}],"className":"flex-shrink-0 w-10 h-10 rounded-container bg-primary/10","direction":"horizontal","gap":"none","justify":"center","type":"stack"},{"children":[],"className":"hidden","gap":"none","type":"stack"}]],{"children":[["if",["=","@config.feedCategoryLook","eyebrow"],{"color":"primary","content":"@config.categoryBinding","type":"typography","variant":"overline"},{"children":[],"className":"hidden","gap":"none","type":"stack"}],{"align":"center","children":[{"className":"min-w-0","content":"@config.titleBinding","type":"typography","variant":"@config.feedTitleVariant","weight":"semibold"},["if",["=","@config.feedCategoryLook","badge"],{"label":"@config.categoryBinding","size":"sm","type":"badge","variant":"neutral"},{"children":[],"className":"hidden","gap":"none","type":"stack"}]],"className":"flex-wrap","direction":"horizontal","gap":"sm","type":"stack"},{"className":"text-[var(--color-muted-foreground)] whitespace-pre-wrap break-words leading-relaxed","content":"@config.descriptionBinding","type":"typography","variant":"body"},{"align":"center","children":[{"color":"muted","content":"@config.metaBinding","format":"@config.metaFormat","type":"typography","variant":"caption"},["if","@config.feedShowBadge",{"label":"@config.badgeBinding","size":"sm","type":"badge","variant":"default"},{"children":[],"className":"hidden","gap":"none","type":"stack"}]],"className":"pt-1","direction":"horizontal","gap":"sm","justify":"between","type":"stack"}],"className":"flex-1 min-w-0","direction":"vertical","gap":"xs","type":"stack"}],"className":["if",["=","@config.feedSurface","cards"],"p-card-md rounded-container bg-[var(--color-card)] border border-[var(--color-border)] shadow-elevation-card transition-all duration-normal hover:border-[var(--color-border-strong)] hover:shadow-elevation-popover",["if",["=","@config.feedSurface","divided"],"px-card-md py-card-sm transition-colors duration-fast hover:bg-[var(--color-muted)]/60","py-card-sm border-b border-[var(--color-border)]"]],"direction":"horizontal","gap":"md","type":"stack"}],"type":"data-list","variant":["if",["=","@config.feedSurface","divided"],"card","default"]}],"className":"w-full","direction":"vertical","gap":"lg","type":"stack"} @label "Feed look body" @description "Render-ui SExpr rendered after rows load when browseLook = feed. Chronological item stream: optional leading avatar/icon, category eyebrow or badge, title, body, meta + status badge; composes titleBinding/descriptionBinding/categoryBinding/badgeBinding/metaBinding/avatarBinding plus the feedSurface/feedLeading/feedIcon/feedTitleVariant/feedCategoryLook/feedShowBadge anatomy knobs. Folded from std-browse-feed (Phase 5.B)." @tier "internal"
20347
- feedCategoryLook : string = "badge" @label "How is the category shown?" @description "browseLook = feed only. badge = a pill beside the title; eyebrow = a small overline above the title (editorial sections); none = hidden." @synonyms "category pill, kicker, section label, overline, tag display" @tier "presentation" @values (badge eyebrow none)
20348
- feedIcon : icon = "file-text" @label "Which icon leads each feed item?" @description "Icon shown in the leading tile when feedLeading = icon." @synonyms "item icon, row icon, leading icon" @tier "presentation"
20349
- feedLeading : string = "avatar" @label "What leads each feed item?" @description "browseLook = feed only. avatar = initials of avatarBinding (people-authored posts, messages); icon = feedIcon in a tinted tile (articles, docs, tickets); none = text starts flush (editorial)." @synonyms "leading avatar, item icon, thumbnail, no avatar" @tier "presentation" @values (avatar icon none)
20350
- feedShowBadge : boolean = true @label "Show the status badge?" @description "browseLook = feed only. Shows badgeBinding at the end of each item's meta line. Turn off on public surfaces where the status (e.g. published) is internal noise." @synonyms "status pill, hide status, show state" @tier "presentation"
20351
- feedSurface : string = "cards" @label "How are feed items separated?" @description "browseLook = feed only. cards = each item its own raised card with space between (community posts, listings); divided = one surface with hairline rows (inboxes, answer lists, notes); plain = no chrome, rule lines on the page background (editorial article lists, changelogs)." @synonyms "feed style, item chrome, card per item, divided list, editorial list, rows or cards" @tier "presentation" @values (cards divided plain)
20352
- feedTitleVariant : string = "body" @label "How prominent is each feed title?" @description "browseLook = feed only. body for conversational streams, h4/h3 for headline-led lists such as articles." @synonyms "title size, headline size, title weight" @tier "presentation" @values (body h4 h3)
20371
+ feedBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"align":"center","children":[{"className":"w-full","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"w-full","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"w-full","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"emptyDescription":"@config.emptyDescription","emptyIcon":"@config.emptyIcon","emptyTitle":"@config.emptyTitle","entity":"@payload.data","fields":"@config.fields","gap":"none","itemActions":["array/filter","@config.itemActions",["fn","item",["or",["=",["array/len",["object/get","@item","roles",[]]],0],["array/includes",["object/get","@item","roles",[]],"@config.viewerRole"]]]],"itemClickEvent":"@config.itemClickEvent","look":["if",["=","@config.feedSurface","cards"],"card-rows","borderless"],"maxInlineActions":"@config.maxInlineActions","pageSize":"@config.displayPageSize","surface":["if",["=","@config.feedSurface","plain"],"none","@config.surface"],"type":"data-list","variant":["if",["=","@config.feedSurface","divided"],"card","default"]}],"className":"w-full","direction":"vertical","gap":"lg","type":"stack"} @label "Feed look body" @description "Render-ui SExpr rendered after rows load when browseLook = feed. Chronological item stream on the same `fields` contract every look reads (roles: overline, h3/h4, caption, small/body, badge, avatar), separated per feedSurface. Folded from std-browse-feed (Phase 5.B)." @tier "internal"
20372
+ feedSurface : string = "cards" @label "How are feed items separated?" @description "browseLook = feed only. cards = each item its own raised card with space between (community posts, listings); divided = one surface with hairline rows (inboxes, answer lists, notes); plain = no chrome, items on the page background (editorial article lists, changelogs). What each item shows comes from `fields`: overline = eyebrow above the title, h3/h4 = title (its `icon` becomes a leading tile), caption = prose, small/body = meta line, badge = pill, avatar = leading initials." @synonyms "feed style, item chrome, card per item, divided list, editorial list, rows or cards" @tier "presentation" @values (cards divided plain)
20353
20373
  fields : [FieldSpec] = [{"label":"Name","name":"name","variant":"h4"},{"label":"Description","name":"description","variant":"caption"},{"label":"Status","name":"status","variant":"badge"}] @label "Which fields should appear as columns?" @description "Each entry maps one entity field to a display column with an optional label and variant." @synonyms "visible columns, displayed fields, card fields, column list" @tier "presentation"
20354
20374
  filterBarLook : string = "toolbar" @label "Filter bar look" @description "Visual treatment for the embedded filter bar, mirroring std-filter's own enum. Only applies when `filters` is non-empty." @synonyms "filter bar style, facet style, chips, pills" @tier "presentation" @values (toolbar chips pills popover-trigger inline-column-header)
20355
20375
  filters : [FilterSpec] = [] @label "Which filters should appear above the list?" @description "Dropdown filter facets by field, rendered as an embedded filter bar above the rows; each selection fires REFETCH_FILTER on this trait. Empty (the default) = no filter bar, which is the right setting whenever the page already composes std-filter beside this list and routes `XFilter.FILTER -> REFETCH_FILTER` — that is the wired owner and remains the primary path. Use this knob only for a standalone list with no page-level filter affordance, so the surface shows one filter bar instead of two." @synonyms "filter bar, faceted filters, field filters, column filters, dropdowns" @tier "presentation"
20356
- galleryBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"align":"center","children":[{"className":"w-full","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"sticky top-0 z-10 py-3 bg-[var(--color-surface)]/95 backdrop-blur","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"w-full","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"className":"w-full","emptyDescription":"@config.emptyDescription","emptyIcon":"@config.emptyIcon","emptyTitle":"@config.emptyTitle","entity":"@payload.data","fields":"@config.fields","gap":"lg","imageField":"@config.imageField","itemActions":["array/filter","@config.itemActions",["fn","item",["or",["=",["array/len",["object/get","@item","roles",[]]],0],["array/includes",["object/get","@item","roles",[]],"@config.viewerRole"]]]],"itemClickEvent":"@config.itemClickEvent","maxInlineActions":"@config.maxInlineActions","minCardWidth":260,"type":"data-grid"}],"className":"w-full","direction":"vertical","gap":"lg","type":"stack"} @label "Gallery look body" @description "Render-ui SExpr rendered after rows load when browseLook = gallery. Image-first responsive card grid (auto-fit minCardWidth) on the data-grid fields path: imageField renders the card photo when set (falsy-safe when empty), fields drive title/badges/meta. One tree, no renderItem lambda — lambdas do not survive inside (if) arms (2026-07-27)." @tier "internal"
20376
+ galleryBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"align":"center","children":[{"className":"w-full","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"sticky top-0 z-10 py-3 bg-[var(--color-surface)]/95 backdrop-blur","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"w-full","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"className":"w-full","emptyDescription":"@config.emptyDescription","emptyIcon":"@config.emptyIcon","emptyTitle":"@config.emptyTitle","entity":"@payload.data","fields":"@config.fields","gap":"lg","imageField":"@config.imageField","itemActions":["array/filter","@config.itemActions",["fn","item",["or",["=",["array/len",["object/get","@item","roles",[]]],0],["array/includes",["object/get","@item","roles",[]],"@config.viewerRole"]]]],"itemClickEvent":"@config.itemClickEvent","maxInlineActions":"@config.maxInlineActions","minCardWidth":260,"surface":"@config.surface","type":"data-grid"}],"className":"w-full","direction":"vertical","gap":"lg","type":"stack"} @label "Gallery look body" @description "Render-ui SExpr rendered after rows load when browseLook = gallery. Image-first responsive card grid (auto-fit minCardWidth) on the data-grid fields path: imageField renders the card photo when set (falsy-safe when empty), fields drive title/badges/meta. One tree, no renderItem lambda — lambdas do not survive inside (if) arms (2026-07-27)." @tier "internal"
20357
20377
  gap : string = "md" @label "Spacing between rows" @description "Gap between grid cells: sm, md, or lg." @synonyms "row gap, cell spacing, grid gap, padding between items" @tier "presentation"
20358
20378
  imageField : string = "" @label "Which field holds the row image?" @description "Entity field containing the thumbnail URL for each row." @synonyms "image field, thumbnail field, photo field, picture column" @tier "presentation"
20359
20379
  include : [string] = [] @label "Which relation fields to hydrate?" @description "Entity relation field names to hydrate on fetch (e.g. a `tag : Category` field named `tag`), so grid columns can use dot-paths like tag.name. Empty = no hydration, the default." @synonyms "relation hydration, populate relations, joined fields, hydrate relations" @tier "internal"
@@ -20361,18 +20381,16 @@ trait std-browse.traits.BrowseItemBrowse {
20361
20381
  initialFilterValue : string = "" @label "What value does the first load filter for?" @description "The value initialFilterField must equal on the first load. Blank is meaningful: it matches only records whose field is itself blank, which for a detail pane is normally none — that is how a thread stays empty until its parent is selected." @synonyms "initial filter value, first load value, default selection" @tier "policy"
20362
20382
  itemActions : [ItemAction] = [] @label "What actions can users take on each row?" @description "Buttons rendered on each row (e.g. Edit, Delete, View)." @synonyms "row buttons, row actions, item actions, per-row buttons, table actions" @tier "presentation"
20363
20383
  itemClickEvent : event = "VIEW" @label "Which event does clicking a row fire?" @description "Row-click channel. Retarget when two browse lists coexist in one orbital and their VIEW payloads differ, so each gets its own typed channel." @synonyms "row click event, item click, open event, select event" @tier "presentation"
20364
- masterDetailBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"detail":{"children":[],"gap":"none","type":"stack"},"emptyDetail":{"description":"Select a record from the list to see its details.","icon":"mouse-pointer-click","title":"Nothing selected","type":"empty-state"},"hasSelection":false,"master":{"children":["@trait.MasterListView"],"className":"overflow-y-auto","direction":"vertical","gap":"none","type":"stack"},"type":"master-detail-layout"}],"className":"rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] shadow-sm overflow-hidden","direction":"vertical","gap":"none","type":"stack"} @label "Master-detail look body (no selection)" @description "Render-ui SExpr rendered after rows load when browseLook = master-detail: record-work split view — toolbar, dense list left, empty-state pane right until a row is opened. Opening a row renders masterDetailRecordBodyContent. The toolbar honours bodySearch and filters like every other look; it used to render its search box unconditionally, which put a second search box on any page that already composed std-search (observed in std-crm ContactOrbital)." @tier "internal"
20365
- masterDetailRecordBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"detail":{"actions":["array/filter","@config.detailActions",["fn","action",["or",["=",["array/len",["object/get","@action","roles",[]]],0],["array/includes",["object/get","@action","roles",[]],"@config.viewerRole"]]]],"closeEvent":"@config.detailCloseEvent","fields":"@config.detailFields","initialData":"@payload.row","showActions":true,"type":"detail-panel"},"hasSelection":true,"master":{"children":["@trait.MasterListView"],"className":"overflow-y-auto","direction":"vertical","gap":"none","type":"stack"},"type":"master-detail-layout"}],"className":"rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] shadow-sm overflow-hidden","direction":"vertical","gap":"none","type":"stack"} @label "Master-detail look body (record open)" @description "Render-ui SExpr rendered by the VIEW transition when browseLook = master-detail: the same split view with the clicked record's detail panel on the right, fed by the VIEW payload row and detailFields." @tier "internal"
20384
+ masterDetailBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"detail":{"children":[],"gap":"none","type":"stack"},"emptyDetail":{"description":"Select a record from the list to see its details.","icon":"mouse-pointer-click","title":"Nothing selected","type":"empty-state"},"hasSelection":false,"master":{"children":["@trait.MasterListView"],"className":"overflow-y-auto","direction":"vertical","gap":"none","type":"stack"},"type":"master-detail-layout"}],"className":["if",["=","@config.surface","auto"],"surface-content overflow-hidden",""],"direction":"vertical","gap":"none","type":"stack"} @label "Master-detail look body (no selection)" @description "Render-ui SExpr rendered after rows load when browseLook = master-detail: record-work split view — toolbar, dense list left, empty-state pane right until a row is opened. Opening a row renders masterDetailRecordBodyContent. The toolbar honours bodySearch and filters like every other look; it used to render its search box unconditionally, which put a second search box on any page that already composed std-search (observed in std-crm ContactOrbital)." @tier "internal"
20385
+ masterDetailRecordBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"detail":{"actions":["array/filter","@config.detailActions",["fn","action",["or",["=",["array/len",["object/get","@action","roles",[]]],0],["array/includes",["object/get","@action","roles",[]],"@config.viewerRole"]]]],"closeEvent":"@config.detailCloseEvent","fields":"@config.detailFields","initialData":"@payload.row","showActions":true,"surface":"none","type":"detail-panel"},"hasSelection":true,"master":{"children":["@trait.MasterListView"],"className":"overflow-y-auto","direction":"vertical","gap":"none","type":"stack"},"type":"master-detail-layout"}],"className":["if",["=","@config.surface","auto"],"surface-content overflow-hidden",""],"direction":"vertical","gap":"none","type":"stack"} @label "Master-detail look body (record open)" @description "Render-ui SExpr rendered by the VIEW transition when browseLook = master-detail: the same split view with the clicked record's detail panel on the right, fed by the VIEW payload row and detailFields." @tier "internal"
20366
20386
  maxInlineActions : number = 3 @label "How many row actions to show before collapsing?" @description "Actions beyond this count collapse into a '⋯' overflow menu. Set 2–3 for dense tables." @synonyms "inline actions limit, overflow threshold, max buttons per row" @tier "presentation"
20367
- metaBinding : string = "@item.createdAt" @label "Meta field binding" @description "Binding path for the secondary meta slot (timestamp / category). Hosts binding a count or other non-date value should label it in the binding itself (e.g. (str/concat \"Vehicles: \" @item.vehicleCount)) and set metaFormat: none." @tier "internal"
20368
- metaFormat : string = "date" @label "Meta value format" @description "Typography format for the feed meta slot — date by default so the createdAt binding renders human-readable instead of raw ISO; set none for non-date bindings." @tier "presentation" @values (none date time datetime number)
20369
20387
  pageSize : number = 10 @label "How many rows to fetch per page?" @description "Records fetched from the server per page request." @synonyms "fetch limit, records per page, batch size, page limit" @tier "presentation"
20370
20388
  scopeField : string = "" @label "Only show records owned by the signed-in user?" @description "Name the field on this entity that holds the viewer's id (e.g. memberId, patientId, assignee). When set, the list loads ONLY rows whose that field equals @user.id — the 'my bookings' / 'my appointments' shape. Left blank the list loads every row, which is the default. Declared, never inferred: guessing the column from its name would silently scope the wrong one." @synonyms "owner field, my records, only mine, only my own, scope to user, per-user list, mine only, owned by me" @tier "policy"
20371
20389
  searchField : string = "name" @label "Which column does the search box match against?" @description "Name the field on this entity the search box's str/includes filter matches against. Declared, never inferred: an entity with no `name` column must set this to a real field (e.g. title, content) or the search box can never match a row." @synonyms "search column, search on field, match field, search key" @tier "policy"
20372
20390
  searchPlaceholder : string = "Search…" @label "Search box placeholder text" @description "Hint text inside the list search box (e.g. 'Search orders…')." @synonyms "search hint, placeholder, search box text, search label" @tier "presentation"
20373
20391
  selectable : boolean = false @label "Show row selection checkboxes?" @description "Adds a checkbox column with select-all to the dense table. Enable only when the surface offers bulk actions — checkboxes with nothing to act on are a dead affordance." @synonyms "row checkboxes, multi-select, bulk select, selection column" @tier "presentation"
20374
- titleBinding : string = "@item.name" @label "Title field binding" @description "Binding path for the card title slot (e.g. @item.dishName)." @tier "internal"
20375
- triageBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"children":[{"emptyDescription":"@config.emptyDescription","emptyIcon":"@config.emptyIcon","emptyTitle":"@config.emptyTitle","entity":"@payload.data","fields":"@config.fields","itemActions":["array/filter","@config.itemActions",["fn","item",["or",["=",["array/len",["object/get","@item","roles",[]]],0],["array/includes",["object/get","@item","roles",[]],"@config.viewerRole"]]]],"itemClickEvent":"@config.itemClickEvent","maxInlineActions":"@config.maxInlineActions","type":"data-list","variant":"compact"}],"className":"overflow-x-auto","direction":"vertical","gap":"none","type":"stack"}],"className":"rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] shadow-sm overflow-hidden","direction":"vertical","gap":"none","type":"stack"} @label "Triage look body" @description "Render-ui SExpr rendered after rows load when browseLook = triage. Inbox-register queue: one surface with a toolbar search and compact list rows (title + badges + inline meta) built for keyboard-pace queue work; row actions collapse per maxInlineActions. Composes fields/itemActions/searchPlaceholder/bodySearch." @tier "internal"
20392
+ surface : string = "auto" @label "Paint a surface behind the list?" @description "auto (default) draws the theme's content surface behind every look — on a patterned page background the list reads as one block; the theme decides how that surface looks. none places the list directly on the page (e.g. a list already inside a card or panel you composed)." @synonyms "card background, panel, container, list background, no background, transparent, bare" @tier "presentation" @values (auto none)
20393
+ triageBodyContent : render-ui = {"children":[["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"BrowseItem","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"className":"px-card-md py-card-sm border-b border-[var(--color-border)]","direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"children":[{"emptyDescription":"@config.emptyDescription","emptyIcon":"@config.emptyIcon","emptyTitle":"@config.emptyTitle","entity":"@payload.data","fields":"@config.fields","itemActions":["array/filter","@config.itemActions",["fn","item",["or",["=",["array/len",["object/get","@item","roles",[]]],0],["array/includes",["object/get","@item","roles",[]],"@config.viewerRole"]]]],"itemClickEvent":"@config.itemClickEvent","maxInlineActions":"@config.maxInlineActions","pageSize":"@config.displayPageSize","surface":"none","type":"data-list","variant":"compact"}],"className":"overflow-x-auto","direction":"vertical","gap":"none","type":"stack"}],"className":["if",["=","@config.surface","auto"],"surface-content overflow-hidden",""],"direction":"vertical","gap":"none","type":"stack"} @label "Triage look body" @description "Render-ui SExpr rendered after rows load when browseLook = triage. Inbox-register queue: one surface with a toolbar search and compact list rows (title + badges + inline meta) built for keyboard-pace queue work; row actions collapse per maxInlineActions. Composes fields/itemActions/searchPlaceholder/bodySearch." @tier "internal"
20376
20394
  viewerRole : string = "" @label "Viewer's role" @description "The signed-in viewer's role that each row action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show." @tier "policy"
20377
20395
  }
20378
20396
  override-surface : (linkedEntity name events effects listens emitsScope config)
@@ -21425,28 +21443,29 @@ trait std-learn-arrangement.traits.LearnArrangementSim {
21425
21443
  category : interaction
21426
21444
  states : (idle*)
21427
21445
  events : (INIT MODE_SELECTED PLACE UNDO CHECK RETRY ARRANGEMENT_CHECKED ARRANGEMENT_RESET LEARN_ROUND_COMPLETE)
21428
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on PLACE) (idle -> idle on UNDO) (idle -> idle on CHECK) (idle -> idle on RETRY))
21446
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on PLACE) (idle -> idle on UNDO) (idle -> idle on CHECK) (idle -> idle on RETRY))
21429
21447
  emits : (ARRANGEMENT_CHECKED ARRANGEMENT_RESET LEARN_ROUND_COMPLETE)
21430
21448
  config {
21431
21449
  animate : boolean = false @label "Animate" @description "Enable continuous redraw loop." @tier "presentation"
21432
21450
  checkLabel : string = "Check" @label "Check Button Label" @tier "presentation"
21433
- correctColor : string = "#16a34a" @label "Correct Slot Color" @description "Fill color for a filled slot whose item matches its correct position, once graded." @tier "presentation"
21434
- emptySlotColor : string = "#e2e8f0" @label "Empty Slot Color" @description "Fill color for a slot with no item placed yet." @tier "presentation"
21451
+ correctColor : string = "success" @label "Correct Slot Color" @description "Fill color for a filled slot whose item matches its correct position, once graded." @tier "presentation"
21452
+ emptySlotColor : string = "fill" @label "Empty Slot Color" @description "Fill color for a slot with no item placed yet." @tier "presentation"
21435
21453
  height : number = 220 @label "Height" @description "Canvas height in pixels." @tier "presentation"
21436
- incorrectColor : string = "#dc2626" @label "Incorrect Slot Color" @description "Fill color for a filled slot whose item does not match its correct position, once graded." @tier "presentation"
21454
+ incorrectColor : string = "error" @label "Incorrect Slot Color" @description "Fill color for a filled slot whose item does not match its correct position, once graded." @tier "presentation"
21437
21455
  interactive : boolean = false @label "Interactive" @description "Enable pointer interaction on the canvas." @tier "presentation"
21438
21456
  items : [LearnArrangementItem] = [{"correctPosition":0,"hint":"What has to happen before anything can be poured?","id":"1","label":"Boil water in a kettle"},{"correctPosition":1,"hint":"The bag goes in before the water does.","id":"2","label":"Place a tea bag in the cup"},{"correctPosition":2,"hint":"Now the water and the bag meet.","id":"3","label":"Pour the hot water over the tea bag"},{"correctPosition":3,"hint":"Flavor needs time to develop.","id":"4","label":"Let it steep for a few minutes"},{"correctPosition":4,"hint":"This happens once the tea is strong enough.","id":"5","label":"Remove the tea bag and add milk or sugar to taste"}] @label "Items" @description "Roster of items to order; each carries its label, its zero-based correct position in the finished sequence, and an optional hint shown beneath its button while unplaced." @synonyms "item, step, stage, sequence, order, ranking, procedure" @tier "domain"
21439
21457
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21440
- pendingColor : string = "#94a3b8" @label "Pending Slot Color" @description "Fill color for a filled slot before grading." @tier "presentation"
21458
+ pendingColor : string = "series-2" @label "Pending Slot Color" @description "Fill color for a filled slot before grading." @tier "presentation"
21441
21459
  retryLabel : string = "Retry" @label "Retry Button Label" @tier "presentation"
21442
- slotBorderColor : string = "#334155" @label "Slot Border Color" @tier "presentation"
21443
- slotFontSize : number = 13 @label "Slot Font Size" @tier "presentation"
21460
+ slotBorderColor : string = "ink" @label "Slot Border Color" @tier "presentation"
21461
+ slotFontSize : string = "sm" @label "Slot Text Size" @description "Slot label size role: xs, sm, base or lg." @tier "presentation"
21444
21462
  slotHeight : number = 60 @label "Slot Height (px)" @tier "presentation"
21445
21463
  slotLeft : number = 40 @label "First Slot X (px)" @tier "presentation"
21446
21464
  slotSpacing : number = 120 @label "Slot Spacing (px)" @tier "presentation"
21447
- slotTextColor : string = "#0f172a" @label "Slot Text Color" @tier "presentation"
21465
+ slotTextColor : string = "label" @label "Slot Text Color" @tier "presentation"
21448
21466
  slotWidth : number = 100 @label "Slot Width (px)" @tier "presentation"
21449
21467
  slotY : number = 70 @label "Slot Row Y (px)" @tier "presentation"
21468
+ summary : string = "" @label "Concept" @description "One line under the title saying what is being ordered (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21450
21469
  title : string = "Build the Order" @label "Title" @description "Title shown above the instrument." @tier "presentation"
21451
21470
  undoLabel : string = "Undo" @label "Undo Button Label" @tier "presentation"
21452
21471
  width : number = 640 @label "Width" @description "Canvas width in pixels." @tier "presentation"
@@ -21462,18 +21481,18 @@ trait std-learn-classify.traits.LearnClassifySim {
21462
21481
  category : interaction
21463
21482
  states : (idle*)
21464
21483
  events : (INIT MODE_SELECTED PICK ADVANCE RETRY TOGGLE_RUN CLASSIFY_UPDATED LEARN_ROUND_COMPLETE)
21465
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on PICK) (idle -> idle on ADVANCE) (idle -> idle on RETRY) (idle -> idle on TOGGLE_RUN))
21484
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on PICK) (idle -> idle on ADVANCE) (idle -> idle on RETRY) (idle -> idle on TOGGLE_RUN))
21466
21485
  emits : (CLASSIFY_UPDATED LEARN_ROUND_COMPLETE)
21467
21486
  config {
21468
21487
  advanceLabel : string = "Next" @label "Advance Button Label" @description "Label text for the button that advances to the next item." @tier "presentation"
21469
21488
  advanceMs : number = 900 @label "Auto-Advance Interval (ms)" @description "Milliseconds between automatic advances while running — the 32ms base tick accumulates elapsed time and fires ADVANCE each time this interval elapses." @tier "domain"
21470
21489
  animate : boolean = false @label "Animate" @description "Enable continuous redraw loop." @tier "presentation"
21471
21490
  autoRun : boolean = false @label "Auto Run" @description "When true the advance clock starts on load and the drill flips to the next item every advanceMs milliseconds; toggle live with the Auto/Pause button." @tier "domain"
21472
- backgroundColor : string = "#f8fafc" @label "Background Color" @tier "presentation"
21473
- categories : [LearnClassifyOption] = [{"color":"#94a3b8","label":"Category A","value":"a"},{"color":"#64748b","label":"Category B","value":"b"}] @label "Categories" @description "Ordered bottom-to-top roster of category buckets (value/label/color) used to render the stacked backdrop and the pick buttons; order determines the backdrop's stacking, widest at the bottom to narrowest at the top." @synonyms "category, bucket, class, tier, level, classification, roster" @tier "domain"
21474
- correctColor : string = "#16a34a" @label "Correct Highlight Color" @description "Fill color for the correct category once the learner has picked." @tier "presentation"
21491
+ backgroundColor : string = "" @label "Background Color" @description "Canvas ground (tone name, token or colour); empty uses the theme's drawing ground." @tier "presentation"
21492
+ categories : [LearnClassifyOption] = [{"color":"series-1","label":"Category A","value":"a"},{"color":"series-2","label":"Category B","value":"b"}] @label "Categories" @description "Ordered bottom-to-top roster of category buckets (value/label/color) used to render the stacked backdrop and the pick buttons; order determines the backdrop's stacking, widest at the bottom to narrowest at the top." @synonyms "category, bucket, class, tier, level, classification, roster" @tier "domain"
21493
+ correctColor : string = "success" @label "Correct Highlight Color" @description "Fill color for the correct category once the learner has picked." @tier "presentation"
21475
21494
  height : number = 420 @label "Height" @description "Canvas height in pixels." @tier "presentation"
21476
- incorrectColor : string = "#dc2626" @label "Incorrect Highlight Color" @description "Fill color for the learner's picked category when it does not match the correct category." @tier "presentation"
21495
+ incorrectColor : string = "error" @label "Incorrect Highlight Color" @description "Fill color for the learner's picked category when it does not match the correct category." @tier "presentation"
21477
21496
  interactive : boolean = false @label "Interactive" @description "Enable pointer interaction on the canvas." @tier "presentation"
21478
21497
  items : [LearnClassifyItem] = [{"category":"a","explanation":"This example was written to satisfy category A's defining trait.","hint":"Consider what makes this belong to category A.","text":"Example item one."},{"category":"b","explanation":"This example was written to satisfy category B's defining trait.","hint":"Consider what makes this belong to category B.","text":"Example item two."}] @label "Items" @description "Roster of items the learner classifies; each carries its prompt text, the value of its correct category, and optional hint/explanation text shown before/after the pick." @synonyms "item, prompt, scenario, situation, case, example, question" @tier "domain"
21479
21498
  loopRound : boolean = false @label "Loop Round" @description "When true the item cursor wraps past the last item forever (a looping drill) instead of ending the round at the summary screen." @tier "domain"
@@ -21485,6 +21504,8 @@ trait std-learn-classify.traits.LearnClassifySim {
21485
21504
  retryLabel : string = "Retry Round" @label "Retry Button Label" @description "Label text for the button that restarts the round from the end-of-round summary." @tier "presentation"
21486
21505
  scoreCap : number = 0 @label "Score Cap" @description "Upper bound on the rubric score; 0 means uncapped." @tier "domain"
21487
21506
  showHint : boolean = true @label "Show Hint" @description "Show each item's hint line beneath the prompt before the learner picks; hide for a harder drill." @tier "domain"
21507
+ summary : string = "" @label "Concept" @description "One line under the title saying what is being classified (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21508
+ taper : number = 0 @label "Taper" @description "How far the category rungs narrow toward the top: 0 = equal-width rungs (no implied order), 1 = a full pyramid for hierarchies (needs, levels). Long category names need 0." @tier "presentation"
21488
21509
  title : string = "Classify" @label "Title" @description "Title shown above the instrument." @tier "presentation"
21489
21510
  width : number = 640 @label "Width" @description "Canvas width in pixels." @tier "presentation"
21490
21511
  }
@@ -21499,7 +21520,7 @@ trait std-learn-compare.traits.CompareSim {
21499
21520
  category : interaction
21500
21521
  states : (idle*)
21501
21522
  events : (INIT MODE_SELECTED SET_PARAM COMPARISON_CHANGED)
21502
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on SET_PARAM))
21523
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on SET_PARAM))
21503
21524
  emits : (COMPARISON_CHANGED)
21504
21525
  config {
21505
21526
  compareText : string = "Tune each side's parameters and watch how the two curves diverge." @label "Compare Text" @description "One-sentence statement of what is being contrasted." @tier "domain"
@@ -21508,7 +21529,7 @@ trait std-learn-compare.traits.CompareSim {
21508
21529
  height : number = 400 @label "Height" @tier "presentation"
21509
21530
  leftADefault : number = 1 @label "Left A Default" @tier "domain"
21510
21531
  leftBDefault : number = 2 @label "Left B Default" @tier "domain"
21511
- leftColor : string = "#3b82f6" @label "Left Color" @tier "presentation"
21532
+ leftColor : string = "series-1" @label "Left Color" @tier "presentation"
21512
21533
  leftLabel : string = "Left" @label "Left Label" @description "Display name of the first compared instance." @tier "domain"
21513
21534
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21514
21535
  paramALabel : string = "A" @label "Parameter A Label" @tier "presentation"
@@ -21521,10 +21542,11 @@ trait std-learn-compare.traits.CompareSim {
21521
21542
  paramBStep : number = 0.1 @label "Parameter B Step" @tier "presentation"
21522
21543
  rightADefault : number = 2 @label "Right A Default" @tier "domain"
21523
21544
  rightBDefault : number = 1.5 @label "Right B Default" @tier "domain"
21524
- rightColor : string = "#f59e0b" @label "Right Color" @tier "presentation"
21545
+ rightColor : string = "series-2" @label "Right Color" @tier "presentation"
21525
21546
  rightLabel : string = "Right" @label "Right Label" @description "Display name of the second compared instance." @tier "domain"
21526
21547
  showAxes : boolean = true @label "Show Axes" @tier "presentation"
21527
21548
  showGrid : boolean = true @label "Show Grid" @tier "presentation"
21549
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21528
21550
  title : string = "Compare Two Settings" @label "Title" @description "Title shown above the canvas." @tier "presentation"
21529
21551
  width : number = 600 @label "Width" @tier "presentation"
21530
21552
  xMax : number = 10 @label "X Max" @tier "presentation"
@@ -21540,8 +21562,8 @@ trait std-learn-coupled-sim.traits.CoupledSimSim {
21540
21562
  linkedEntity : CoupledSimScene
21541
21563
  category : interaction
21542
21564
  states : (idle*)
21543
- events : (INIT MODE_SELECTED RUN PAUSE RESET SET_A SET_B SHOCK RUN_TOGGLED SIM_RESET COEFS_CHANGED SHOCK_APPLIED)
21544
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SET_A) (idle -> idle on SET_B) (idle -> idle on SHOCK))
21565
+ events : (INIT MODE_SELECTED TOGGLE_RUN SPEED_SET RUN PAUSE RESET SET_A SET_B SHOCK RUN_TOGGLED SIM_RESET COEFS_CHANGED SHOCK_APPLIED)
21566
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SET_A) (idle -> idle on SET_B) (idle -> idle on SHOCK))
21545
21567
  emits : (RUN_TOGGLED SIM_RESET COEFS_CHANGED SHOCK_APPLIED)
21546
21568
  config {
21547
21569
  autoRun : boolean = true @label "Auto Run" @description "Whether the simulation starts running immediately on load." @tier "domain"
@@ -21562,18 +21584,19 @@ trait std-learn-coupled-sim.traits.CoupledSimSim {
21562
21584
  height : number = 360 @label "Height" @tier "presentation"
21563
21585
  kind : string = "predator-prey" @label "Interaction Family" @description "Which coupled dynamics govern the two quantities: predator-prey (oscillating cycles), epidemic (S and I with transmission and recovery), or kinetics (A decaying into B)." @synonyms "predator prey, Lotka-Volterra, SIR, epidemic, reaction kinetics, coupled ODE" @tier "domain"
21564
21586
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21565
- pColor : string = "#16a34a" @label "P Color" @tier "presentation"
21587
+ pColor : string = "series-1" @label "P Color" @tier "presentation"
21566
21588
  pLabel : string = "Prey" @label "P Label" @description "Display name of the first quantity." @tier "domain"
21567
21589
  pStart : number = 120 @label "P Start" @tier "domain"
21568
- qColor : string = "#dc2626" @label "Q Color" @tier "presentation"
21590
+ qColor : string = "series-2" @label "Q Color" @tier "presentation"
21569
21591
  qLabel : string = "Predators" @label "Q Label" @description "Display name of the second quantity." @tier "domain"
21570
21592
  qStart : number = 40 @label "Q Start" @tier "domain"
21571
21593
  shockDownLabel : string = "− Prey cull" @label "Shock Down Label" @tier "presentation"
21572
21594
  shockSize : number = 40 @label "Shock Size" @description "How much of the first quantity a shock button injects or removes." @tier "domain"
21573
21595
  shockUpLabel : string = "+ Prey burst" @label "Shock Up Label" @tier "presentation"
21596
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21574
21597
  taskText : string = "Run the system, retune the rates, and shock it — watch how the two quantities push and pull each other." @label "Task Text" @description "One-sentence statement of what to explore." @tier "domain"
21575
21598
  timeScale : number = 1 @label "Time Scale" @description "Multiplier on the integration step; raise it to fast-forward the dynamics." @tier "domain"
21576
- title : string = "Coupled System" @label "Title" @description "Title shown above the simulation." @tier "presentation"
21599
+ title : string = "Coupled System" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
21577
21600
  valueMax : number = 300 @label "Value Max" @description "Upper bound of the chart's y axis." @tier "presentation"
21578
21601
  width : number = 600 @label "Width" @tier "presentation"
21579
21602
  }
@@ -21588,7 +21611,7 @@ trait std-learn-derivation.traits.LearnDerivationSim {
21588
21611
  category : interaction
21589
21612
  states : (idle*)
21590
21613
  events : (INIT MODE_SELECTED APPLY_STEP TOGGLE_RUN RESET DERIVATION_UPDATED LEARN_ROUND_COMPLETE)
21591
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on APPLY_STEP) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
21614
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on APPLY_STEP) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
21592
21615
  emits : (DERIVATION_UPDATED LEARN_ROUND_COMPLETE)
21593
21616
  config {
21594
21617
  autoApplyIntervalMs : number = 800 @label "Auto-Apply Interval (ms)" @description "Milliseconds of running clock per automatic candidate application — the 32ms base tick accumulates elapsed time and applies the first applicable candidate each time this interval elapses." @tier "domain"
@@ -21605,6 +21628,7 @@ trait std-learn-derivation.traits.LearnDerivationSim {
21605
21628
  noStepAvailableMessage : string = "No further steps are available yet." @label "No Step Available Message" @description "Feedback shown when the auto-apply tick finds no applicable candidate." @tier "presentation"
21606
21629
  premises : [LearnDerivationLine] = [{"badgeLabel":"GIVEN","badgeVariant":"neutral","id":"given-a","kind":"fact","label":"A","negated":false,"subject":"A"},{"badgeLabel":"RULE","badgeVariant":"info","id":"given-a-implies-b","kind":"link","label":"A → B","leftNegated":false,"leftSubject":"A","rightNegated":false,"rightSubject":"B"}] @label "Premises" @description "The starting lines of the derivation: plain facts (subject/negated) and two-sided links (leftSubject/leftNegated/rightSubject/rightNegated) the learner combines with candidate steps. Each line carries its own badgeLabel/badgeVariant." @synonyms "premise, given, starting line, hypothesis, starting statement" @tier "domain"
21607
21630
  resetLabel : string = "Reset" @label "Reset Button Label" @description "Label text for the button that restores the starting premises." @tier "presentation"
21631
+ summary : string = "" @label "Concept" @description "One line under the title saying what is being derived (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21608
21632
  title : string = "Derivation Lab" @label "Title" @description "Title shown above the derivation panel." @tier "presentation"
21609
21633
  width : number = 600 @label "Width" @description "Maximum width of the panel, in pixels." @tier "presentation"
21610
21634
  }
@@ -21619,17 +21643,18 @@ trait std-learn-diagram.traits.LearnDiagramSim {
21619
21643
  category : interaction
21620
21644
  states : (idle*)
21621
21645
  events : (INIT MODE_SELECTED SELECT_PART CLEAR_PART PART_SELECTED SELECTION_CLEARED)
21622
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on SELECT_PART) (idle -> idle on CLEAR_PART))
21646
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on SELECT_PART) (idle -> idle on CLEAR_PART))
21623
21647
  emits : (PART_SELECTED SELECTION_CLEARED)
21624
21648
  config {
21625
- backgroundColor : string = "#f8fafc" @label "Background Color" @description "Canvas background color." @tier "presentation"
21649
+ backgroundColor : string = "" @label "Background Color" @description "Canvas ground. Empty uses the theme drawing ground." @tier "presentation"
21626
21650
  clearLabel : string = "Clear" @label "Clear Button Label" @description "Label text for the button that clears the current selection." @tier "presentation"
21627
21651
  height : number = 400 @label "Height" @description "Canvas height in pixels." @tier "presentation"
21628
- highlightColor : string = "#f59e0b" @label "Highlight Color" @description "Ring color drawn around the selected part." @tier "presentation"
21629
- links : [LearnDiagramLink] = [{"color":"#cbd5e1","from":"input","label":"","to":"processor"},{"color":"#cbd5e1","from":"processor","label":"","to":"storage"},{"color":"#cbd5e1","from":"processor","label":"","to":"output"},{"color":"#cbd5e1","from":"controller","label":"","to":"processor"}] @label "Links" @description "Connector lines drawn between parts, by id." @synonyms "link, edge, connector, arrow" @tier "domain"
21652
+ highlightColor : string = "highlight" @label "Highlight Color" @description "Ring color drawn around the selected part." @tier "presentation"
21653
+ links : [LearnDiagramLink] = [{"color":"guide","from":"input","label":"","to":"processor"},{"color":"guide","from":"processor","label":"","to":"storage"},{"color":"guide","from":"processor","label":"","to":"output"},{"color":"guide","from":"controller","label":"","to":"processor"}] @label "Links" @description "Connector lines drawn between parts, by id." @synonyms "link, edge, connector, arrow" @tier "domain"
21630
21654
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21631
21655
  overviewText : string = "Select a part below to learn what it does." @label "Overview Text" @description "Caption card text shown when no part is selected." @tier "presentation"
21632
- parts : [LearnDiagramPart] = [{"color":"#2563eb","description":"Receives raw data or requests from the outside world and hands them to the processor.","id":"input","label":"Input","radius":34,"x":120,"y":200},{"color":"#7c3aed","description":"The central component that transforms incoming data according to the system's rules.","id":"processor","label":"Processor","radius":46,"x":300,"y":200},{"color":"#0891b2","description":"Persists data so it can be retrieved later, even after the system restarts.","id":"storage","label":"Storage","radius":34,"x":300,"y":320},{"color":"#16a34a","description":"Delivers the processor's results back out to users or other systems.","id":"output","label":"Output","radius":34,"x":480,"y":200},{"color":"#dc2626","description":"Coordinates timing and configuration for the processor without touching the data itself.","id":"controller","label":"Controller","radius":26,"x":300,"y":80}] @label "Parts" @description "Roster of labeled parts (id, label, description, x, y, radius, color) the diagram renders as circles; the learner selects one to see its description." @synonyms "part, node, component, label, annotation" @tier "domain"
21656
+ parts : [LearnDiagramPart] = [{"color":"series-1","description":"Receives raw data or requests from the outside world and hands them to the processor.","id":"input","label":"Input","radius":34,"x":120,"y":200},{"color":"series-2","description":"The central component that transforms incoming data according to the system's rules.","id":"processor","label":"Processor","radius":46,"x":300,"y":200},{"color":"series-3","description":"Persists data so it can be retrieved later, even after the system restarts.","id":"storage","label":"Storage","radius":34,"x":300,"y":320},{"color":"series-4","description":"Delivers the processor's results back out to users or other systems.","id":"output","label":"Output","radius":34,"x":480,"y":200},{"color":"series-5","description":"Coordinates timing and configuration for the processor without touching the data itself.","id":"controller","label":"Controller","radius":26,"x":300,"y":80}] @label "Parts" @description "Roster of labeled parts (id, label, description, x, y, radius, color) the diagram renders as circles; the learner selects one to see its description." @synonyms "part, node, component, label, annotation" @tier "domain"
21657
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21633
21658
  title : string = "System Diagram" @label "Title" @description "Title shown above the diagram." @tier "presentation"
21634
21659
  width : number = 600 @label "Width" @description "Canvas width in pixels." @tier "presentation"
21635
21660
  }
@@ -21644,12 +21669,12 @@ trait std-learn-doser.traits.LearnDoserSim {
21644
21669
  category : interaction
21645
21670
  states : (idle*)
21646
21671
  events : (INIT MODE_SELECTED ADD_SMALL ADD_LARGE TOGGLE_DRIP RESET DOSE_ADDED DOSE_RESET DOSER_UPDATED LEARN_ROUND_COMPLETE)
21647
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on ADD_SMALL) (idle -> idle on ADD_LARGE) (idle -> idle on TOGGLE_DRIP) (idle -> idle on RESET))
21672
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ADD_SMALL) (idle -> idle on ADD_LARGE) (idle -> idle on TOGGLE_DRIP) (idle -> idle on RESET))
21648
21673
  emits : (DOSE_ADDED DOSE_RESET DOSER_UPDATED LEARN_ROUND_COMPLETE)
21649
21674
  config {
21650
21675
  autoDrip : boolean = false @label "Auto Drip" @description "When true, INIT/MODE_SELECTED/Reset start the drip clock adding a small increment each interval; toggle live with the Auto-dose/Pause button." @tier "domain"
21651
- backgroundColor : string = "#fafafa" @label "Background Color" @description "Canvas background color." @tier "presentation"
21652
- bands : [DoserBand] = [{"color":"#94a3b8","label":"Low","terminal":false,"upperBound":50},{"color":"#16a34a","label":"High","terminal":true,"upperBound":999999999}] @label "Bands" @description "Ordered ascending roster of dose bands/zones — each carries the dose upper bound it covers, a label, a color, and whether crossing into it is terminal (irreversible; sets done true until Reset). The accumulated dose is classified into the first band whose upperBound it does not exceed, falling through to the last band beyond all bounds." @synonyms "zone, band, threshold, region, stage, phase, tier" @tier "domain"
21676
+ backgroundColor : string = "" @label "Background Color" @description "Canvas ground. Empty uses the theme drawing ground." @tier "presentation"
21677
+ bands : [DoserBand] = [{"color":"muted","label":"Low","terminal":false,"upperBound":50},{"color":"success","label":"High","terminal":true,"upperBound":999999999}] @label "Bands" @description "Ordered ascending roster of dose bands/zones — each carries the dose upper bound it covers, a label, a color, and whether crossing into it is terminal (irreversible; sets done true until Reset). The accumulated dose is classified into the first band whose upperBound it does not exceed, falling through to the last band beyond all bounds." @synonyms "zone, band, threshold, region, stage, phase, tier" @tier "domain"
21653
21678
  capacity : number = 100 @label "Capacity" @description "Maximum total dose the source can deliver; the source vessel drains to empty and additions clamp once accumulated dose reaches this cap." @tier "domain"
21654
21679
  dripIntervalMs : number = 500 @label "Drip Interval (ms)" @description "Milliseconds of running clock per auto-drip increment — the 32ms base tick accumulates elapsed time and adds a small step each time this interval elapses." @tier "domain"
21655
21680
  height : number = 400 @label "Height" @description "Canvas height in pixels." @tier "presentation"
@@ -21657,11 +21682,13 @@ trait std-learn-doser.traits.LearnDoserSim {
21657
21682
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21658
21683
  quantityLabel : string = "Dose" @label "Quantity Label" @description "Label used for the accumulated-quantity readout and in the narration line." @synonyms "quantity, amount, dose, volume, level" @tier "domain"
21659
21684
  reservoirLabel : string = "Reservoir" @label "Reservoir Label" @description "Label for the vessel that fills as dose accumulates." @synonyms "reservoir, beaker, tank, container, receiving vessel" @tier "presentation"
21685
+ series : [string] = [] @label "Palette" @description "Overrides the theme's categorical palette on the canvas (series-1…N) — a subject's real-world color convention, such as indicator colors. Empty uses the theme's palette." @tier "presentation"
21660
21686
  showCanvas : boolean = true @label "Show Canvas" @description "When true (the default, standalone use) the instrument renders its own reservoir/source canvas and narration below the control strip. Set false when a domain sibling trait composes this atom via @rebindable and owns the accurate scene render itself — then only the control strip (add/drip/reset buttons) embeds via @trait.<name>, avoiding a duplicate canvas." @tier "presentation"
21661
- sourceColor : string = "#60a5fa" @label "Source Color" @description "Fill color for the source vessel." @tier "presentation"
21687
+ sourceColor : string = "series-1" @label "Source Color" @description "Tone name for the source vessel fill (for example series-1)." @tier "presentation"
21662
21688
  sourceLabel : string = "Source" @label "Source Label" @description "Label for the vessel that drains as dose is delivered from it." @synonyms "source, burette, supply, dispenser" @tier "presentation"
21663
21689
  stepLarge : number = 5 @label "Large Step" @description "Quantity added per press of the coarse add button." @tier "domain"
21664
21690
  stepSmall : number = 1 @label "Small Step" @description "Quantity added per press of the fine add button, and per auto-drip tick — for precise control near a band boundary." @tier "domain"
21691
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21665
21692
  title : string = "Doser" @label "Title" @description "Title shown above the instrument." @tier "presentation"
21666
21693
  unit : string = "" @label "Unit" @description "Unit suffix appended to the step-size button labels (e.g. \"mL\", \"mg\", \"units\"); empty means no unit shown." @tier "domain"
21667
21694
  width : number = 600 @label "Width" @description "Canvas width in pixels." @tier "presentation"
@@ -21678,7 +21705,7 @@ trait std-learn-estimate.traits.EstimateSim {
21678
21705
  category : interaction
21679
21706
  states : (idle*)
21680
21707
  events : (INIT MODE_SELECTED SET_ESTIMATE LOCK_IN NEXT RETRY ESTIMATE_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
21681
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on SET_ESTIMATE) (idle -> idle on LOCK_IN) (idle -> idle on NEXT) (idle -> idle on RETRY))
21708
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on SET_ESTIMATE) (idle -> idle on LOCK_IN) (idle -> idle on NEXT) (idle -> idle on RETRY))
21682
21709
  emits : (ESTIMATE_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
21683
21710
  config {
21684
21711
  closePct : number = 0.25 @label "Close Band" @description "Relative error at or below this fraction (but above the exact band) counts as close (partial points)." @tier "domain"
@@ -21694,6 +21721,7 @@ trait std-learn-estimate.traits.EstimateSim {
21694
21721
  sliderMax : number = 500 @label "Slider Max" @description "Upper bound of the estimate slider." @tier "domain"
21695
21722
  sliderMin : number = 0 @label "Slider Min" @description "Lower bound of the estimate slider." @tier "domain"
21696
21723
  sliderStep : number = 0.1 @label "Slider Step" @tier "presentation"
21724
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21697
21725
  title : string = "Estimate It" @label "Title" @description "Title shown above the drill." @tier "presentation"
21698
21726
  }
21699
21727
  override-surface : (linkedEntity name events effects listens emitsScope config)
@@ -21731,7 +21759,7 @@ trait std-learn-goal-seek.traits.GoalSeekSim {
21731
21759
  category : interaction
21732
21760
  states : (idle*)
21733
21761
  events : (INIT MODE_SELECTED SET_PARAM_A SET_PARAM_B CHECK RESET PARAMS_CHANGED GOAL_CHECKED GOAL_RESET LEARN_ROUND_COMPLETE)
21734
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on SET_PARAM_A) (idle -> idle on SET_PARAM_B) (idle -> idle on CHECK) (idle -> idle on RESET))
21762
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on SET_PARAM_A) (idle -> idle on SET_PARAM_B) (idle -> idle on CHECK) (idle -> idle on RESET))
21735
21763
  emits : (PARAMS_CHANGED GOAL_CHECKED GOAL_RESET LEARN_ROUND_COMPLETE)
21736
21764
  config {
21737
21765
  checkLabel : string = "Check" @label "Check Label" @tier "presentation"
@@ -21739,7 +21767,7 @@ trait std-learn-goal-seek.traits.GoalSeekSim {
21739
21767
  goalText : string = "Tune the two sliders until your curve matches the target curve, then press Check." @label "Goal Text" @description "One-sentence statement of the inverse problem the learner must solve." @tier "domain"
21740
21768
  gridStep : number = 1 @label "Grid Step" @tier "presentation"
21741
21769
  height : number = 400 @label "Height" @tier "presentation"
21742
- learnerColor : string = "#3b82f6" @label "Learner Color" @tier "presentation"
21770
+ learnerColor : string = "series-2" @label "Learner Color" @tier "presentation"
21743
21771
  learnerLabel : string = "Yours" @label "Learner Label" @tier "presentation"
21744
21772
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21745
21773
  paramADefault : number = 1 @label "Parameter A Default" @description "Starting value of the learner's first parameter." @tier "domain"
@@ -21755,9 +21783,10 @@ trait std-learn-goal-seek.traits.GoalSeekSim {
21755
21783
  showAxes : boolean = true @label "Show Axes" @tier "presentation"
21756
21784
  showGrid : boolean = true @label "Show Grid" @tier "presentation"
21757
21785
  showLiveDistance : boolean = true @label "Show Live Distance" @description "When true the RMS distance updates live as the learner tunes (warmer/colder); when false only attempts are shown, for a harder variant." @tier "domain"
21786
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21758
21787
  targetA : number = 2.5 @label "Target A" @description "Hidden first parameter of the target curve the learner must recover." @tier "domain"
21759
21788
  targetB : number = 1.5 @label "Target B" @description "Hidden second parameter of the target curve the learner must recover." @tier "domain"
21760
- targetColor : string = "#94a3b8" @label "Target Color" @tier "presentation"
21789
+ targetColor : string = "guide" @label "Target Color" @tier "presentation"
21761
21790
  targetLabel : string = "Target" @label "Target Label" @tier "presentation"
21762
21791
  title : string = "Goal Seek" @label "Title" @description "Title shown above the canvas." @tier "presentation"
21763
21792
  tolerance : number = 0.35 @label "Tolerance" @description "Maximum RMS distance between learner and target curves that still counts as a match." @tier "domain"
@@ -21775,28 +21804,29 @@ trait std-learn-grid-sim.traits.GridSimSim {
21775
21804
  linkedEntity : GridSimScene
21776
21805
  category : interaction
21777
21806
  states : (idle*)
21778
- events : (INIT MODE_SELECTED RUN PAUSE STEP TAP_CELL RESET RUN_TOGGLED GRID_STEPPED CELL_TOGGLED GRID_RESET)
21779
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on STEP) (idle -> idle on TAP_CELL) (idle -> idle on RESET))
21807
+ events : (INIT MODE_SELECTED TOGGLE_RUN SPEED_SET RUN PAUSE STEP TAP_CELL RESET RUN_TOGGLED GRID_STEPPED CELL_TOGGLED GRID_RESET)
21808
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on STEP) (idle -> idle on TAP_CELL) (idle -> idle on RESET))
21780
21809
  emits : (RUN_TOGGLED GRID_STEPPED CELL_TOGGLED GRID_RESET)
21781
21810
  config {
21782
21811
  autoRun : boolean = false @label "Auto Run" @description "Whether the evolution starts running immediately on load." @tier "domain"
21783
- backgroundColor : string = "#f8fafc" @label "Background Color" @tier "presentation"
21812
+ backgroundColor : string = "" @label "Background Color" @description "Canvas ground override; empty uses the theme's drawing ground." @tier "presentation"
21784
21813
  cellSize : number = 26 @label "Cell Size" @tier "presentation"
21785
21814
  cols : number = 16 @label "Columns" @tier "domain"
21786
21815
  decay : number = 0.995 @label "Decay" @description "Diffusion rule only: fraction of a cell's value retained each generation." @tier "domain"
21787
21816
  diffuseRate : number = 0.5 @label "Diffuse Rate" @description "Diffusion rule only: how strongly a cell moves toward its neighbourhood average each generation." @tier "domain"
21788
21817
  height : number = 332 @label "Height" @tier "presentation"
21789
- lowColor : string = "#bfdbfe" @label "Low Color" @tier "presentation"
21818
+ lowColor : string = "muted" @label "Low Color" @tier "presentation"
21790
21819
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21791
- midColor : string = "#60a5fa" @label "Mid Color" @tier "presentation"
21792
- offColor : string = "#e2e8f0" @label "Off Color" @tier "presentation"
21793
- onColor : string = "#1d4ed8" @label "On Color" @tier "presentation"
21820
+ midColor : string = "series-3" @label "Mid Color" @tier "presentation"
21821
+ offColor : string = "fill" @label "Off Color" @tier "presentation"
21822
+ onColor : string = "series-2" @label "On Color" @tier "presentation"
21794
21823
  rows : number = 12 @label "Rows" @tier "domain"
21795
21824
  rule : string = "life" @label "Rule" @description "The local update rule: life (Conway birth-3 survive-2-3), spread (an active 4-neighbour activates a cell), or diffusion (cells relax toward the neighbourhood average with decay)." @synonyms "game of life, contagion, wavefront, heat diffusion, cellular automaton rule" @tier "domain"
21796
21825
  seeds : [number] = [1,18,32,33,34,88,89,90] @label "Seeds" @description "Flat cell indexes (row·cols + col) active at the start — the default plants a glider and a blinker. Realizations declare their own starting pattern here." @tier "domain"
21797
21826
  stepLabel : string = "Step" @label "Step Label" @tier "presentation"
21827
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21798
21828
  taskText : string = "Tap cells to seed the world, then Run — or Step one generation at a time to see the rule at work." @label "Task Text" @description "One-sentence statement of what to explore." @tier "domain"
21799
- title : string = "Grid World" @label "Title" @description "Title shown above the grid." @tier "presentation"
21829
+ title : string = "Grid World" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
21800
21830
  width : number = 436 @label "Width" @tier "presentation"
21801
21831
  }
21802
21832
  override-surface : (linkedEntity name events effects listens emitsScope config)
@@ -21810,17 +21840,18 @@ trait std-learn-hotspot.traits.HotspotSim {
21810
21840
  category : interaction
21811
21841
  states : (idle*)
21812
21842
  events : (INIT MODE_SELECTED TAP_SHAPE NEXT RETRY TAP_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
21813
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on TAP_SHAPE) (idle -> idle on NEXT) (idle -> idle on RETRY))
21843
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TAP_SHAPE) (idle -> idle on NEXT) (idle -> idle on RETRY))
21814
21844
  emits : (TAP_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
21815
21845
  config {
21816
- backgroundColor : string = "#f8fafc" @label "Background Color" @tier "presentation"
21846
+ backgroundColor : string = "" @label "Background Color" @tier "presentation"
21817
21847
  height : number = 380 @label "Height" @tier "presentation"
21818
- hitColor : string = "#16a34a" @label "Hit Ring Color" @description "Color of the highlight ring drawn around the target once found." @tier "presentation"
21848
+ hitColor : string = "success" @label "Hit Ring Color" @description "Color of the highlight ring drawn around the target once found." @tier "presentation"
21819
21849
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21820
21850
  nextLabel : string = "Next" @label "Next Label" @tier "presentation"
21821
21851
  prompts : [HotspotPrompt] = [{"explanation":"The nucleus holds the DNA.","prompt":"Tap the part that stores the cell's genetic material.","targetId":"nucleus"},{"explanation":"Mitochondria run cellular respiration.","prompt":"Tap the part that produces the cell's energy.","targetId":"mitochondrion"},{"explanation":"Ribosomes translate mRNA into protein.","prompt":"Tap the part that builds proteins.","targetId":"ribosome"}] @label "Prompts" @description "The question roster; each prompt names a target hotspot id and an explanation revealed on a hit." @tier "domain"
21822
21852
  retryLabel : string = "Try Again" @label "Retry Label" @tier "presentation"
21823
- shapes : [HotspotShape] = [{"color":"#8b5cf6","id":"nucleus","label":"Nucleus","radius":34,"x":300,"y":170},{"color":"#3b82f6","id":"membrane","label":"Membrane","radius":26,"x":130,"y":120},{"color":"#f59e0b","id":"mitochondrion","label":"Mitochondrion","radius":24,"x":460,"y":120},{"color":"#16a34a","id":"ribosome","label":"Ribosome","radius":18,"x":200,"y":280},{"color":"#06b6d4","id":"vacuole","label":"Vacuole","radius":28,"x":420,"y":280}] @label "Hotspots" @description "The labeled parts of the scene; each carries an id, display label, canvas position, radius, and color. Realizations declare their own subject's parts here." @tier "domain"
21853
+ shapes : [HotspotShape] = [{"color":"series-1","id":"nucleus","label":"Nucleus","radius":34,"x":300,"y":170},{"color":"series-2","id":"membrane","label":"Membrane","radius":26,"x":130,"y":120},{"color":"series-3","id":"mitochondrion","label":"Mitochondrion","radius":24,"x":460,"y":120},{"color":"series-4","id":"ribosome","label":"Ribosome","radius":18,"x":200,"y":280},{"color":"series-5","id":"vacuole","label":"Vacuole","radius":28,"x":420,"y":280}] @label "Hotspots" @description "The labeled parts of the scene; each carries an id, display label, canvas position, radius, and color. Realizations declare their own subject's parts here." @tier "domain"
21854
+ summary : string = "" @label "Concept" @description "One line under the title saying what is being identified (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21824
21855
  title : string = "Tap the Part" @label "Title" @description "Title shown above the canvas." @tier "presentation"
21825
21856
  width : number = 600 @label "Width" @tier "presentation"
21826
21857
  }
@@ -21834,12 +21865,12 @@ trait std-learn-live-sim.traits.LiveSimSim {
21834
21865
  linkedEntity : LiveSimScene
21835
21866
  category : interaction
21836
21867
  states : (idle*)
21837
- events : (INIT MODE_SELECTED RUN PAUSE RESET SET_GRAVITY SET_DAMPING RUN_TOGGLED SIM_RESET)
21838
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SET_GRAVITY) (idle -> idle on SET_DAMPING))
21868
+ events : (INIT MODE_SELECTED TOGGLE_RUN RUN PAUSE RESET SET_GRAVITY SET_DAMPING RUN_TOGGLED SIM_RESET)
21869
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE_RUN) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SET_GRAVITY) (idle -> idle on SET_DAMPING))
21839
21870
  emits : (RUN_TOGGLED SIM_RESET)
21840
21871
  config {
21841
- backgroundColor : string = "#f8fafc" @label "Background Color" @tier "presentation"
21842
- bodies : [LiveSimBody] = [{"color":"#2563eb","id":"ball-a","radius":14,"vx":4,"vy":0,"x":100,"y":60},{"color":"#16a34a","id":"ball-b","radius":18,"vx":-3,"vy":2,"x":260,"y":90},{"color":"#f59e0b","id":"ball-c","radius":11,"vx":2,"vy":-1,"x":420,"y":40}] @label "Bodies" @description "Initial bodies; each carries position (x,y), radius, color, and velocity (vx,vy). Restored on Reset." @tier "presentation"
21872
+ backgroundColor : string = "" @label "Background Color" @description "Canvas ground override; empty uses the theme's drawing ground." @tier "presentation"
21873
+ bodies : [LiveSimBody] = [{"color":"series-1","id":"ball-a","radius":14,"vx":4,"vy":0,"x":100,"y":60},{"color":"series-2","id":"ball-b","radius":18,"vx":-3,"vy":2,"x":260,"y":90},{"color":"series-3","id":"ball-c","radius":11,"vx":2,"vy":-1,"x":420,"y":40}] @label "Bodies" @description "Initial bodies; each carries position (x,y), radius, color, and velocity (vx,vy). Restored on Reset." @tier "presentation"
21843
21874
  damping : number = 0.995 @label "Damping" @description "Initial fraction of velocity retained each tick (air resistance); adjustable live via the Damping slider." @tier "domain"
21844
21875
  gravity : number = 0.4 @label "Gravity" @description "Initial downward acceleration added to each body's vy every tick; adjustable live via the Gravity slider." @tier "domain"
21845
21876
  height : number = 400 @label "Height" @description "Simulation height in pixels; bounds the bounce." @tier "presentation"
@@ -21847,7 +21878,8 @@ trait std-learn-live-sim.traits.LiveSimSim {
21847
21878
  restitution : number = 0.78 @label "Restitution" @description "Fraction of speed kept when a body bounces off a wall." @tier "domain"
21848
21879
  running : boolean = false @label "Running" @description "Whether the simulation starts already running on INIT." @tier "domain"
21849
21880
  showVelocity : boolean = true @label "Show Velocity" @description "Draw each body's velocity vector as an arrow." @tier "presentation"
21850
- title : string = "Live Sim" @label "Title" @description "Title shown above the instrument." @tier "presentation"
21881
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21882
+ title : string = "Live Sim" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
21851
21883
  velocityScale : number = 8 @label "Velocity Scale" @description "Length multiplier for the velocity arrows." @tier "presentation"
21852
21884
  width : number = 600 @label "Width" @description "Simulation width in pixels; bounds the bounce." @tier "presentation"
21853
21885
  }
@@ -21861,8 +21893,8 @@ trait std-learn-measure.traits.MeasureSim {
21861
21893
  linkedEntity : MeasureScene
21862
21894
  category : interaction
21863
21895
  states : (idle*)
21864
- events : (INIT MODE_SELECTED RUN PAUSE PROBE RESET RUN_TOGGLED PROBE_RECORDED MEASURE_RESET)
21865
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on PROBE) (idle -> idle on RESET))
21896
+ events : (INIT MODE_SELECTED TOGGLE_RUN SPEED_SET RUN PAUSE PROBE RESET RUN_TOGGLED PROBE_RECORDED MEASURE_RESET)
21897
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on PROBE) (idle -> idle on RESET))
21866
21898
  emits : (RUN_TOGGLED PROBE_RECORDED MEASURE_RESET)
21867
21899
  config {
21868
21900
  amplitude : number = 5 @label "Amplitude" @description "The A parameter: the signal's scale." @tier "domain"
@@ -21870,13 +21902,14 @@ trait std-learn-measure.traits.MeasureSim {
21870
21902
  gridStep : number = 1 @label "Grid Step" @tier "presentation"
21871
21903
  height : number = 360 @label "Height" @tier "presentation"
21872
21904
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21873
- probeColor : string = "#dc2626" @label "Probe Color" @tier "presentation"
21905
+ probeColor : string = "highlight" @label "Probe Color" @tier "presentation"
21874
21906
  probeLabel : string = "Probe" @label "Probe Label" @tier "presentation"
21875
21907
  rate : number = 1.2 @label "Rate" @description "The B parameter: angular rate for sine, growth rate for growth, half-life in seconds for decay." @tier "domain"
21876
- signalColor : string = "#94a3b8" @label "Signal Color" @tier "presentation"
21908
+ signalColor : string = "ink" @label "Signal Color" @tier "presentation"
21877
21909
  signalKind : string = "sine" @label "Signal Kind" @description "How the measured quantity evolves: sine (A·sin(B·t)), growth (A·(1+B)ᵗ), or decay (half-life A·(1/2)^(t/B))." @synonyms "signal family, oscillation, exponential growth, half-life decay" @tier "domain"
21910
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21878
21911
  taskText : string = "Run the signal, then press Probe to record measurements. Watch the running mean settle." @label "Task Text" @description "One-sentence statement of the measuring task." @tier "domain"
21879
- title : string = "Measurement Lab" @label "Title" @description "Title shown above the experiment." @tier "presentation"
21912
+ title : string = "Measurement Lab" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
21880
21913
  valueLabel : string = "value" @label "Value Label" @description "Display name of the measured quantity." @tier "presentation"
21881
21914
  valueMax : number = 6 @label "Value Max" @description "Upper bound of the chart's y axis." @tier "presentation"
21882
21915
  valueMin : number = -6 @label "Value Min" @description "Lower bound of the chart's y axis." @tier "presentation"
@@ -21893,11 +21926,11 @@ trait std-learn-param-explorer.traits.ParamExplorerSim {
21893
21926
  category : interaction
21894
21927
  states : (idle*)
21895
21928
  events : (INIT MODE_SELECTED SET_PARAM_A SET_PARAM_B PARAMS_CHANGED)
21896
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on SET_PARAM_A) (idle -> idle on SET_PARAM_B))
21929
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on SET_PARAM_A) (idle -> idle on SET_PARAM_B))
21897
21930
  emits : (PARAMS_CHANGED)
21898
21931
  config {
21899
21932
  animate : boolean = false @label "Animate" @tier "presentation"
21900
- color : string = "#3b82f6" @label "Curve Color" @tier "presentation"
21933
+ color : string = "series-2" @label "Curve Color" @tier "presentation"
21901
21934
  curveKind : string = "power" @label "Curve Kind" @description "Curve family the two parameters drive: power (y = A·xᴮ), linear (y = A + B·x), or sine (y = A·sin(B·x))." @synonyms "curve family, power law, linear function, sine wave, function type" @tier "domain"
21902
21935
  gridStep : number = 1 @label "Grid Step" @tier "presentation"
21903
21936
  height : number = 400 @label "Height" @tier "presentation"
@@ -21915,6 +21948,7 @@ trait std-learn-param-explorer.traits.ParamExplorerSim {
21915
21948
  paramBStep : number = 0.1 @label "Parameter B Step" @description "Slider increment for the second parameter." @tier "presentation"
21916
21949
  showAxes : boolean = true @label "Show Axes" @tier "presentation"
21917
21950
  showGrid : boolean = true @label "Show Grid" @tier "presentation"
21951
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21918
21952
  title : string = "Parameter Explorer" @label "Title" @description "Title shown above the canvas." @tier "presentation"
21919
21953
  width : number = 600 @label "Width" @tier "presentation"
21920
21954
  xMax : number = 10 @label "X Max" @description "Right edge of the sampled x range." @tier "presentation"
@@ -21930,8 +21964,8 @@ trait std-learn-perturb.traits.PerturbSim {
21930
21964
  linkedEntity : PerturbScene
21931
21965
  category : interaction
21932
21966
  states : (idle*)
21933
- events : (INIT MODE_SELECTED RUN PAUSE RESET SET_POINT SET_RATE SHOCK RUN_TOGGLED SIM_RESET SETPOINT_CHANGED RATE_CHANGED SHOCK_APPLIED)
21934
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SET_POINT) (idle -> idle on SET_RATE) (idle -> idle on SHOCK))
21967
+ events : (INIT MODE_SELECTED TOGGLE_RUN SPEED_SET RUN PAUSE RESET SET_POINT SET_RATE SHOCK RUN_TOGGLED SIM_RESET SETPOINT_CHANGED RATE_CHANGED SHOCK_APPLIED)
21968
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SET_POINT) (idle -> idle on SET_RATE) (idle -> idle on SHOCK))
21935
21969
  emits : (RUN_TOGGLED SIM_RESET SETPOINT_CHANGED RATE_CHANGED SHOCK_APPLIED)
21936
21970
  config {
21937
21971
  autoRun : boolean = true @label "Auto Run" @description "Whether the simulation starts running immediately on load." @tier "domain"
@@ -21944,7 +21978,7 @@ trait std-learn-perturb.traits.PerturbSim {
21944
21978
  rateMax : number = 3 @label "Rate Max" @tier "domain"
21945
21979
  rateMin : number = 0.05 @label "Rate Min" @tier "domain"
21946
21980
  rateStep : number = 0.05 @label "Rate Step" @tier "presentation"
21947
- setpointColor : string = "#94a3b8" @label "Setpoint Color" @tier "presentation"
21981
+ setpointColor : string = "guide" @label "Setpoint Color" @tier "presentation"
21948
21982
  setpointDefault : number = 37 @label "Setpoint Default" @tier "domain"
21949
21983
  setpointLabel : string = "Setpoint" @label "Setpoint Label" @description "Display name of the equilibrium target." @tier "domain"
21950
21984
  setpointMax : number = 44 @label "Setpoint Max" @tier "domain"
@@ -21953,9 +21987,10 @@ trait std-learn-perturb.traits.PerturbSim {
21953
21987
  shockDownLabel : string = "− Shock down" @label "Shock Down Label" @tier "presentation"
21954
21988
  shockSize : number = 4 @label "Shock Size" @description "How far a shock button knocks the quantity from its current value." @tier "domain"
21955
21989
  shockUpLabel : string = "+ Shock up" @label "Shock Up Label" @tier "presentation"
21990
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21956
21991
  taskText : string = "Run the system, shock it off its setpoint, and watch it recover — then move the setpoint mid-run." @label "Task Text" @description "One-sentence statement of what to explore." @tier "domain"
21957
- title : string = "Equilibrium & Shock" @label "Title" @description "Title shown above the simulation." @tier "presentation"
21958
- valueColor : string = "#dc2626" @label "Value Color" @tier "presentation"
21992
+ title : string = "Equilibrium & Shock" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
21993
+ valueColor : string = "highlight" @label "Value Color" @tier "presentation"
21959
21994
  valueLabel : string = "Temperature" @label "Value Label" @description "Display name of the regulated quantity." @tier "domain"
21960
21995
  valueMax : number = 46 @label "Value Max" @description "Upper bound of the chart's y axis." @tier "presentation"
21961
21996
  valueMin : number = 28 @label "Value Min" @description "Lower bound of the chart's y axis." @tier "presentation"
@@ -21973,7 +22008,7 @@ trait std-learn-predict.traits.PredictSim {
21973
22008
  category : interaction
21974
22009
  states : (idle*)
21975
22010
  events : (INIT MODE_SELECTED PREDICT NEXT RETRY PREDICTION_COMMITTED SCENARIO_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
21976
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on PREDICT) (idle -> idle on NEXT) (idle -> idle on RETRY))
22011
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on PREDICT) (idle -> idle on NEXT) (idle -> idle on RETRY))
21977
22012
  emits : (PREDICTION_COMMITTED SCENARIO_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
21978
22013
  config {
21979
22014
  gridStep : number = 25 @label "Grid Step" @tier "presentation"
@@ -21981,9 +22016,10 @@ trait std-learn-predict.traits.PredictSim {
21981
22016
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21982
22017
  nextLabel : string = "Next" @label "Next Label" @tier "presentation"
21983
22018
  retryLabel : string = "Try Again" @label "Retry Label" @tier "presentation"
21984
- revealColor : string = "#3b82f6" @label "Reveal Color" @tier "presentation"
22019
+ revealColor : string = "series-1" @label "Reveal Color" @tier "presentation"
21985
22020
  revealLabel : string = "Outcome" @label "Reveal Label" @tier "presentation"
21986
22021
  scenarios : [PredictScenario] = [{"correctIndex":1,"explanation":"With no limiting factor yet, growth compounds each season.","frames":[{"caption":"Season 1: 40 rabbits","value":40},{"caption":"Season 2: 52 rabbits","value":52},{"caption":"Season 3: 68 rabbits","value":68},{"caption":"Season 4: 88 rabbits","value":88},{"caption":"Season 5: 114 rabbits","value":114},{"caption":"Season 6: 148 rabbits — still accelerating","value":148}],"options":["It levels off","It keeps accelerating","It collapses"],"question":"What happens to the population over the next six seasons?","setup":"A small island hosts 40 rabbits with unlimited grass and no predators."},{"correctIndex":1,"explanation":"Predation and food limits impose a carrying capacity.","frames":[{"caption":"Season 1: 148 rabbits","value":148},{"caption":"Season 2: 160 rabbits","value":160},{"caption":"Season 3: 166 rabbits","value":166},{"caption":"Season 4: 169 rabbits","value":169},{"caption":"Season 5: 170 rabbits — the curve flattens","value":170}],"options":["It keeps accelerating","It levels off near a ceiling","It grows linearly"],"question":"What happens to the rabbit population now?","setup":"The same island now has foxes, and grass is running short."}] @label "Scenarios" @description "The scenario roster; each carries a setup, the question, the offered predictions with the correct index, an explanation, and the reveal frames (caption + value) that play out after the learner commits. Realizations declare their own subject's scenarios here." @tier "domain"
22022
+ summary : string = "" @label "Concept" @description "One line under the title saying what is being predicted (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21987
22023
  title : string = "Predict, Then Watch" @label "Title" @description "Title shown above the instrument." @tier "presentation"
21988
22024
  valueMax : number = 200 @label "Value Max" @description "Upper bound of the reveal chart's y axis." @tier "presentation"
21989
22025
  valueMin : number = 0 @label "Value Min" @description "Lower bound of the reveal chart's y axis." @tier "presentation"
@@ -22000,17 +22036,18 @@ trait std-learn-sample-accumulator.traits.SampleAccumulatorSim {
22000
22036
  category : interaction
22001
22037
  states : (idle*)
22002
22038
  events : (INIT MODE_SELECTED DRAW SET_BATCH_SIZE RESET SAMPLES_DRAWN ACCUMULATOR_RESET)
22003
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on DRAW) (idle -> idle on SET_BATCH_SIZE) (idle -> idle on RESET))
22039
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on DRAW) (idle -> idle on SET_BATCH_SIZE) (idle -> idle on RESET))
22004
22040
  emits : (SAMPLES_DRAWN ACCUMULATOR_RESET)
22005
22041
  config {
22006
22042
  batchSize : number = 25 @label "Batch Size" @description "Number of samples the Draw button adds per click." @synonyms "batch size, draws per click, sample batch" @tier "domain"
22007
22043
  bias : number = 0.5 @label "Bias" @description "Probability the coin source draws 1, used only when sourceKind is coin." @synonyms "probability, bernoulli parameter, coin bias, p" @tier "domain"
22008
22044
  binCount : number = 10 @label "Bin Count" @description "Number of histogram buckets across the 0..1 value range." @tier "presentation"
22009
- color : string = "#2563eb" @label "Bar Color" @tier "presentation"
22045
+ color : string = "series-1" @label "Bar Color" @tier "presentation"
22010
22046
  height : number = 400 @label "Height" @tier "presentation"
22011
22047
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22012
22048
  sourceKind : string = "uniform" @label "Source Kind" @description "Distribution each draw samples from: uniform (0..1) or coin (Bernoulli 0/1 weighted by bias)." @synonyms "uniform distribution, coin flip, bernoulli trial, random sampling, source distribution" @tier "domain"
22013
- title : string = "Sample Accumulator" @label "Title" @description "Title shown above the canvas." @tier "presentation"
22049
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22050
+ title : string = "Sample Accumulator" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
22014
22051
  width : number = 600 @label "Width" @tier "presentation"
22015
22052
  }
22016
22053
  override-surface : (linkedEntity name events effects listens emitsScope config)
@@ -22024,16 +22061,16 @@ trait std-learn-sandbox.traits.LearnSandboxSim {
22024
22061
  category : interaction
22025
22062
  states : (idle*)
22026
22063
  events : (INIT MODE_SELECTED TOGGLE RESET SYSTEM_CHANGED SANDBOX_RESET)
22027
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE) (idle -> idle on RESET))
22064
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE) (idle -> idle on RESET))
22028
22065
  emits : (SYSTEM_CHANGED SANDBOX_RESET)
22029
22066
  config {
22030
22067
  animate : boolean = false @label "Animate" @description "Enable continuous redraw loop." @tier "presentation"
22031
- backgroundColor : string = "#f8fafc" @label "Background Color" @tier "presentation"
22032
- disabledColor : string = "#cbd5e1" @label "Disabled Node Color" @tier "presentation"
22033
- disabledEdgeColor : string = "#e2e8f0" @label "Disabled Edge Color" @tier "presentation"
22068
+ backgroundColor : string = "" @label "Background Color" @tier "presentation"
22069
+ disabledColor : string = "muted" @label "Disabled Node Color" @tier "presentation"
22070
+ disabledEdgeColor : string = "guide" @label "Disabled Edge Color" @tier "presentation"
22034
22071
  elements : [LearnSandboxElement] = [{"enabled":true,"id":"a","label":"Module A","weight":15,"x":100,"y":80},{"enabled":true,"id":"b","label":"Module B","weight":20,"x":300,"y":60},{"enabled":false,"id":"c","label":"Module C","weight":10,"x":500,"y":80},{"enabled":true,"id":"d","label":"Module D","weight":25,"x":200,"y":220},{"enabled":true,"id":"e","label":"Module E","weight":18,"x":420,"y":220}] @label "Elements" @description "Roster of toggleable elements; each carries its label, its weight toward the derived total, its default enabled state, and its canvas position." @synonyms "element, node, component, module, factor, contributor" @tier "domain"
22035
- enabledColor : string = "#2563eb" @label "Enabled Node Color" @tier "presentation"
22036
- enabledEdgeColor : string = "#1e3a8a" @label "Enabled Edge Color" @tier "presentation"
22072
+ enabledColor : string = "series-2" @label "Enabled Node Color" @tier "presentation"
22073
+ enabledEdgeColor : string = "ink" @label "Enabled Edge Color" @tier "presentation"
22037
22074
  height : number = 320 @label "Height" @description "Canvas height in pixels." @tier "presentation"
22038
22075
  interactive : boolean = false @label "Interactive" @description "Enable pointer interaction on the canvas." @tier "presentation"
22039
22076
  links : [LearnSandboxLink] = [{"from":"a","to":"b"},{"from":"b","to":"c"},{"from":"a","to":"d"},{"from":"d","to":"e"}] @label "Links" @description "Declared relationships drawn between elements; a link dims when either endpoint is disabled." @synonyms "link, edge, connection, dependency, relationship" @tier "domain"
@@ -22041,6 +22078,7 @@ trait std-learn-sandbox.traits.LearnSandboxSim {
22041
22078
  nodeRadius : number = 34 @label "Node Radius" @tier "presentation"
22042
22079
  outcomeLabel : string = "System Status" @label "Outcome Label" @description "Label prefix used in the readout describing the derived total and hold status." @tier "presentation"
22043
22080
  resetLabel : string = "Reset" @label "Reset Button Label" @tier "presentation"
22081
+ summary : string = "" @label "Concept" @description "One line under the title saying what the system models (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22044
22082
  threshold : number = 60 @label "Threshold" @description "The summed weight of enabled elements must reach this value for the system to hold." @synonyms "threshold, tipping point, sufficient total" @tier "domain"
22045
22083
  title : string = "System Sandbox" @label "Title" @description "Title shown above the instrument." @tier "presentation"
22046
22084
  width : number = 640 @label "Width" @description "Canvas width in pixels." @tier "presentation"
@@ -22056,7 +22094,7 @@ trait std-learn-scatter-fit.traits.LearnScatterFitSim {
22056
22094
  category : interaction
22057
22095
  states : (idle*)
22058
22096
  events : (INIT MODE_SELECTED ADD_POINT DRAG_POINT GUESS_LINE REVEAL_FIT TOGGLE_RUN RESET LEARN_SCATTER_FIT_UPDATED LEARN_ROUND_COMPLETE)
22059
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on ADD_POINT) (idle -> idle on DRAG_POINT) (idle -> idle on GUESS_LINE) (idle -> idle on REVEAL_FIT) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
22097
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ADD_POINT) (idle -> idle on DRAG_POINT) (idle -> idle on GUESS_LINE) (idle -> idle on REVEAL_FIT) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
22060
22098
  emits : (LEARN_SCATTER_FIT_UPDATED LEARN_ROUND_COMPLETE)
22061
22099
  config {
22062
22100
  addPointLabel : string = "Add Point" @label "Add Point Button Label" @tier "presentation"
@@ -22066,10 +22104,10 @@ trait std-learn-scatter-fit.traits.LearnScatterFitSim {
22066
22104
  axisXMin : number = 0 @label "X Axis Min" @description "Lower bound of the canvas x axis, in data coordinates." @tier "domain"
22067
22105
  axisYMax : number = 100 @label "Y Axis Max" @description "Upper bound of the canvas y axis; also the ceiling curve samples clamp to and the high end of the guess-intercept slider default range." @tier "domain"
22068
22106
  axisYMin : number = 0 @label "Y Axis Min" @description "Lower bound of the canvas y axis; also the floor curve samples clamp to and the low end of the guess-intercept slider default range." @tier "domain"
22069
- fitColor : string = "#2563eb" @label "Fit Curve Color" @tier "presentation"
22107
+ fitColor : string = "series-2" @label "Fit Curve Color" @tier "presentation"
22070
22108
  fitLabel : string = "fit" @label "Fit Curve Label" @description "Legend label for the computed least-squares fit line." @tier "presentation"
22071
22109
  gridStep : number = 20 @label "Grid Step" @description "Spacing between canvas gridlines, in data coordinates." @tier "presentation"
22072
- guessColor : string = "#dc2626" @label "Guess Curve Color" @tier "presentation"
22110
+ guessColor : string = "series-3" @label "Guess Curve Color" @tier "presentation"
22073
22111
  guessInterceptCaption : string = "Guess intercept: " @label "Guess Intercept Caption" @description "Text prefixed to the current guess-intercept value above its slider." @tier "presentation"
22074
22112
  guessInterceptMax : number = 100 @label "Guess Intercept Max" @description "Upper bound of the guess-intercept slider; typically set to axisYMax." @tier "domain"
22075
22113
  guessInterceptMin : number = 0 @label "Guess Intercept Min" @description "Lower bound of the guess-intercept slider; typically set to axisYMin." @tier "domain"
@@ -22081,7 +22119,7 @@ trait std-learn-scatter-fit.traits.LearnScatterFitSim {
22081
22119
  guessSlopeMin : number = -3 @label "Guess Slope Min" @description "Lower bound of the guess-slope slider." @tier "domain"
22082
22120
  guessSlopeStep : number = 0.05 @label "Guess Slope Step" @tier "domain"
22083
22121
  height : number = 400 @label "Height" @description "Canvas height in pixels." @tier "presentation"
22084
- initialPoints : [LearnScatterFitPoint] = [{"color":"#334155","id":"p0","label":"","radius":5,"x":15,"y":25},{"color":"#334155","id":"p1","label":"","radius":5,"x":32,"y":40},{"color":"#334155","id":"p2","label":"","radius":5,"x":48,"y":44},{"color":"#334155","id":"p3","label":"","radius":5,"x":63,"y":62},{"color":"#334155","id":"p4","label":"","radius":5,"x":80,"y":70}] @label "Initial Points" @description "Scatter points the canvas starts with, in axis data coordinates; Reset reseeds from this roster." @synonyms "seed points, dataset, scatter data, sample" @tier "domain"
22122
+ initialPoints : [LearnScatterFitPoint] = [{"color":"ink","id":"p0","label":"","radius":5,"x":15,"y":25},{"color":"ink","id":"p1","label":"","radius":5,"x":32,"y":40},{"color":"ink","id":"p2","label":"","radius":5,"x":48,"y":44},{"color":"ink","id":"p3","label":"","radius":5,"x":63,"y":62},{"color":"ink","id":"p4","label":"","radius":5,"x":80,"y":70}] @label "Initial Points" @description "Scatter points the canvas starts with, in axis data coordinates; Reset reseeds from this roster." @synonyms "seed points, dataset, scatter data, sample" @tier "domain"
22085
22123
  interactive : boolean = true @label "Interactive" @description "Enable pointer interaction on the canvas — required for dragging points." @tier "presentation"
22086
22124
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22087
22125
  maxPoints : number = 20 @label "Max Points" @description "Cap on accumulated scatter points; Add Point and the auto-run tick stop once reached, until Reset." @tier "domain"
@@ -22093,12 +22131,12 @@ trait std-learn-scatter-fit.traits.LearnScatterFitSim {
22093
22131
  narrationMaxReachedSuffix : string = " — max points reached" @label "Max Reached Narration Suffix" @description "Suffix appended to the added-point narration once maxPoints is hit." @tier "domain"
22094
22132
  narrationMovedTemplate : string = "point moved" @label "Moved Narration Template" @description "Narration phrase after a point is dragged, assembled as \"<template> — r = .., R² = ..\"." @tier "domain"
22095
22133
  narrationPausedTemplate : string = "Paused — add manually with Add Point." @label "Paused Narration" @description "Narration shown after Pause is pressed." @tier "domain"
22096
- newPointColor : string = "#334155" @label "New Point Color" @description "Fill color assigned to points created by Add Point or the auto-add tick." @tier "presentation"
22134
+ newPointColor : string = "ink" @label "New Point Color" @description "Fill color assigned to points created by Add Point or the auto-add tick." @tier "presentation"
22097
22135
  newPointRadius : number = 5 @label "New Point Radius" @tier "presentation"
22098
22136
  pauseLabel : string = "Pause" @label "Pause Button Label" @tier "presentation"
22099
22137
  pointMarginPct : number = 0.05 @label "Point Margin Percent" @description "Fraction of each axis span kept clear at both ends when Add Point/the tick place a new random point, so new points never land flush against the axis edge." @tier "domain"
22100
22138
  resetLabel : string = "Reset" @label "Reset Button Label" @tier "presentation"
22101
- residualColor : string = "#f59e0b" @label "Residual Color" @tier "presentation"
22139
+ residualColor : string = "guide" @label "Residual Color" @tier "presentation"
22102
22140
  residualDash : string = "dashed" @label "Residual Dash Style" @tier "presentation" @values (dashed dotted)
22103
22141
  revealLabel : string = "Reveal Fit" @label "Reveal Fit Button Label" @tier "presentation"
22104
22142
  runLabel : string = "Run" @label "Run Button Label" @tier "presentation"
@@ -22107,6 +22145,7 @@ trait std-learn-scatter-fit.traits.LearnScatterFitSim {
22107
22145
  showR : boolean = true @label "Show r and R²" @description "Show the correlation coefficient r and coefficient of determination R² under the canvas." @synonyms "correlation coefficient, r squared, goodness of fit" @tier "domain"
22108
22146
  showResiduals : boolean = true @label "Show Residuals" @description "Draw a dashed segment from each point to the fit line — the errors least squares minimizes." @synonyms "residuals, errors, deviations" @tier "domain"
22109
22147
  showTickLabels : boolean = true @label "Show Tick Labels" @tier "presentation"
22148
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22110
22149
  title : string = "Scatter Fit" @label "Title" @description "Title shown above the canvas." @tier "presentation"
22111
22150
  width : number = 600 @label "Width" @description "Canvas width in pixels." @tier "presentation"
22112
22151
  }
@@ -22121,7 +22160,7 @@ trait std-learn-scenario.traits.ScenarioSim {
22121
22160
  category : interaction
22122
22161
  states : (idle*)
22123
22162
  events : (INIT MODE_SELECTED CHOOSE RESTART CHOICE_MADE SCENARIO_RESTARTED)
22124
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on CHOOSE) (idle -> idle on RESTART))
22163
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on CHOOSE) (idle -> idle on RESTART))
22125
22164
  emits : (CHOICE_MADE SCENARIO_RESTARTED)
22126
22165
  config {
22127
22166
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
@@ -22132,6 +22171,7 @@ trait std-learn-scenario.traits.ScenarioSim {
22132
22171
  nodes : [ScenarioNode] = [{"choices":[{"deltaA":-60,"deltaB":10,"label":"Build a levee now","next":"levee","note":"Fast protection, most of the budget gone."},{"deltaA":-25,"deltaB":-5,"label":"Restore the upstream wetlands","next":"wetlands","note":"Cheaper and greener, but slower to work."}],"id":"start","situation":"Your town's river floods every spring. The council asks you to lead the response."},{"choices":[{"deltaA":-30,"deltaB":-10,"label":"Raise the levee again","next":"end-lock-in","note":"Costs keep compounding."},{"deltaA":-20,"deltaB":15,"label":"Add wetlands as a second line","next":"end-hybrid","note":"Late, but it eases the pressure."}],"id":"levee","situation":"The levee holds the first spring, but silt builds up and the river rises higher each year."},{"choices":[{"deltaA":-15,"deltaB":25,"label":"Expand the wetland corridor","next":"end-green","note":"The town rallies behind the project."},{"deltaA":10,"deltaB":5,"label":"Bank the savings","next":"end-thrifty","note":"Prudent, though the corridor stays small."}],"id":"wetlands","situation":"Two springs pass; the wetlands now absorb most floods, and wildlife is returning."},{"choices":[],"id":"end-lock-in","situation":"You are locked into an arms race with the river: protected, but at ever-growing cost."},{"choices":[],"id":"end-hybrid","situation":"The hybrid defense works: the levee buys time and the wetlands cut the peak floods."},{"choices":[],"id":"end-green","situation":"The restored river corridor protects the town and becomes its most loved public space."},{"choices":[],"id":"end-thrifty","situation":"The town stays safe in normal years, with savings in reserve for a bigger flood."}] @label "Nodes" @description "The decision graph; each node carries a situation and its choices, each choice naming the next node, metric deltas, and a consequence note. A node with no choices ends the run. Realizations declare their own subject's decision tree here." @tier "domain"
22133
22172
  restartLabel : string = "Play Again" @label "Restart Label" @tier "presentation"
22134
22173
  startId : string = "start" @label "Start Node" @description "Id of the node the scenario opens on." @tier "domain"
22174
+ summary : string = "" @label "Concept" @description "One line under the title saying what the scenario explores (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22135
22175
  title : string = "Decision Scenario" @label "Title" @description "Title shown above the scenario." @tier "presentation"
22136
22176
  }
22137
22177
  override-surface : (linkedEntity name events effects listens emitsScope config)
@@ -22144,14 +22184,15 @@ trait std-learn-sim-3d.traits.Learn3DSimTransport {
22144
22184
  linkedEntity : Learn3DSimScene
22145
22185
  category : interaction
22146
22186
  states : (idle*)
22147
- events : (INIT MODE_SELECTED RUN PAUSE RESET SPEED_HALF SPEED_NORMAL SPEED_DOUBLE SPEED_QUAD SIM_3D_TICK SIM_3D_UPDATED)
22148
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SPEED_HALF) (idle -> idle on SPEED_NORMAL) (idle -> idle on SPEED_DOUBLE) (idle -> idle on SPEED_QUAD))
22187
+ events : (INIT MODE_SELECTED TOGGLE_RUN SPEED_SET RUN PAUSE RESET SPEED_HALF SPEED_NORMAL SPEED_DOUBLE SPEED_QUAD SIM_3D_TICK SIM_3D_UPDATED)
22188
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SPEED_HALF) (idle -> idle on SPEED_NORMAL) (idle -> idle on SPEED_DOUBLE) (idle -> idle on SPEED_QUAD))
22149
22189
  emits : (SIM_3D_TICK SIM_3D_UPDATED)
22150
22190
  config {
22151
22191
  dt : number = 0.02 @label "Timestep" @description "Simulated seconds per tick before the speed multiplier; the effective step emitted on SIM_3D_TICK is dt x speedMultiplier." @tier "domain"
22152
22192
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22153
22193
  running : boolean = true @label "Running" @description "When true the clock starts ticking on INIT; the Reset arm restores this value." @tier "domain"
22154
- title : string = "3D Simulation" @label "Title" @description "Title shown above the transport controls." @tier "presentation"
22194
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22195
+ title : string = "3D Simulation" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
22155
22196
  }
22156
22197
  override-surface : (linkedEntity name events effects listens emitsScope config)
22157
22198
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb orbitals[0].traits[0])"
@@ -22183,7 +22224,7 @@ trait std-learn-speed-drill.traits.SpeedDrillSim {
22183
22224
  category : interaction
22184
22225
  states : (idle*)
22185
22226
  events : (INIT MODE_SELECTED ANSWER NEXT RETRY ANSWER_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
22186
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on ANSWER) (idle -> idle on NEXT) (idle -> idle on RETRY))
22227
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ANSWER) (idle -> idle on NEXT) (idle -> idle on RETRY))
22187
22228
  emits : (ANSWER_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
22188
22229
  config {
22189
22230
  basePoints : number = 10 @label "Base Points" @description "Points for a correct answer regardless of speed." @tier "domain"
@@ -22192,6 +22233,7 @@ trait std-learn-speed-drill.traits.SpeedDrillSim {
22192
22233
  nextLabel : string = "Next" @label "Next Label" @tier "presentation"
22193
22234
  retryLabel : string = "Try Again" @label "Retry Label" @tier "presentation"
22194
22235
  speedBonus : number = 10 @label "Speed Bonus" @description "Maximum extra points awarded in proportion to the time left on the clock." @tier "domain"
22236
+ summary : string = "" @label "Concept" @description "One line under the title saying what is being drilled (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22195
22237
  timeLimit : number = 6 @label "Time Limit" @description "Seconds the learner has to answer each item before it counts as a miss." @tier "domain"
22196
22238
  title : string = "Speed Drill" @label "Title" @description "Title shown above the drill." @tier "presentation"
22197
22239
  }
@@ -22206,7 +22248,7 @@ trait std-learn-stepper.traits.LearnStepperSim {
22206
22248
  category : interaction
22207
22249
  states : (idle*)
22208
22250
  events : (INIT MODE_SELECTED NEXT PREV FILTER_CATEGORY RESET_STEPPER STEPPER_ADVANCED)
22209
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on NEXT) (idle -> idle on PREV) (idle -> idle on FILTER_CATEGORY) (idle -> idle on RESET_STEPPER))
22251
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on NEXT) (idle -> idle on PREV) (idle -> idle on FILTER_CATEGORY) (idle -> idle on RESET_STEPPER))
22210
22252
  emits : (STEPPER_ADVANCED)
22211
22253
  config {
22212
22254
  allLabel : string = "All" @label "All Filter Label" @tier "presentation"
@@ -22216,8 +22258,8 @@ trait std-learn-stepper.traits.LearnStepperSim {
22216
22258
  axisMarginLeft : number = 60 @label "Axis Left Margin" @tier "presentation"
22217
22259
  axisMarginRight : number = 60 @label "Axis Right Margin" @tier "presentation"
22218
22260
  axisY : number = 220 @label "Axis Y" @description "Canvas y-position of the horizontal axis." @tier "presentation"
22219
- backgroundColor : string = "#f8fafc" @label "Background Color" @tier "presentation"
22220
- categories : [LearnStepperCategory] = [{"category":"a","color":"#7c3aed","label":"Category A"},{"category":"b","color":"#15803d","label":"Category B"}] @label "Categories" @description "Marker color and button label per stage category, used for the axis dots, the legend, the FILTER_CATEGORY buttons, and the running per-category tally." @synonyms "category color, category legend, stage category, filter lens" @tier "domain"
22261
+ backgroundColor : string = "" @label "Background Color" @description "Canvas ground override; empty uses the theme's drawing ground." @tier "presentation"
22262
+ categories : [LearnStepperCategory] = [{"category":"a","color":"series-1","label":"Category A"},{"category":"b","color":"series-2","label":"Category B"}] @label "Categories" @description "Marker color and button label per stage category, used for the axis dots, the legend, the FILTER_CATEGORY buttons, and the running per-category tally." @synonyms "category color, category legend, stage category, filter lens" @tier "domain"
22221
22263
  categorySummaries : [LearnStepperCategorySummary] = [{"category":"a","summary":"Viewed through Category A alone, only the stages tagged A are highlighted."},{"category":"b","summary":"Viewed through Category B alone, only the stages tagged B are highlighted."}] @label "Category Summaries" @description "Narrative summary shown when the learner filters the sequence to a single category — how the sequence reads through that lens alone." @synonyms "historiographical lens, primary source lens, single-cause narrative, category narrative, visible thread" @tier "domain"
22222
22264
  height : number = 420 @label "Height" @description "Canvas height in pixels." @tier "presentation"
22223
22265
  interactive : boolean = false @label "Interactive" @description "Enable pointer interaction on the canvas." @tier "presentation"
@@ -22228,8 +22270,9 @@ trait std-learn-stepper.traits.LearnStepperSim {
22228
22270
  minPosition : number = 0 @label "Min Position" @description "Earliest position on the axis (before the first stage)." @tier "domain"
22229
22271
  stages : [LearnStepperStage] = [{"category":"a","description":"First stage in the sequence.","id":"stage-1","label":"Stage One","position":1},{"category":"b","description":"Second stage in the sequence.","id":"stage-2","label":"Stage Two","position":2},{"category":"a","description":"Third stage in the sequence.","id":"stage-3","label":"Stage Three","position":3}] @label "Stages" @description "Ordered roster of stages (position, label, category, description) stepped through by NEXT/PREV and filtered by FILTER_CATEGORY. Sorted ascending by position." @synonyms "stage roster, sequence, timeline, cycle, phase, event roster, ordered stages" @tier "domain"
22230
22272
  startPrompt : string = "Press Next to begin." @label "Start Prompt" @description "Narration shown before the learner has advanced past the first stage." @tier "presentation"
22231
- title : string = "Stepper" @label "Title" @description "Title shown above the instrument." @tier "presentation"
22232
- unreachedColor : string = "#d6d3d1" @label "Unreached Marker Color" @description "Color of stage markers the learner has not yet stepped to." @tier "presentation"
22273
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22274
+ title : string = "Stepper" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
22275
+ unreachedColor : string = "muted" @label "Unreached Marker Color" @description "Color of stage markers the learner has not yet stepped to." @tier "presentation"
22233
22276
  width : number = 640 @label "Width" @description "Canvas width in pixels." @tier "presentation"
22234
22277
  }
22235
22278
  override-surface : (linkedEntity name events effects listens emitsScope config)
@@ -22243,12 +22286,12 @@ trait std-learn-tour-3d.traits.Learn3DTourSim {
22243
22286
  category : interaction
22244
22287
  states : (idle*)
22245
22288
  events : (INIT MODE_SELECTED TOUR SELECT_STATION RESET SYNC_STATIONS TOUR_3D_UPDATED LEARN_ROUND_COMPLETE)
22246
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on TOUR) (idle -> idle on SELECT_STATION) (idle -> idle on RESET) (idle -> idle on SYNC_STATIONS))
22289
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOUR) (idle -> idle on SELECT_STATION) (idle -> idle on RESET) (idle -> idle on SYNC_STATIONS))
22247
22290
  emits : (TOUR_3D_UPDATED LEARN_ROUND_COMPLETE)
22248
22291
  config {
22249
22292
  azimuth : number = 0.6 @label "Azimuth" @description "Camera orbit azimuth in radians; the learner can orbit freely on top of this." @tier "presentation"
22250
22293
  backdrop : [Learn3DStation] = [] @label "Backdrop Nodes" @description "Non-station scene geometry rendered under the tour stations (painted first, stations on top) — painted but never tour stops and never highlight-selected; SYNC_STATIONS swaps it together with the roster, so a composed preset coordinator can re-skin the whole scene per preset." @synonyms "backdrop, scenery, geometry, context nodes, 3d" @tier "domain"
22251
- backgroundColor : string = "#0f172a" @label "Background Color" @description "Canvas background color — a dark stage makes translucent shells and station colors read in 3D." @tier "presentation"
22294
+ backgroundColor : string = "" @label "Background Color" @description "Canvas ground. Empty uses the theme drawing ground." @tier "presentation"
22252
22295
  edges : [Learn3DEdge] = [] @label "Edges" @description "Optional connector lines drawn between stations, by id." @synonyms "edge, link, connector, tether" @tier "domain"
22253
22296
  fov : number = 50 @label "Field of View" @description "Perspective camera field of view in degrees." @tier "presentation"
22254
22297
  height : number = 400 @label "Height" @description "Canvas height in pixels." @tier "presentation"
@@ -22256,9 +22299,10 @@ trait std-learn-tour-3d.traits.Learn3DTourSim {
22256
22299
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22257
22300
  post : Post3D = {} @label "Post Processing" @description "3D post-processing stack (bloom/vignette) as data; empty object disables it." @tier "presentation"
22258
22301
  resetLabel : string = "Reset" @label "Reset Button Label" @description "Label text for the button that returns the tour to the first station." @tier "presentation"
22259
- stations : [Learn3DStation] = [{"caption":"The first stop on the tour — the camera retargets here and the narration reads its caption.","color":"#2563eb","id":"alpha","name":"Station Alpha","opacity":1,"radius":1,"shape":"sphere","x":0,"y":0,"z":0},{"caption":"The second stop — press Tour again or click a shape to advance the selection.","color":"#7c3aed","id":"beta","name":"Station Beta","opacity":1,"radius":0.8,"shape":"sphere","x":3,"y":1,"z":-1},{"caption":"The final stop — once every station has been visited the tour marks itself complete.","color":"#0891b2","id":"gamma","name":"Station Gamma","opacity":1,"radius":0.8,"shape":"sphere","x":-3,"y":-1,"z":1}] @label "Stations" @description "The station roster in didactic tour order — each with scene position, mesh shape, and a caption. Tour and clicks enlarge the selected station, retarget the camera onto its x/y/z, and narrate its caption." @synonyms "station, stop, waypoint, tour, landmark, 3d" @tier "domain"
22302
+ stations : [Learn3DStation] = [{"caption":"The first stop on the tour — the camera retargets here and the narration reads its caption.","color":"series-1","id":"alpha","name":"Station Alpha","opacity":1,"radius":1,"shape":"sphere","x":0,"y":0,"z":0},{"caption":"The second stop — press Tour again or click a shape to advance the selection.","color":"series-2","id":"beta","name":"Station Beta","opacity":1,"radius":0.8,"shape":"sphere","x":3,"y":1,"z":-1},{"caption":"The final stop — once every station has been visited the tour marks itself complete.","color":"series-3","id":"gamma","name":"Station Gamma","opacity":1,"radius":0.8,"shape":"sphere","x":-3,"y":-1,"z":1}] @label "Stations" @description "The station roster in didactic tour order — each with scene position, mesh shape, and a caption. Tour and clicks enlarge the selected station, retarget the camera onto its x/y/z, and narrate its caption." @synonyms "station, stop, waypoint, tour, landmark, 3d" @tier "domain"
22303
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22260
22304
  title : string = "3D Guided Tour" @label "Title" @description "Title shown above the canvas." @tier "presentation"
22261
- tourLabel : string = "Tour" @label "Tour Button Label" @description "Label text for the button that advances the tour to the next station." @tier "presentation"
22305
+ tourLabel : string = "Next station" @label "Tour Button Label" @description "Label text for the button that advances the tour to the next station." @tier "presentation"
22262
22306
  width : number = 600 @label "Width" @description "Canvas width in pixels." @tier "presentation"
22263
22307
  zoom : number = 1 @label "Zoom" @description "Camera zoom factor for the 3D scene." @tier "presentation"
22264
22308
  }
@@ -22272,19 +22316,20 @@ trait std-learn-trace-player.traits.TracePlayerSim {
22272
22316
  linkedEntity : TracePlayerScene
22273
22317
  category : interaction
22274
22318
  states : (idle*)
22275
- events : (INIT MODE_SELECTED PLAY PAUSE RESTART FRAME_ADVANCED TRACE_DONE)
22276
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on PLAY) (idle -> idle on PAUSE) (idle -> idle on RESTART))
22319
+ events : (INIT MODE_SELECTED TOGGLE_RUN SPEED_SET PLAY PAUSE RESTART FRAME_ADVANCED TRACE_DONE)
22320
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on PLAY) (idle -> idle on PAUSE) (idle -> idle on RESTART))
22277
22321
  emits : (FRAME_ADVANCED TRACE_DONE)
22278
22322
  config {
22279
- backgroundColor : string = "#f8fafc" @label "Background Color" @tier "presentation"
22280
- baseColor : string = "#3b82f6" @label "Base Bar Color" @description "Color of bars not highlighted in the current frame." @tier "presentation"
22323
+ backgroundColor : string = "" @label "Background Color" @description "Canvas ground override; empty uses the theme's drawing ground." @tier "presentation"
22324
+ baseColor : string = "series-1" @label "Base Bar Color" @description "Color of bars not highlighted in the current frame." @tier "presentation"
22281
22325
  frames : [TraceFrame] = [{"caption":"Unsorted array.","highlights":[],"label":"Start","values":[5,3,8,1,9,2]},{"caption":"Compare the first two elements; 5 > 3 so swap them.","highlights":[0,1],"label":"Compare 5, 3","values":[3,5,8,1,9,2]},{"caption":"Compare the next pair; already in order.","highlights":[1,2],"label":"Compare 5, 8","values":[3,5,8,1,9,2]},{"caption":"8 > 1 so swap them.","highlights":[2,3],"label":"Compare 8, 1","values":[3,5,1,8,9,2]},{"caption":"Already in order.","highlights":[3,4],"label":"Compare 8, 9","values":[3,5,1,8,9,2]},{"caption":"9 > 2 so swap them; one pass complete.","highlights":[4,5],"label":"Compare 9, 2","values":[3,5,1,8,2,9]}] @label "Frames" @description "Ordered roster of frames (label, caption, values, highlights) stepped through by Play/Pause/Restart. Each frame's values render as bars; highlighted indices pick out which bars changed." @synonyms "trace, animation frames, snapshot roster, playback sequence, keyframes" @tier "domain"
22282
22326
  height : number = 400 @label "Height" @description "Canvas height in pixels." @tier "presentation"
22283
- highlightColor : string = "#f59e0b" @label "Highlight Bar Color" @description "Color of bars whose index appears in the current frame's highlights." @tier "presentation"
22327
+ highlightColor : string = "highlight" @label "Highlight Bar Color" @description "Color of bars whose index appears in the current frame's highlights." @tier "presentation"
22284
22328
  loop : boolean = false @label "Loop" @description "When true, autoplay wraps from the last frame back to the first instead of stopping and emitting TRACE_DONE." @tier "domain"
22285
22329
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22330
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22286
22331
  tickMs : number = 500 @label "Tick Milliseconds" @description "Milliseconds per frame shown in the readout; the autoplay cadence." @tier "presentation"
22287
- title : string = "Trace Player" @label "Title" @description "Title shown above the instrument." @tier "presentation"
22332
+ title : string = "Trace Player" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
22288
22333
  width : number = 600 @label "Width" @description "Canvas width in pixels." @tier "presentation"
22289
22334
  }
22290
22335
  override-surface : (linkedEntity name events effects listens emitsScope config)
@@ -22297,14 +22342,16 @@ trait std-learn-transport.traits.LearnTransportSim {
22297
22342
  linkedEntity : LearnTransportScene
22298
22343
  category : interaction
22299
22344
  states : (idle*)
22300
- events : (INIT MODE_SELECTED STEP TOGGLE_RUN RESET LEARN_STEP LEARN_RESET LEARN_UPDATED)
22301
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on STEP) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
22345
+ events : (INIT MODE_SELECTED STEP TOGGLE_RUN RESET SPEED_SET LEARN_STEP LEARN_RESET LEARN_UPDATED)
22346
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on STEP) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET) (idle -> idle on SPEED_SET))
22302
22347
  emits : (LEARN_STEP LEARN_RESET LEARN_UPDATED)
22303
22348
  config {
22304
22349
  autoRun : boolean = false @label "Auto Run" @description "When true the clock starts stepping on INIT; the Reset arm restores this value." @tier "domain"
22305
22350
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22306
22351
  stepIntervalMs : number = 500 @label "Step Interval (ms)" @description "Milliseconds of running clock per domain step — the 32ms base tick accumulates elapsed time and fires LEARN_STEP each time this interval elapses. 300-900 suits narrated steppers; 32 fires every frame for continuous sims." @tier "domain"
22307
- title : string = "Learning Instrument" @label "Title" @description "Title shown above the transport controls." @tier "presentation"
22352
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22353
+ title : string = "Learning Instrument" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
22354
+ totalSteps : int = 0 @label "Total Steps" @description "When the walk has a known length, the step counter reads 'Step N of M'. 0 means open-ended." @tier "presentation"
22308
22355
  }
22309
22356
  override-surface : (linkedEntity name events effects listens emitsScope config)
22310
22357
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-transport.orb orbitals[0].traits[0])"
@@ -22317,15 +22364,16 @@ trait std-learn-tree.traits.LearnTreeSim {
22317
22364
  category : interaction
22318
22365
  states : (idle*)
22319
22366
  events : (INIT MODE_SELECTED INSERT_VALUE DELETE_VALUE RUN_TRAVERSAL TOGGLE_RUN RESET TREE_UPDATED)
22320
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on INSERT_VALUE) (idle -> idle on DELETE_VALUE) (idle -> idle on RUN_TRAVERSAL) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
22367
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on INSERT_VALUE) (idle -> idle on DELETE_VALUE) (idle -> idle on RUN_TRAVERSAL) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
22321
22368
  emits : (TREE_UPDATED)
22322
22369
  config {
22323
22370
  autoRun : boolean = false @label "Auto Run" @description "When true, the tick auto-steps the traversal sweep started by Traverse; toggle live with the Run/Pause button. Has no effect on Insert/Delete, which stay manual." @synonyms "auto run, auto step, auto play" @tier "domain"
22324
- backgroundColor : string = "#f8fafc" @label "Background Color" @description "Canvas background color." @tier "presentation"
22371
+ backgroundColor : string = "" @label "Background Color" @description "Canvas ground. Empty uses the theme drawing ground." @tier "presentation"
22325
22372
  balanced : boolean = false @label "Balance Readout" @description "When true, each insert's narration reports the tree's current height against its node count so the learner can judge balance; no auto-rotation is performed." @synonyms "balance, height, balance readout" @tier "domain"
22326
22373
  height : number = 400 @label "Height" @description "Canvas height in pixels." @tier "presentation"
22327
22374
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22328
22375
  showComparisons : boolean = true @label "Show Comparisons" @description "Include each left/right comparison in the narration while a value descends; turn off for a terse attach-only narration." @synonyms "comparisons, narration detail" @tier "presentation"
22376
+ summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22329
22377
  title : string = "Ordered Tree" @label "Title" @description "Title shown above the canvas." @tier "presentation"
22330
22378
  traversalKind : string = "inorder" @label "Traversal Kind" @description "Which sweep Traverse replays — inorder (sorted order, left to right), preorder (root before children), or levelorder (breadth first, top to bottom)." @synonyms "traversal, in-order, pre-order, level-order, sweep" @tier "domain"
22331
22379
  values : [number] = [50,30,70,20,40,60,80] @label "Values" @description "The values Insert feeds into the tree, one per descent, in order." @synonyms "keys, values to insert, dataset, sequence" @tier "domain"
@@ -22357,45 +22405,6 @@ trait std-lifecycle.traits.LifecycleScheduler {
22357
22405
  source : "@almadar/std (behaviors/registry/infra/atoms/std-lifecycle.orb orbitals[0].traits[0])"
22358
22406
  }
22359
22407
 
22360
- ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-list.orb orbitals[0].traits[0])
22361
- trait std-list.traits.ListItemBrowse {
22362
- alias : List
22363
- linkedEntity : ListItem
22364
- category : interaction
22365
- states : (loading* browsing error)
22366
- events : (INIT ListItemLoaded ListItemLoadFailed REFETCH_QUERY REFETCH_FILTER REFETCH_PAGE RETRY CREATE EDIT DELETE)
22367
- transitions : ((loading -> loading on INIT) (loading -> browsing on ListItemLoaded) (loading -> error on ListItemLoadFailed) (browsing -> loading on INIT) (browsing -> browsing on REFETCH_QUERY) (browsing -> browsing on REFETCH_FILTER) (browsing -> browsing on REFETCH_PAGE) (browsing -> browsing on ListItemLoadFailed) (browsing -> browsing on ListItemLoaded) (error -> loading on INIT) (error -> loading on RETRY))
22368
- emits : (CREATE EDIT DELETE ListItemLoaded ListItemLoadFailed)
22369
- config {
22370
- bodySearch : boolean = false @label "Show the list's own search box?" @description "Embeds a search box above the grid. Set true only when the page has no other search affordance (e.g. no page-level std-search), so the surface shows one search box instead of two. False is the default — this atom has never had a search box (0 consumers today)." @synonyms "inline search, list search, built-in search, show search" @tier "presentation"
22371
- createRoles : [string] = [] @label "Roles that can create" @description "Roles (matched against viewerRole) that see the Create button. Empty = everyone." @tier "policy"
22372
- displayPageSize : number = 20 @label "How many rows to show at once?" @description "Rows visible per page before the data-grid's own pagination control appears — 20 matches the CRUD-list density sweet spot (Miller's law, 10-25 rows)." @synonyms "visible rows, items per page, display limit, show per page" @tier "presentation"
22373
- filterBarLook : string = "toolbar" @label "Filter bar look" @description "Visual treatment for the embedded filter bar, mirroring std-filter's own enum. Only applies when `filters` is non-empty." @synonyms "filter bar style, facet style, chips, pills" @tier "presentation" @values (toolbar chips pills popover-trigger inline-column-header)
22374
- filters : [FilterSpec] = [] @label "Which filters should appear above the grid?" @description "Dropdown filter facets by field, rendered as an embedded filter bar above the rows; each selection fires REFETCH_FILTER on this trait. Empty (the default) = no filter bar, the right setting whenever the page already composes std-filter beside this list and routes XFilter.FILTER -> REFETCH_FILTER — that is the wired owner and remains the primary path. Use this knob only for a standalone list with no page-level filter affordance." @synonyms "filter bar, faceted filters, field filters, dropdowns" @tier "presentation"
22375
- itemActions : [ItemAction] = [{"event":"EDIT","label":"Edit","variant":"ghost"},{"event":"DELETE","label":"Delete","variant":"danger"}] @label "Row actions" @description "Actions offered on each row; give an item `roles` to show it only to those viewer roles." @tier "presentation"
22376
- itemClickEvent : event = "EDIT" @label "Which event does clicking a row fire?" @description "Row-click channel; empty = rows are not clickable." @synonyms "row click event, item click, open event" @tier "presentation"
22377
- pageSize : number = 20 @label "How many rows per page when paging?" @description "Records fetched from the server per REFETCH_PAGE request. The initial load and search/filter refetches remain unpaginated (load everything that matches) unless a consumer wires REFETCH_PAGE, so the default list surface is unchanged." @synonyms "fetch limit, records per page, page limit" @tier "presentation"
22378
- searchField : string = "name" @label "Which column does the search box match against?" @description "Name the field on this entity the search box's str/includes filter matches against. Declared, never inferred: an entity with no `name` column must set this to a real field (e.g. title, label) or the search box can never match a row." @synonyms "search column, search on field, match field, search key" @tier "policy"
22379
- searchPlaceholder : string = "Search…" @label "Search box placeholder text" @description "Hint text inside the list search box." @synonyms "search hint, placeholder, search box text" @tier "presentation"
22380
- viewerRole : string = "" @label "Viewer's role" @description "The signed-in viewer's role that each action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show." @tier "policy"
22381
- }
22382
- override-surface : (linkedEntity name events effects listens emitsScope config)
22383
- source : "@almadar/std (behaviors/registry/ui/core/atoms/std-list.orb orbitals[0].traits[0])"
22384
- }
22385
-
22386
- ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-list.orb orbitals[0].traits[1])
22387
- trait std-list.traits.ListItemPersistor {
22388
- alias : List
22389
- linkedEntity : ListItem
22390
- category : lifecycle
22391
- states : (idle*)
22392
- events : (INIT DO_CREATE DO_UPDATE DO_DELETE ITEM_CREATED ITEM_UPDATED ITEM_DELETED)
22393
- transitions : ((idle -> idle on INIT) (idle -> idle on DO_CREATE) (idle -> idle on DO_UPDATE) (idle -> idle on DO_DELETE))
22394
- emits : (ITEM_CREATED ITEM_UPDATED ITEM_DELETED)
22395
- override-surface : (linkedEntity name events effects listens emitsScope config)
22396
- source : "@almadar/std (behaviors/registry/ui/core/atoms/std-list.orb orbitals[0].traits[1])"
22397
- }
22398
-
22399
22408
  ;; From @almadar/std (behaviors/registry/ui/game/atoms/std-lives.orb orbitals[0].traits[0])
22400
22409
  trait std-lives.traits.Lives {
22401
22410
  alias : Lives
@@ -23662,10 +23671,12 @@ trait std-site-header.traits.SiteHeaderRender {
23662
23671
  brandName : string = "Almadar" @label "Brand name" @synonyms "site name, company, logo text" @tier "presentation"
23663
23672
  currentLanguage : string = "en" @label "Current language" @description "The code of the language this page is in" @synonyms "locale, active language, page language" @tier "presentation"
23664
23673
  currentPath : string = "/" @label "Current page path" @description "Marks the matching link as active" @tier "presentation"
23665
- headerContent : render-ui = {"children":[{"actions":["@trait.SiteHeaderLanguages",{"action":"NAV_LINK","actionPayload":{"href":"@config.actionHref","label":"@config.actionLabel"},"className":["if",["==","@config.actionLabel",""],"hidden",""],"href":"@config.actionHref","label":"@config.actionLabel","size":"sm","type":"button","variant":"primary"}],"brandName":"@config.brandName","className":"hidden lg:flex","logoSrc":"@config.logoSrc","navigationItems":["array/map","@config.links",["fn","entry",{"active":["==",["object/get","@entry","href",""],"@config.currentPath"],"children":["array/map",["object/get","@entry","children",[]],["fn","child",{"active":["==",["object/get","@child","href",""],"@config.currentPath"],"href":["object/get","@child","href",""],"label":["object/get","@child","label",""]}]],"href":["object/get","@entry","href",""],"label":["object/get","@entry","label",""]}]],"showMenuToggle":false,"sticky":false,"type":"header","variant":"desktop"},{"actions":["@trait.SiteHeaderLanguages"],"brandName":"@config.brandName","className":"lg:hidden","isMenuOpen":"@entity.menuOpen","logoSrc":"@config.logoSrc","onMenuToggle":"MENU_TOGGLE","showMenuToggle":true,"sticky":false,"type":"header","variant":"mobile"},{"align":"stretch","children":[{"align":"stretch","children":["array/map","@config.links",["fn",["entry"],{"align":"stretch","children":[{"action":"NAV_LINK","actionPayload":{"href":["object/get","@entry","href",""],"label":["object/get","@entry","label",""]},"className":"justify-start","href":["object/get","@entry","href",""],"label":["object/get","@entry","label",""],"type":"button","variant":["if",["==",["object/get","@entry","href",""],"@config.currentPath"],"secondary","ghost"]},{"align":"stretch","children":["array/map",["object/get","@entry","children",[]],["fn",["child"],{"action":"NAV_LINK","actionPayload":{"href":["object/get","@child","href",""],"label":["object/get","@child","label",""]},"className":"justify-start","href":["object/get","@child","href",""],"label":["object/get","@child","label",""],"type":"button","variant":["if",["==",["object/get","@child","href",""],"@config.currentPath"],"secondary","ghost"]}]],"className":"ps-6","direction":"vertical","gap":"xs","type":"stack"}],"direction":"vertical","gap":"xs","type":"stack"}]],"direction":"vertical","gap":"xs","type":"stack"},{"action":"NAV_LINK","actionPayload":{"href":"@config.actionHref","label":"@config.actionLabel"},"className":["if",["==","@config.actionLabel",""],"hidden","mt-2 w-full"],"href":"@config.actionHref","label":"@config.actionLabel","size":"md","type":"button","variant":"primary"}],"className":["if","@entity.menuOpen","lg:hidden border-b border-border bg-card px-4 py-3","hidden"],"direction":"vertical","gap":"xs","type":"stack"}],"className":"sticky top-0 z-50","direction":"vertical","gap":"none","type":"stack"} @label "Header body" @tier "internal"
23674
+ headerContent : render-ui = {"children":[{"actions":["@trait.SiteHeaderLanguages",{"className":["if","@config.showThemeToggle","","hidden"],"size":"sm","type":"theme-toggle"},{"action":"NAV_LINK","actionPayload":{"href":"@config.actionHref","label":"@config.actionLabel"},"className":["if",["==","@config.actionLabel",""],"hidden",""],"href":"@config.actionHref","label":"@config.actionLabel","size":"sm","type":"button","variant":"primary"}],"brandHref":"@config.homeHref","brandName":"@config.brandName","className":"hidden lg:flex","logoSrc":"@config.logoSrc","navigationItems":["array/map","@config.links",["fn","entry",{"active":["==",["object/get","@entry","href",""],"@config.currentPath"],"children":["array/map",["object/get","@entry","children",[]],["fn","child",{"active":["==",["object/get","@child","href",""],"@config.currentPath"],"href":["object/get","@child","href",""],"label":["object/get","@child","label",""]}]],"href":["object/get","@entry","href",""],"label":["object/get","@entry","label",""]}]],"showMenuToggle":false,"sticky":false,"type":"header","variant":"desktop"},{"actions":["@trait.SiteHeaderLanguages",{"className":["if","@config.showThemeToggle","","hidden"],"size":"sm","type":"theme-toggle"}],"brandHref":"@config.homeHref","brandName":"@config.brandName","className":"lg:hidden","isMenuOpen":"@entity.menuOpen","logoSrc":"@config.logoSrc","onMenuToggle":"MENU_TOGGLE","showMenuToggle":true,"sticky":false,"type":"header","variant":"mobile"},{"align":"stretch","children":[{"align":"stretch","children":["array/map","@config.links",["fn",["entry"],{"align":"stretch","children":[{"action":"NAV_LINK","actionPayload":{"href":["object/get","@entry","href",""],"label":["object/get","@entry","label",""]},"className":"justify-start","href":["object/get","@entry","href",""],"label":["object/get","@entry","label",""],"type":"button","variant":["if",["==",["object/get","@entry","href",""],"@config.currentPath"],"secondary","ghost"]},{"align":"stretch","children":["array/map",["object/get","@entry","children",[]],["fn",["child"],{"action":"NAV_LINK","actionPayload":{"href":["object/get","@child","href",""],"label":["object/get","@child","label",""]},"className":"justify-start","href":["object/get","@child","href",""],"label":["object/get","@child","label",""],"type":"button","variant":["if",["==",["object/get","@child","href",""],"@config.currentPath"],"secondary","ghost"]}]],"className":"ps-6","direction":"vertical","gap":"xs","type":"stack"}],"direction":"vertical","gap":"xs","type":"stack"}]],"direction":"vertical","gap":"xs","type":"stack"},{"action":"NAV_LINK","actionPayload":{"href":"@config.actionHref","label":"@config.actionLabel"},"className":["if",["==","@config.actionLabel",""],"hidden","mt-2 w-full"],"href":"@config.actionHref","label":"@config.actionLabel","size":"md","type":"button","variant":"primary"}],"className":["if","@entity.menuOpen","lg:hidden border-b border-border bg-card px-4 py-3","hidden"],"direction":"vertical","gap":"xs","type":"stack"}],"className":"sticky top-0 z-50","direction":"vertical","gap":"none","type":"stack"} @label "Header body" @tier "internal"
23675
+ homeHref : string = "" @label "Home link" @description "Where the brand (logo + name) links to, usually the site's home page; empty leaves the brand unlinked" @synonyms "logo link, home page, brand link" @tier "presentation"
23666
23676
  languages : [SiteLanguage] = [] @label "Languages" @description "Every language this page exists in, each named in its own language, with the href of THIS page in that language (default language at the root, others under /<code>/). Empty hides the language picker." @synonyms "locales, translations, language switcher, i18n" @tier "presentation"
23667
23677
  links : [SiteNavLink] = [{"href":"/features","label":"Features"},{"href":"/pricing","label":"Pricing"},{"href":"/about","label":"About"}] @label "Navigation links" @synonyms "menu, nav items, top navigation" @tier "presentation"
23668
23678
  logoSrc : string = "" @label "Logo image" @description "Logo URL; empty shows the name only" @tier "presentation"
23679
+ showThemeToggle : boolean = false @label "Light/dark toggle" @description "Show a button that switches the site between its light and dark mode" @synonyms "dark mode, theme switch, color mode" @tier "presentation"
23669
23680
  }
23670
23681
  override-surface : (linkedEntity name events effects listens emitsScope config)
23671
23682
  source : "@almadar/std (behaviors/registry/ui/core/atoms/std-site-header.orb orbitals[0].traits[0])"
@@ -23725,7 +23736,7 @@ trait std-stats.traits.StatsItemStats {
23725
23736
  heroMetricBodyContent : render-ui = {"children":[["if",["!=","@config.title",""],{"content":"@config.title","type":"typography","variant":"h3"},{"children":[],"gap":"none","type":"stack"}],{"entity":"@entity.cards","fields":[],"gap":"none","renderItem":["fn","card",{"children":[{"children":[{"align":"center","children":[{"align":"center","children":[{"color":"muted","name":"@card.icon","size":"md","type":"icon"},{"className":"uppercase tracking-widest","color":"muted","content":"@card.label","type":"typography","variant":"overline","weight":"bold"}],"direction":"horizontal","gap":"sm","justify":"center","type":"stack"},{"align":"baseline","children":[{"color":"muted","content":"@card.prefix","type":"typography","variant":"h2","weight":"normal"},{"className":"text-7xl md:text-8xl font-bold tracking-tighter tabular-nums text-[var(--color-foreground)]","format":"@card.format","type":"animated-counter","value":"@card.value"},{"color":"muted","content":"@card.suffix","type":"typography","variant":"h2","weight":"normal"}],"className":"py-section","direction":"horizontal","gap":"xs","justify":"center","type":"stack"},{"showValue":true,"size":"md","type":"trend-indicator","value":"@card.trend"}],"className":"relative z-10 w-full max-w-2xl mx-auto text-center","direction":"vertical","gap":"md","type":"stack"},{"className":"absolute inset-x-0 bottom-0 w-full opacity-10 pointer-events-none","color":"auto","data":"@card.sparklineData","fill":true,"height":96,"strokeWidth":1,"type":"sparkline"}],"look":"elevated","padding":"lg","type":"card"}],"className":"relative w-full rounded-xl shadow-lg overflow-hidden","direction":"vertical","gap":"none","type":"stack"}],"type":"data-list"}],"data-theme":"@config.theme","type":"box"} @label "Hero metric body content tree" @description "Render-ui SExpr for statsLook='hero-metric' — one elevated card, one oversize number, background sparkline." @tier "internal"
23726
23737
  kpiTilesBodyContent : render-ui = {"children":[["if",["!=","@config.title",""],{"content":"@config.title","type":"typography","variant":"h3"},{"children":[],"gap":"none","type":"stack"}],{"className":"w-full","entity":"@entity.cards","fields":[],"gap":"lg","minCardWidth":220,"renderItem":["fn","card",{"children":[{"align":"center","children":[{"className":"uppercase tracking-wide","color":"muted","content":"@card.label","type":"typography","variant":"caption","weight":"medium"},{"color":"muted","name":"@card.icon","size":"sm","type":"icon"}],"direction":"horizontal","gap":"xs","justify":"between","type":"stack"},{"align":"baseline","children":[{"color":"muted","content":"@card.prefix","type":"typography","variant":"caption"},{"className":"text-4xl font-bold tracking-tight","format":"@card.format","type":"animated-counter","value":"@card.value"},{"color":"muted","content":"@card.suffix","type":"typography","variant":"caption"}],"direction":"horizontal","gap":"xs","type":"stack"},{"align":"center","children":[{"showValue":true,"size":"sm","type":"trend-indicator","value":"@card.trend"},{"className":"flex-1","color":"auto","data":"@card.sparklineData","fill":true,"height":24,"type":"sparkline"}],"direction":"horizontal","gap":"sm","type":"stack"}],"className":"rounded-lg border border-[var(--color-border)] bg-[var(--color-surface)] p-card-lg shadow-elevation-sm hover:shadow-elevation-md transition-shadow","direction":"vertical","gap":"sm","type":"stack"}],"type":"data-grid"}],"data-theme":"@config.theme","type":"box"} @label "KPI tiles body content tree" @description "Render-ui SExpr for statsLook='kpi-tiles' — Stripe-dashboard style tile grid: huge typography number, label, trend indicator, sparkline hint." @tier "internal"
23727
23738
  metrics : [MetricSpec] = [{"aggregation":"count","format":"number","icon":"list","label":"Total Items","sparklineData":[2,4,3,6,5,8,7],"variant":"primary"},{"aggregation":"count","format":"number","icon":"check-circle","label":"Active","sparklineData":[1,3,2,4,6,5,7],"variant":"success"},{"aggregation":"avg","field":"value","format":"number","icon":"trending-up","label":"Avg Value","sparklineData":[5,4,6,3,5,7,6],"variant":"info"}] @label "Metrics" @description "One stat card per entry; declares aggregation, format, and styling" @synonyms "list of KPI cards / stat tiles / metric cards. each entry has label / value / format / icon / variant / aggregation. user phrases: 'replace metrics with X, Y, Z' -> rewrite array; 'add Revenue tile' -> append entry; 'change KPIs to X' -> rewrite array" @tier "presentation"
23728
- sparklineRowBodyContent : render-ui = {"children":[["if",["!=","@config.title",""],{"content":"@config.title","type":"typography","variant":"h3"},{"children":[],"gap":"none","type":"stack"}],{"className":"w-full","entity":"@entity.cards","fields":[],"gap":"md","minCardWidth":260,"renderItem":["fn","card",{"children":[{"align":"center","children":[{"color":"muted","name":"@card.icon","size":"xs","type":"icon"},{"className":"uppercase tracking-wide truncate","color":"muted","content":"@card.label","type":"typography","variant":"overline","weight":"semibold"}],"direction":"horizontal","gap":"xs","type":"stack"},{"className":"w-full","color":"auto","data":"@card.sparklineData","fill":true,"height":64,"strokeWidth":2,"type":"sparkline"},{"align":"baseline","children":[{"align":"baseline","children":[{"color":"muted","content":"@card.prefix","type":"typography","variant":"caption"},{"className":"text-2xl font-semibold tabular-nums","format":"@card.format","type":"animated-counter","value":"@card.value"},{"color":"muted","content":"@card.suffix","type":"typography","variant":"caption"}],"direction":"horizontal","gap":"xs","type":"stack"},{"showValue":true,"size":"sm","type":"trend-indicator","value":"@card.trend"}],"direction":"horizontal","gap":"sm","justify":"between","type":"stack"}],"className":"rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-card-md shadow-elevation-sm hover:shadow-elevation-md transition-shadow min-h-[180px]","direction":"vertical","gap":"sm","type":"stack"}],"type":"data-grid"}],"data-theme":"@config.theme","type":"box"} @label "Sparkline row body content tree" @description "Render-ui SExpr for statsLook='sparkline-row' — chart-first tiles where the mini trend line is the visual centerpiece, label above, value+delta footer." @tier "internal"
23739
+ sparklineRowBodyContent : render-ui = {"children":[["if",["!=","@config.title",""],{"content":"@config.title","type":"typography","variant":"h3"},{"children":[],"gap":"none","type":"stack"}],{"className":"w-full","entity":"@entity.cards","fields":[],"gap":"md","minCardWidth":260,"renderItem":["fn","card",{"children":[{"align":"center","children":[{"color":"muted","name":"@card.icon","size":"xs","type":"icon"},{"className":"uppercase tracking-wide truncate","color":"muted","content":"@card.label","type":"typography","variant":"overline","weight":"semibold"}],"direction":"horizontal","gap":"xs","type":"stack"},{"className":"w-full","color":"auto","data":"@card.sparklineData","fill":true,"height":64,"strokeWidth":2,"type":"sparkline"},{"align":"baseline","children":[{"align":"baseline","children":[{"color":"muted","content":"@card.prefix","type":"typography","variant":"caption"},{"className":"text-2xl font-semibold tabular-nums","format":"@card.format","type":"animated-counter","value":"@card.value"},{"color":"muted","content":"@card.suffix","type":"typography","variant":"caption"}],"direction":"horizontal","gap":"xs","type":"stack"},{"showValue":true,"size":"sm","type":"trend-indicator","value":"@card.trend"}],"direction":"horizontal","gap":"sm","justify":"between","type":"stack"}],"className":"surface-content p-card-md hover:shadow-elevation-dialog transition-shadow min-h-[180px]","direction":"vertical","gap":"sm","type":"stack"}],"type":"data-grid"}],"data-theme":"@config.theme","type":"box"} @label "Sparkline row body content tree" @description "Render-ui SExpr for statsLook='sparkline-row' — chart-first tiles where the mini trend line is the visual centerpiece, label above, value+delta footer." @tier "internal"
23729
23740
  statLook : string = "elevated" @label "Stat display look" @description "Layer 2 visual treatment for stat / KPI cards." @tier "presentation" @values (elevated flat progress-backed gauge sparkline)
23730
23741
  statsLook : string = "cards" @label "Stats look" @description "Layer 3 body layout: default per-metric stat-card grid ('cards'), Stripe-dashboard KPI tile row ('kpi-tiles'), single oversize hero number ('hero-metric'), or chart-first sparkline tile grid ('sparkline-row')." @tier "presentation" @values (cards kpi-tiles hero-metric sparkline-row)
23731
23742
  theme : string = "" @label "Theme" @description "Data-theme skin applied to the stat body root — for chrome-less pages composed without an AppShell." @tier "presentation"
@@ -24248,6 +24259,8 @@ trait ui-algo-graph-canvas.traits.AlgoGraphCanvasRender {
24248
24259
  height : number = 400 @label "Height" @description "height prop" @tier "presentation"
24249
24260
  interactive : boolean = false @label "Interactive" @description "interactive prop" @tier "presentation"
24250
24261
  isLoading : boolean @label "Is Loading" @description "isLoading prop" @tier "presentation"
24262
+ keyMap : Map<string,string> = {"item":"INIT"} @label "Key Map" @description "Maps a keydown `e.code` (optionally `Mod+`/`Shift+`/`Alt+` prefixed) to a SEMANTIC event emitted as `UI:{event}` — e.g. `{ Space: TOGGLE_RUN, ArrowRight: STEP, KeyR: RESET }`; keystrokes inside inputs never route." @tier "presentation"
24263
+ keyUpMap : Map<string,string> = {"item":"INIT"} @label "Key Up Map" @description "Maps a keyup `e.code` to a semantic event emitted as `UI:{event}`." @tier "presentation"
24251
24264
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
24252
24265
  layout : string = "manual" @label "Layout" @description "Deterministic layout to compute node positions; `manual` passes through `x`/`y`." @tier "presentation" @values (manual tree layered circle)
24253
24266
  nodes : [AlgoGraphCanvasNodesItem] = [] @label "Nodes" @description "nodes prop" @tier "presentation"
@@ -24255,6 +24268,7 @@ trait ui-algo-graph-canvas.traits.AlgoGraphCanvasRender {
24255
24268
  onShapeClick : event = "SHAPE_CLICK" @label "On Shape Click" @description "onShapeClick prop" @tier "presentation"
24256
24269
  role : 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)
24257
24270
  root : string @label "Root" @description "`tree` layout only: preferred root id. Falls back to the first indegree-0 node." @tier "presentation"
24271
+ series : [string] = [] @label "Series" @description "Overrides the theme's categorical palette (`series-1…N`) for this canvas — real-world conventions like CPK atom colors or resistor bands. Unset, the theme's `--color-series-*` apply." @tier "presentation"
24258
24272
  shapes : [AlgoGraphCanvasShapesItem] = [] @label "Shapes" @description "Extra declarative shapes in canvas pixel coordinates." @tier "presentation"
24259
24273
  skeleton : 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)
24260
24274
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
@@ -24301,12 +24315,15 @@ trait ui-algorithm-canvas.traits.AlgorithmCanvasRender {
24301
24315
  height : number = 400 @label "Height" @description "height prop" @tier "presentation"
24302
24316
  interactive : boolean = false @label "Interactive" @description "interactive prop" @tier "presentation"
24303
24317
  isLoading : boolean @label "Is Loading" @description "isLoading prop" @tier "presentation"
24318
+ keyMap : Map<string,string> = {"item":"INIT"} @label "Key Map" @description "Maps a keydown `e.code` (optionally `Mod+`/`Shift+`/`Alt+` prefixed) to a SEMANTIC event emitted as `UI:{event}` — e.g. `{ Space: TOGGLE_RUN, ArrowRight: STEP, KeyR: RESET }`; keystrokes inside inputs never route." @tier "presentation"
24319
+ keyUpMap : Map<string,string> = {"item":"INIT"} @label "Key Up Map" @description "Maps a keyup `e.code` to a semantic event emitted as `UI:{event}`." @tier "presentation"
24304
24320
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
24305
24321
  onShapeClick : event = "SHAPE_CLICK" @label "On Shape Click" @description "onShapeClick prop" @tier "presentation"
24306
24322
  pointers : [AlgorithmCanvasPointersItem] = [] @label "Pointers" @description "Index cursors (i/j/lo/hi/mid); drawn as markers beneath the referenced bar/slot column." @tier "presentation"
24307
24323
  ranges : [AlgorithmCanvasRangesItem] = [] @label "Ranges" @description "Highlighted index ranges over the bars panel (translucent fill bands or labeled brackets)." @tier "presentation"
24308
24324
  role : 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)
24309
24325
  rowLabels : [AlgorithmCanvasRowLabelsItem] = [] @label "Row Labels" @description "Row-header labels drawn to the left of the cells grid." @tier "presentation"
24326
+ series : [string] = [] @label "Series" @description "Overrides the theme's categorical palette (`series-1…N`) for this canvas — real-world conventions like CPK atom colors or resistor bands. Unset, the theme's `--color-series-*` apply." @tier "presentation"
24310
24327
  shapes : [AlgorithmCanvasShapesItem] = [] @label "Shapes" @description "Extra declarative shapes in canvas pixel coordinates." @tier "presentation"
24311
24328
  skeleton : 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)
24312
24329
  slotOrientation : string = "horizontal" @label "Slot Orientation" @description "Slot stack direction; horizontal lays slots left-to-right, vertical stacks bottom-up." @tier "presentation" @values (horizontal vertical)
@@ -24554,7 +24571,7 @@ trait ui-avl-glyph.traits.AvlGlyphRender {
24554
24571
  ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
24555
24572
  className : string @label "Class Name" @description "className prop" @tier "presentation"
24556
24573
  dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
24557
- effectType : string @label "Effect Type" @description "Effect symbol variant. @default 'set'" @tier "presentation"
24574
+ effectType : string = "set" @label "Effect Type" @description "Effect symbol variant. @default 'set'" @tier "presentation"
24558
24575
  enter : 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)
24559
24576
  enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
24560
24577
  kind : string = "@state" @label "Kind" @description "Which notation symbol to draw." @tier "presentation" @values (application orbital entity trait page state transition event guard effect field fieldType binding bindingRef persistence operator sexpr literal)
@@ -24721,6 +24738,8 @@ trait ui-biology-canvas.traits.BiologyCanvasRender {
24721
24738
  helix3d : BiologyCanvasHelix3d @label "Helix3d" @description "A 3D DNA double-helix ladder. 3D only." @tier "presentation"
24722
24739
  interactive : boolean @label "Interactive" @description "2D: pointer interaction (click/hover). 3D: orbit camera controls." @tier "presentation"
24723
24740
  isLoading : boolean @label "Is Loading" @description "isLoading prop" @tier "presentation"
24741
+ keyMap : Map<string,string> = {"item":"INIT"} @label "Key Map" @description "Maps a keydown `e.code` (optionally `Mod+`/`Shift+`/`Alt+` prefixed) to a SEMANTIC event emitted as `UI:{event}` — e.g. `{ Space: TOGGLE_RUN, ArrowRight: STEP, KeyR: RESET }`; keystrokes inside inputs never route." @tier "presentation"
24742
+ keyUpMap : Map<string,string> = {"item":"INIT"} @label "Key Up Map" @description "Maps a keyup `e.code` to a semantic event emitted as `UI:{event}`." @tier "presentation"
24724
24743
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
24725
24744
  lighting : BiologyCanvasLighting @label "Lighting" @description "3D only: scene light rig as data." @tier "presentation"
24726
24745
  mode : string = "2d" @label "Mode" @description "Painter: 2D raster (default) or 3D mesh scene via the lazy three.js host." @tier "presentation" @values (2d 3d)
@@ -24729,6 +24748,7 @@ trait ui-biology-canvas.traits.BiologyCanvasRender {
24729
24748
  post : BiologyCanvasPost @label "Post" @description "3D only: post-processing stack (bloom/vignette)." @tier "presentation"
24730
24749
  readouts : [BiologyCanvasReadoutsItem] = [] @label "Readouts" @description "Top-right status chip row, forwarded to LearningCanvas verbatim." @tier "presentation"
24731
24750
  role : 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)
24751
+ series : [string] = [] @label "Series" @description "Overrides the theme's categorical palette (`series-1…N`) for this canvas — real-world conventions like CPK atom colors or resistor bands. Unset, the theme's `--color-series-*` apply." @tier "presentation"
24732
24752
  shadows : boolean @label "Shadows" @description "3D only: enable shadows. Omitted → the host default." @tier "presentation"
24733
24753
  shapes : [BiologyCanvasShapesItem] = [] @label "Shapes" @description "Extra declarative shapes in canvas pixel coordinates (2D mode only — ignored in 3D)." @tier "presentation"
24734
24754
  showGrid : boolean @label "Show Grid" @description "3D only: show the ground grid (default off)." @tier "presentation"
@@ -25125,11 +25145,13 @@ trait ui-chemistry-canvas.traits.ChemistryCanvasRender {
25125
25145
  enter : 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)
25126
25146
  enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
25127
25147
  equation : string @label "Equation" @description "Reaction equation text centered at the top of the canvas. 2D only." @synonyms "reaction equation, formula" @tier "presentation"
25128
- equationColor : string @label "Equation Color" @description "Equation text color (default '#111827')." @tier "presentation"
25148
+ equationColor : string @label "Equation Color" @description "Equation text color: a tone name, token or literal (default the `ink` tone)." @tier "presentation"
25129
25149
  error : ChemistryCanvasError @label "Error" @description "error prop" @tier "presentation"
25130
25150
  height : number = 400 @label "Height" @description "height prop" @tier "presentation"
25131
25151
  interactive : boolean @label "Interactive" @description "2D: pointer interaction (click/hover). 3D: orbit camera controls." @tier "presentation"
25132
25152
  isLoading : boolean @label "Is Loading" @description "isLoading prop" @tier "presentation"
25153
+ keyMap : Map<string,string> = {"item":"INIT"} @label "Key Map" @description "Maps a keydown `e.code` (optionally `Mod+`/`Shift+`/`Alt+` prefixed) to a SEMANTIC event emitted as `UI:{event}` — e.g. `{ Space: TOGGLE_RUN, ArrowRight: STEP, KeyR: RESET }`; keystrokes inside inputs never route." @tier "presentation"
25154
+ keyUpMap : Map<string,string> = {"item":"INIT"} @label "Key Up Map" @description "Maps a keyup `e.code` to a semantic event emitted as `UI:{event}`." @tier "presentation"
25133
25155
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
25134
25156
  lattice3d : ChemistryCanvasLattice3d @label "Lattice3d" @description "A 3D crystal lattice block (simple cubic, BCC, FCC, rock salt, diamond, ...). 3D only." @tier "presentation"
25135
25157
  lighting : ChemistryCanvasLighting @label "Lighting" @description "3D only: scene light rig as data." @tier "presentation"
@@ -25138,6 +25160,7 @@ trait ui-chemistry-canvas.traits.ChemistryCanvasRender {
25138
25160
  post : ChemistryCanvasPost @label "Post" @description "3D only: post-processing stack (bloom/vignette)." @tier "presentation"
25139
25161
  readouts : [ChemistryCanvasReadoutsItem] = [] @label "Readouts" @description "Top-right status chip row, forwarded to LearningCanvas verbatim." @tier "presentation"
25140
25162
  role : 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)
25163
+ series : [string] = [] @label "Series" @description "Overrides the theme's categorical palette (`series-1…N`) for this canvas — real-world conventions like CPK atom colors or resistor bands. Unset, the theme's `--color-series-*` apply." @tier "presentation"
25141
25164
  shadows : boolean @label "Shadows" @description "3D only: enable shadows. Omitted → the host default." @tier "presentation"
25142
25165
  shapes : [ChemistryCanvasShapesItem] = [] @label "Shapes" @description "Extra declarative shapes in canvas pixel coordinates (2D mode only — ignored in 3D)." @tier "presentation"
25143
25166
  showGrid : boolean @label "Show Grid" @description "3D only: show the ground grid (default off)." @tier "presentation"
@@ -26305,7 +26328,7 @@ trait ui-learning-canvas.traits.LearningCanvasRender {
26305
26328
  ariaLive : 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)
26306
26329
  ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
26307
26330
  ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
26308
- backgroundColor : string @label "Background Color" @description "Background color (default transparent)." @tier "presentation"
26331
+ backgroundColor : string @label "Background Color" @description "Canvas ground: a tone name, `var()` token or literal (default the theme's `--surface-diagram`)." @tier "presentation"
26309
26332
  className : string @label "Class Name" @description "Additional CSS classes." @tier "presentation"
26310
26333
  description : string @label "Description" @description "Text alternative for the canvas, rendered as visually hidden text and linked by aria-describedby." @tier "presentation"
26311
26334
  dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
@@ -26317,12 +26340,15 @@ trait ui-learning-canvas.traits.LearningCanvasRender {
26317
26340
  height : number = 400 @label "Height" @description "Canvas height in CSS pixels." @tier "presentation"
26318
26341
  interactive : boolean = false @label "Interactive" @description "Enable pointer interaction (click/hover)." @tier "presentation"
26319
26342
  isLoading : boolean @label "Is Loading" @description "Loading state." @tier "presentation"
26343
+ keyMap : Map<string,string> = {"item":"INIT"} @label "Key Map" @description "Maps a keydown `e.code` — optionally prefixed `Mod+` (⌘/Ctrl), `Shift+`, `Alt+` — to a SEMANTIC event emitted as `UI:{event}` (e.g. `{ Space: TOGGLE_RUN, ArrowRight: STEP, KeyR: RESET }`); keystrokes inside inputs never route." @tier "presentation"
26344
+ keyUpMap : Map<string,string> = {"item":"INIT"} @label "Key Up Map" @description "Maps a keyup `e.code` to a semantic event emitted as `UI:{event}`." @tier "presentation"
26320
26345
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
26321
26346
  onShapeClick : event = "SHAPE_CLICK" @label "On Shape Click" @description "Clicked shape payload: { id?, type?, index }." @tier "presentation"
26322
26347
  onShapeHover : event = "SHAPE_HOVER" @label "On Shape Hover" @description "Hovered shape payload: { id?, type?, index }." @tier "presentation"
26323
26348
  projector : LearningCanvasProjector @label "Projector" @description "World-to-pixel projector for `drawables`. When absent, `drawables` are ignored." @tier "presentation"
26324
26349
  readouts : [LearningCanvasReadoutsItem] = [] @label "Readouts" @description "Top-right status chip row (live measurements, scores, counters)." @synonyms "chips, stats, measurements" @tier "presentation"
26325
26350
  role : 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)
26351
+ series : [string] = [] @label "Series" @description "Overrides the theme's categorical palette for this canvas: `series-1…N` resolve to these colors instead. For real-world conventions (CPK atom colors, resistor bands); unset, the theme's `--color-series-*` apply." @tier "presentation"
26326
26352
  shapes : [LearningCanvasShapesItem] = [] @label "Shapes" @description "Declarative shapes to draw." @tier "presentation"
26327
26353
  skeleton : 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)
26328
26354
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
@@ -26355,8 +26381,9 @@ trait ui-math-canvas.traits.MathCanvasRender {
26355
26381
  ariaLive : 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)
26356
26382
  ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
26357
26383
  ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
26358
- axisColor : string = "var(--color-muted-foreground, #374151)" @label "Axis Color" @description "Axis line color; resolves theme tokens (default `var(--color-muted-foreground, #374151)`)." @tier "presentation"
26359
- backgroundColor : string @label "Background Color" @description "Canvas fill color; `var(--token, fallback)` strings resolve against the active theme. Default transparent." @tier "presentation"
26384
+ aspect : string = "fit" @label "Aspect" @description "How the x and y ranges map to the canvas. `fit` stretches each range to fill the plot (function plots); `equal` uses one scale for both axes so circles stay round (geometry). Default `fit`." @tier "presentation" @values (fit equal)
26385
+ axisColor : string = "axis" @label "Axis Color" @description "Axis line color: a tone name, token or literal (default the `axis` tone)." @tier "presentation"
26386
+ backgroundColor : string @label "Background Color" @description "Canvas ground: a tone name, `var()` token or literal. Default the theme's `--surface-diagram`." @tier "presentation"
26360
26387
  bars : [MathCanvasBarsItem] = [] @label "Bars" @description "Riemann/histogram bar strips." @tier "presentation"
26361
26388
  className : string @label "Class Name" @description "className prop" @tier "presentation"
26362
26389
  curves : [MathCanvasCurvesItem] = [] @label "Curves" @description "curves prop" @tier "presentation"
@@ -26366,7 +26393,7 @@ trait ui-math-canvas.traits.MathCanvasRender {
26366
26393
  enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
26367
26394
  error : MathCanvasError @label "Error" @description "error prop" @tier "presentation"
26368
26395
  fontFamily : string @label "Font Family" @description "Canvas text font family. Accepts a known game-font key (e.g. 'future-narrow') or a CSS font-family string." @tier "presentation"
26369
- gridColor : string = "var(--color-border, #9ca3af)" @label "Grid Color" @description "Grid line color; resolves theme tokens (default `var(--color-border, #9ca3af)`)." @tier "presentation"
26396
+ gridColor : string = "grid" @label "Grid Color" @description "Grid line color: a tone name, token or literal (default the `grid` tone)." @tier "presentation"
26370
26397
  gridStep : number = 1 @label "Grid Step" @description "gridStep prop" @tier "presentation"
26371
26398
  guides : [MathCanvasGuidesItem] = [] @label "Guides" @description "Fixed reference lines (vline/hline)." @tier "presentation"
26372
26399
  height : number = 400 @label "Height" @description "height prop" @tier "presentation"
@@ -26375,13 +26402,14 @@ trait ui-math-canvas.traits.MathCanvasRender {
26375
26402
  isLoading : boolean @label "Is Loading" @description "isLoading prop" @tier "presentation"
26376
26403
  keyMap : Map<string,string> = {"item":"INIT"} @label "Key Map" @description "Maps a keydown `e.code` — optionally prefixed `Mod+` (⌘/Ctrl), `Shift+`, `Alt+` in that order — to the board's SEMANTIC event (device-agnostic input), emitted as `UI:{event}` — same contract as the game canvas keyMap; keystrokes inside inputs/textareas never route." @tier "presentation"
26377
26404
  keyUpMap : Map<string,string> = {"item":"INIT"} @label "Key Up Map" @description "Maps a keyup `e.code` — optionally prefixed `Mod+` (⌘/Ctrl), `Shift+`, `Alt+` in that order — to the board's SEMANTIC event, emitted as `UI:{event}`; keystrokes inside inputs/textareas never route." @tier "presentation"
26378
- labelFontSize : number = 12 @label "Label Font Size" @description "Base font size in px for all other canvas annotations (points, vectors, guides, curves, regions, angles, hops; default 12)." @tier "presentation"
26405
+ labelFontSize : number @label "Label Font Size" @description "Font size in px for all other canvas annotations (default the theme's diagram label size)." @tier "presentation"
26379
26406
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
26380
26407
  onShapeClick : event = "SHAPE_CLICK" @label "On Shape Click" @description "onShapeClick prop" @tier "presentation"
26381
26408
  points : [MathCanvasPointsItem] = [] @label "Points" @description "points prop" @tier "presentation"
26382
26409
  readouts : [MathCanvasReadoutsItem] = [] @label "Readouts" @description "Top-right status chips, forwarded verbatim to LearningCanvas." @tier "presentation"
26383
26410
  regions : [MathCanvasRegionsItem] = [] @label "Regions" @description "Filled areas under curves or between curve pairs." @tier "presentation"
26384
26411
  role : 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)
26412
+ series : [string] = [] @label "Series" @description "Overrides the theme's categorical palette (`series-1…N`) for this canvas — real-world conventions like CPK atom colors or resistor bands. Unset, the theme's `--color-series-*` apply." @tier "presentation"
26385
26413
  shapes : [MathCanvasShapesItem] = [] @label "Shapes" @description "Extra declarative shapes in canvas pixel coordinates." @tier "presentation"
26386
26414
  showAxes : boolean = true @label "Show Axes" @description "showAxes prop" @tier "presentation"
26387
26415
  showCurveLabels : boolean = false @label "Show Curve Labels" @description "Draw each curve's `label` at its last in-range sample (default false)." @tier "presentation"
@@ -26389,7 +26417,7 @@ trait ui-math-canvas.traits.MathCanvasRender {
26389
26417
  showTickLabels : boolean = false @label "Show Tick Labels" @description "Draw numeric labels on grid lines (default false)." @tier "presentation"
26390
26418
  skeleton : 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)
26391
26419
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
26392
- tickLabelFontSize : number = 10 @label "Tick Label Font Size" @description "Font size in px for axis tick labels (default 10)." @tier "presentation"
26420
+ tickLabelFontSize : number @label "Tick Label Font Size" @description "Font size in px for axis tick labels (default the theme's `xs` step)." @tier "presentation"
26393
26421
  title : string @label "Title" @description "title prop" @tier "presentation"
26394
26422
  traces : [MathCanvasTracesItem] = [] @label "Traces" @description "Inset sparkline panels, forwarded verbatim to LearningCanvas." @tier "presentation"
26395
26423
  vectors : [MathCanvasVectorsItem] = [] @label "Vectors" @description "vectors prop" @tier "presentation"
@@ -26540,6 +26568,8 @@ trait ui-physics-canvas.traits.PhysicsCanvasRender {
26540
26568
  height : number = 400 @label "Height" @description "height prop" @tier "presentation"
26541
26569
  interactive : boolean @label "Interactive" @description "2D: pointer interaction (click/hover). 3D: orbit camera controls." @tier "presentation"
26542
26570
  isLoading : boolean @label "Is Loading" @description "isLoading prop" @tier "presentation"
26571
+ keyMap : Map<string,string> = {"item":"INIT"} @label "Key Map" @description "Maps a keydown `e.code` (optionally `Mod+`/`Shift+`/`Alt+` prefixed) to a SEMANTIC event emitted as `UI:{event}` — e.g. `{ Space: TOGGLE_RUN, ArrowRight: STEP, KeyR: RESET }`; keystrokes inside inputs never route." @tier "presentation"
26572
+ keyUpMap : Map<string,string> = {"item":"INIT"} @label "Key Up Map" @description "Maps a keyup `e.code` to a semantic event emitted as `UI:{event}`." @tier "presentation"
26543
26573
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
26544
26574
  lighting : PhysicsCanvasLighting @label "Lighting" @description "3D only: scene light rig as data." @tier "presentation"
26545
26575
  meters : [PhysicsCanvasMetersItem] = [] @label "Meters" @description "Bottom-left labeled bar gauges. 2D only." @tier "presentation"
@@ -26549,6 +26579,7 @@ trait ui-physics-canvas.traits.PhysicsCanvasRender {
26549
26579
  readouts : [PhysicsCanvasReadoutsItem] = [] @label "Readouts" @description "Top-right status chip row, forwarded to LearningCanvas verbatim." @tier "presentation"
26550
26580
  role : 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)
26551
26581
  sceneObjects : [PhysicsCanvasSceneObjectsItem] = [] @label "Scene Objects" @description "Ground/wall/ramp/box/pivot scene fixtures. 2D only." @tier "presentation"
26582
+ series : [string] = [] @label "Series" @description "Overrides the theme's categorical palette (`series-1…N`) for this canvas — real-world conventions like CPK atom colors or resistor bands. Unset, the theme's `--color-series-*` apply." @tier "presentation"
26552
26583
  shadows : boolean @label "Shadows" @description "3D only: enable shadows. Omitted → the host default." @tier "presentation"
26553
26584
  shapes : [PhysicsCanvasShapesItem] = [] @label "Shapes" @description "Extra declarative shapes in canvas pixel coordinates (2D mode only — ignored in 3D)." @tier "presentation"
26554
26585
  showForces : boolean = false @label "Show Forces" @description "showForces prop" @tier "presentation"
@@ -26580,7 +26611,7 @@ trait ui-presence.traits.PresenceRender {
26580
26611
  transitions : ((idle -> idle on INIT))
26581
26612
  emits : (@config.onExited)
26582
26613
  config {
26583
- animate : boolean @label "Animate" @description "Per-instance opt-out. Global opt-out is `--motion-enable` / reduced-motion. @default true" @tier "presentation"
26614
+ animate : boolean = true @label "Animate" @description "Per-instance opt-out. Global opt-out is `--motion-enable` / reduced-motion. @default true" @tier "presentation"
26584
26615
  animation : string = "modal" @label "Animation" @description "Which motion preset to use (maps to `animate-<name>-in/out`)." @tier "presentation" @values (modal overlay slide-up drawer popover toast fade page)
26585
26616
  ariaBusy : boolean @label "Aria-busy" @description "This region is updating; assistive technology waits before announcing it." @synonyms "aria-busy" @tier "presentation"
26586
26617
  ariaCurrent : 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)
@@ -26628,7 +26659,7 @@ trait ui-progress-bar.traits.ProgressBarRender {
26628
26659
  ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
26629
26660
  ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
26630
26661
  className : string @label "Class Name" @description "Additional CSS classes" @tier "presentation"
26631
- color : string @label "Color" @description "Color variant (alias for variant)" @tier "presentation" @values (default primary success warning error danger)
26662
+ color : string @label "Color" @description "Color variant (alias for variant; `variant` applies when omitted)" @tier "presentation" @values (default primary success warning error danger)
26632
26663
  dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
26633
26664
  enter : 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)
26634
26665
  enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
@@ -28209,6 +28240,15 @@ page std-agent-planner.pages.AgentPlannerPage {
28209
28240
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-planner.orb orbitals[0].pages[0])"
28210
28241
  }
28211
28242
 
28243
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1].pages[0])
28244
+ page std-agent-session.pages.AgentChatsPage {
28245
+ alias : AgentSession
28246
+ defaultPath : /agent-session/chats
28247
+ traits : (AgentChatList AgentChatKeeper)
28248
+ override-surface : (path linkedEntity traits)
28249
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1].pages[0])"
28250
+ }
28251
+
28212
28252
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[0].pages[0])
28213
28253
  page std-agent-session.pages.AgentSessionPage {
28214
28254
  alias : AgentSession
@@ -29065,15 +29105,6 @@ page std-lifecycle.pages.LifecycleSchedulerPage {
29065
29105
  source : "@almadar/std (behaviors/registry/infra/atoms/std-lifecycle.orb orbitals[0].pages[0])"
29066
29106
  }
29067
29107
 
29068
- ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-list.orb orbitals[0].pages[0])
29069
- page std-list.pages.ListItemPage {
29070
- alias : List
29071
- defaultPath : /listitems
29072
- traits : (ListItemBrowse ListItemCreate ListItemEdit ListItemDelete ListItemPersistor)
29073
- override-surface : (path linkedEntity traits)
29074
- source : "@almadar/std (behaviors/registry/ui/core/atoms/std-list.orb orbitals[0].pages[0])"
29075
- }
29076
-
29077
29108
  ;; From @almadar/std (behaviors/registry/ui/game/atoms/std-lives.orb orbitals[0].pages[0])
29078
29109
  page std-lives.pages.LivesPage {
29079
29110
  alias : Lives
@@ -34433,6 +34464,7 @@ trait ui-accordion.traits.AccordionRender {
34433
34464
  openItems : [string] = [] @label "Open Items" @description "Controlled open items (IDs)" @tier "presentation"
34434
34465
  role : 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)
34435
34466
  skeleton : 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)
34467
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
34436
34468
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
34437
34469
  toggleEvent : event = "TOGGLE" @label "Toggle Event" @description "Declarative toggle event — emits UI:{toggleEvent} with { itemId, isOpen }" @tier "presentation"
34438
34470
  }
@@ -34481,16 +34513,18 @@ trait ui-agent-activity-feed.traits.AgentActivityFeedRender {
34481
34513
  linkedEntity : AgentActivityFeedItem
34482
34514
  category : interaction
34483
34515
  states : (idle*)
34484
- events : (INIT)
34516
+ events : (INIT @config.onJump)
34485
34517
  transitions : ((idle -> idle on INIT))
34518
+ emits : (@config.onJump)
34486
34519
  config {
34520
+ activities : [AgentActivityFeedActivitiesItem] = [] @label "Activities" @description "activities prop" @tier "presentation"
34487
34521
  className : string @label "Class Name" @description "className prop" @tier "presentation"
34488
34522
  emptyDescription : string @label "Empty Description" @description "emptyDescription prop" @tier "presentation"
34489
34523
  emptyTitle : string @label "Empty Title" @description "emptyTitle prop" @tier "presentation"
34490
34524
  enter : 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)
34491
34525
  enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
34492
34526
  followLatest : boolean = true @label "Follow Latest" @description "Scroll the latest row into view as rows arrive. Off for a list of feeds (a run history). @default true" @tier "presentation"
34493
- onJump : string @label "On Jump" @description "onJump prop" @tier "presentation"
34527
+ onJump : event = "JUMP" @label "On Jump" @description "onJump prop" @tier "presentation"
34494
34528
  skeleton : 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)
34495
34529
  working : boolean = false @label "Working" @description "The agent is running: show the thinking row after the last activity." @tier "presentation"
34496
34530
  }
@@ -34508,6 +34542,7 @@ trait ui-agent-activity-row.traits.AgentActivityRowRender {
34508
34542
  transitions : ((idle -> idle on INIT))
34509
34543
  emits : (@config.onJump)
34510
34544
  config {
34545
+ activity : AgentActivityRowActivity = {} @label "Activity" @description "activity prop" @tier "presentation"
34511
34546
  facts : AgentActivityRowFacts = {"readyCount":1,"settled":false} @label "Facts" @description "What the row knows from its list (`activityRowFacts`)." @tier "presentation"
34512
34547
  onJump : event = "JUMP" @label "On Jump" @description "'Jump to' affordance — rendered only when supplied and the activity names an orbital." @tier "presentation"
34513
34548
  }
@@ -34524,6 +34559,7 @@ trait ui-agent-chat-feed.traits.AgentChatFeedRender {
34524
34559
  events : (INIT)
34525
34560
  transitions : ((idle -> idle on INIT))
34526
34561
  config {
34562
+ activities : [AgentChatFeedActivitiesItem] = [] @label "Activities" @description "Activities already selected by the host's manifest audience." @tier "presentation"
34527
34563
  className : string @label "Class Name" @description "className prop" @tier "presentation"
34528
34564
  emptyTitle : string = "" @label "Empty Title" @description "emptyTitle prop" @tier "presentation"
34529
34565
  enter : 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)
@@ -34688,6 +34724,7 @@ trait ui-branching-logic-builder.traits.BranchingLogicBuilderRender {
34688
34724
  rules : [BranchingLogicBuilderRulesItem] = [{"id":"Id","operator":"equals","sourceQuestionId":"Source Question Id","targetQuestionId":"Target Question Id","value":"Value"},{"id":"Id 2","operator":"not-equals","sourceQuestionId":"Source Question Id 2","targetQuestionId":"Target Question Id 2","value":"Value 2"}] @label "Rules" @description "Rules. Accepts either a typed array (direct consumers) or the runtime payload shape from a render-ui binding (`@payload.data`). Narrowed to `[]` internally when the value isn't an array." @tier "presentation"
34689
34725
  rulesChangeEvent : event = "RULES_CHANGE" @label "Rules Change Event" @description "Event name dispatched via event bus when rules change. Payload: `{ rules }`." @tier "presentation"
34690
34726
  skeleton : 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)
34727
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
34691
34728
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
34692
34729
  }
34693
34730
  override-surface : (linkedEntity name events effects listens emitsScope config)
@@ -34770,6 +34807,7 @@ trait ui-calendar-grid.traits.CalendarGridRender {
34770
34807
  selfFetch : boolean = true @label "Fetch its own rows on mount?" @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's." @tier "internal"
34771
34808
  skeleton : 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)
34772
34809
  startField : string = "startTime" @label "Start Field" @description "Row field holding the start timestamp (ISO or epoch). Defaults to `startTime`." @tier "presentation"
34810
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
34773
34811
  swipeLeftEvent : event = "SWIPE_LEFT" @label "Swipe Left Event" @description "Event emitted on swipe left (next week): UI:{swipeLeftEvent}" @tier "presentation"
34774
34812
  swipeRightEvent : event = "SWIPE_RIGHT" @label "Swipe Right Event" @description "Event emitted on swipe right (prev week): UI:{swipeRightEvent}" @tier "presentation"
34775
34813
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
@@ -34898,6 +34936,7 @@ trait ui-chart.traits.ChartRender {
34898
34936
  skeleton : string = "card" @label "Skeleton" @description "Skeleton drawn while loading, and the shape an empty slot shows while this element's server render is in flight (`none` opts out)." @tier "presentation" @values (header table list grid detail stats form card text none)
34899
34937
  stack : string = "none" @label "Stack" @description "Stack mode for bar / area" @tier "presentation" @values (none stack normalize)
34900
34938
  subtitle : string @label "Subtitle" @description "Chart subtitle / description" @tier "presentation"
34939
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
34901
34940
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
34902
34941
  timeAxis : boolean = false @label "Time Axis" @description "Format X-axis labels as time (ISO date in → 'Mar 2026'-style label out)" @tier "presentation"
34903
34942
  title : string @label "Title" @description "Chart title" @tier "presentation"
@@ -35244,7 +35283,6 @@ trait ui-content-renderer.traits.ContentRendererRender {
35244
35283
  pageSize : number @label "Page Size" @description "Number of items per page" @tier "presentation"
35245
35284
  role : 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)
35246
35285
  searchValue : string @label "Search Value" @description "Current search query value" @tier "presentation"
35247
- segments : [ContentRendererSegmentsItem] = [] @label "Segments" @description "Pre-parsed segments (overrides content)" @tier "presentation"
35248
35286
  selectedIds : [string] = [] @label "Selected Ids" @description "Currently selected item IDs" @tier "presentation"
35249
35287
  skeleton : 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)
35250
35288
  sortBy : string @label "Sort By" @description "── Display hints (set by trait via render-ui, never written by organism) ──" @tier "presentation"
@@ -35316,6 +35354,7 @@ trait ui-data-grid.traits.DataGridRender {
35316
35354
  selfFetch : boolean = true @label "Fetch its own rows on mount?" @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's." @tier "internal"
35317
35355
  skeleton : string = "grid" @label "Skeleton" @description "Skeleton drawn while loading, and the shape an empty slot shows while this element's server render is in flight (`none` opts out)." @tier "presentation" @values (header table list grid detail stats form card text none)
35318
35356
  sortable : boolean @label "Sortable" @description "Enable in-container reorder; items can be dragged to new positions among siblings" @tier "presentation"
35357
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
35319
35358
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
35320
35359
  viewerRole : string = "" @label "Viewer's role" @description "The viewer's role that each action's `roles` is checked against; bind it at the call site (e.g. `viewerRole: @user.role`). Empty = only actions with no `roles` show." @tier "policy"
35321
35360
  }
@@ -35386,6 +35425,7 @@ trait ui-data-list.traits.DataListRender {
35386
35425
  sortable : boolean @label "Sortable" @description "Enable in-container reorder; items can be dragged to new positions among siblings" @tier "presentation"
35387
35426
  sortBy : string @label "Sort By" @description "Field name to order rows by. Values are compared by their own type — numbers numerically, date-like strings chronologically, everything else alphabetically — never by what the field is called. Empty cells sort last. Unset leaves the incoming order untouched. Orders only the rows already fetched: a collection larger than its `limit` still needs ordering at the data layer." @tier "presentation"
35388
35427
  sortDirection : string @label "Sort Direction" @description "Direction for `sortBy`. Defaults to ascending." @tier "presentation" @values (asc desc)
35428
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
35389
35429
  swipeLeftActions : [DataListSwipeLeftActionsItem] = [] @label "Swipe Left Actions" @description "Actions revealed on left swipe" @tier "presentation"
35390
35430
  swipeLeftEvent : event = "SWIPE_LEFT" @label "Swipe Left Event" @description "Event emitted on left swipe: UI:{swipeLeftEvent} with { row }" @tier "presentation"
35391
35431
  swipeRightActions : [DataListSwipeRightActionsItem] = [] @label "Swipe Right Actions" @description "Actions revealed on right swipe" @tier "presentation"
@@ -35767,6 +35807,7 @@ trait ui-document-viewer.traits.DocumentViewerRender {
35767
35807
  showToolbar : boolean = true @label "Show Toolbar" @description "Show toolbar" @tier "presentation"
35768
35808
  skeleton : 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)
35769
35809
  src : asset = "https://almadar-kflow-assets.web.app/shared/ui-roguelike-board/default/units/player.png" @label "Src" @description "Document URL (for PDF/external documents)" @tier "presentation"
35810
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
35770
35811
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
35771
35812
  title : string @label "Title" @description "Document title" @tier "presentation"
35772
35813
  totalPages : number @label "Total Pages" @description "Total pages" @tier "presentation"
@@ -35877,7 +35918,7 @@ trait ui-emoji-picker.traits.EmojiPickerRender {
35877
35918
  skeleton : 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)
35878
35919
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
35879
35920
  triggerIcon : icon @label "Trigger Icon" @description "Icon shown on the trigger button" @tier "presentation"
35880
- triggerLabel : string @label "Trigger Label" @description "Accessible label for the trigger button" @tier "presentation"
35921
+ triggerLabel : string @label "Trigger Label" @description "Accessible label for the trigger button (the translated 'Add emoji' when omitted)" @tier "presentation"
35881
35922
  }
35882
35923
  override-surface : (linkedEntity name events effects listens emitsScope config)
35883
35924
  source : "@almadar/std (behaviors/registry/ui/core/molecules/ui-emoji-picker.orb orbitals[0].traits[0])"
@@ -36545,6 +36586,7 @@ trait ui-gantt.traits.GanttRender {
36545
36586
  startField : string = "start" @label "Start Field" @description "Row field holding the start timestamp (ISO or epoch). Defaults to `start`." @tier "presentation"
36546
36587
  statusColorMap : Map<string,GanttStatusColorMapValue> = {"item":"default"} @label "Status Color Map" @description "Bar colour per exact status value; unmapped statuses are primary bars." @tier "presentation"
36547
36588
  statusField : string = "status" @label "Status Field" @description "Row field holding the bar status. Defaults to `status`." @tier "presentation"
36589
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
36548
36590
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
36549
36591
  titleField : string = "title" @label "Title Field" @description "Row field holding the bar label. Defaults to `title`." @tier "presentation"
36550
36592
  }
@@ -36702,6 +36744,7 @@ trait ui-graph-view.traits.GraphViewRender {
36702
36744
  role : 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)
36703
36745
  showLabels : boolean = true @label "Show Labels" @description "Show node labels (default true)" @tier "presentation"
36704
36746
  skeleton : 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)
36747
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
36705
36748
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
36706
36749
  width : number @label "Width" @description "Width in pixels" @tier "presentation"
36707
36750
  zoomToFit : boolean = true @label "Zoom To Fit" @description "Auto zoom-to-fit after layout settles (default true)" @tier "presentation"
@@ -36773,6 +36816,7 @@ trait ui-header.traits.HeaderRender {
36773
36816
  ariaLive : 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)
36774
36817
  ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
36775
36818
  ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
36819
+ brandHref : string @label "Brand Href" @description "Where the brand (logo + name) links to, usually the home page; empty leaves it unlinked" @tier "presentation"
36776
36820
  brandName : string = "KFlow" @label "Brand Name" @description "Brand/App name" @tier "presentation"
36777
36821
  className : string @label "Class Name" @description "Additional CSS classes" @tier "presentation"
36778
36822
  dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
@@ -36883,6 +36927,7 @@ trait ui-import-preview-tree.traits.ImportPreviewTreeRender {
36883
36927
  role : 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)
36884
36928
  skeleton : 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)
36885
36929
  skipped : [ImportPreviewTreeSkippedItem] = [] @label "Skipped" @description "Elements skipped during extraction, with reasons" @tier "presentation"
36930
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind each group tile unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
36886
36931
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
36887
36932
  units : [ImportPreviewTreeUnitsItem] = [] @label "Units" @description "Staged units to preview" @tier "presentation"
36888
36933
  }
@@ -37243,6 +37288,7 @@ trait ui-map-view.traits.MapViewRender {
37243
37288
  showAttribution : boolean = true @label "Show Attribution" @description "Show attribution (default true)" @tier "presentation"
37244
37289
  showClickedPin : boolean = false @label "Show Clicked Pin" @description "Whether to show a pin at the clicked location" @tier "presentation"
37245
37290
  skeleton : 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)
37291
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
37246
37292
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
37247
37293
  zoom : number = 13 @label "Zoom" @description "Zoom level (1-18, default 13)" @tier "presentation"
37248
37294
  }
@@ -37601,6 +37647,7 @@ trait ui-option-constraint-group.traits.OptionConstraintGroupRender {
37601
37647
  ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
37602
37648
  changeEvent : event = "CHANGE" @label "Change Event" @description "changeEvent prop" @tier "presentation"
37603
37649
  className : string @label "Class Name" @description "className prop" @tier "presentation"
37650
+ constraint : OptionConstraintGroupConstraint @label "Constraint" @description "Selection constraint. Optional — defaults to single-select (the generic factory can't author a discriminated-union value; an author overrides it)." @tier "presentation"
37604
37651
  description : string @label "Description" @description "description prop" @tier "presentation"
37605
37652
  dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
37606
37653
  enter : 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)
@@ -37697,7 +37744,7 @@ trait ui-page-header.traits.PageHeaderRender {
37697
37744
  onTabChange : event = "TAB_CHANGE" @label "On Tab Change" @description "onTabChange prop" @tier "presentation"
37698
37745
  role : 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)
37699
37746
  showBack : boolean = false @label "Show Back" @description "Show back button" @tier "presentation"
37700
- skeleton : 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)
37747
+ skeleton : string = "header" @label "Skeleton" @description "The shape an empty slot shows while this header's server render is in flight (`none` opts out). @default 'header'" @tier "presentation" @values (header table list grid detail stats form card text none)
37701
37748
  status : PageHeaderStatus @label "Status" @description "Status badge — a bare string (an entity's status field bound directly, e.g. `status: @entity.status`) renders as a default-variant badge" @tier "presentation"
37702
37749
  subtitle : scalar @label "Subtitle" @description "Optional subtitle/description" @tier "presentation"
37703
37750
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
@@ -38295,7 +38342,7 @@ trait ui-search-input.traits.SearchInputRender {
38295
38342
  isLoading : boolean = false @label "Is Loading" @description "Show loading state" @tier "presentation"
38296
38343
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
38297
38344
  onSearch : event = "SEARCH" @label "On Search" @description "Callback when search value changes" @tier "presentation"
38298
- placeholder : string @label "Placeholder" @description "Placeholder text" @tier "presentation"
38345
+ placeholder : string @label "Placeholder" @description "Placeholder text (the translated 'Search' when omitted)" @tier "presentation"
38299
38346
  query : string @label "Query" @description "Query singleton binding for state management. When provided, syncs search state with the query singleton. Example: '@TaskQuery'" @tier "presentation"
38300
38347
  role : 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)
38301
38348
  skeleton : 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)
@@ -38755,6 +38802,7 @@ trait ui-stat-display.traits.StatDisplayRender {
38755
38802
  skeleton : string @label "Skeleton" @description "Skeleton drawn while loading, and the shape an empty slot shows while this element's server render is in flight (`none` opts out)." @tier "presentation" @values (header table list grid detail stats form card text none)
38756
38803
  sparklineData : [number] = [] @label "Sparkline Data" @description "Optional inline sparkline data appended to the trend row. Length < 2 renders nothing." @tier "presentation"
38757
38804
  suffix : string @label "Suffix" @description "Suffix appended to the formatted value (e.g. ' /mo', ' ms')." @tier "presentation"
38805
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
38758
38806
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
38759
38807
  target : number @label "Target" @description "Optional progress target. >0 renders a progress bar at value/target." @tier "presentation"
38760
38808
  trend : number @label "Trend" @description "Signed delta vs previous period. >0 renders ↑ green, <0 renders ↓ red, 0 hides. Polarity reversal via `trendPolarity`." @tier "presentation"
@@ -38864,6 +38912,7 @@ trait ui-table-view.traits.TableViewRender {
38864
38912
  sortColumn : string @label "Sort Column" @description "Current sort column (display hint for the active header arrow)." @tier "presentation"
38865
38913
  sortDirection : string @label "Sort Direction" @description "Current sort direction (display hint)." @tier "presentation" @values (asc desc)
38866
38914
  sortEvent : event = "SORT" @label "Sort Event" @description "Event emitted on sortable-header click: UI:{sortEvent} with { column, direction }." @tier "presentation"
38915
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
38867
38916
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
38868
38917
  viewerRole : string = "" @label "Viewer's role" @description "The viewer's role that each action's `roles` is checked against; bind it at the call site (e.g. `viewerRole: @user.role`). Empty = only actions with no `roles` show." @tier "policy"
38869
38918
  }
@@ -40427,12 +40476,12 @@ page ui-wizard-progress.pages.WizardProgressPage {
40427
40476
  source : "@almadar/std (behaviors/registry/ui/core/molecules/ui-wizard-progress.orb orbitals[0].pages[0])"
40428
40477
  }
40429
40478
 
40430
- ;; === organisms (40 behaviors, 40 apps, 41 orbitals, 41 entities, 41 traits, 42 pages) ===
40479
+ ;; === organisms (36 behaviors, 36 apps, 37 orbitals, 37 entities, 37 traits, 37 pages) ===
40431
40480
 
40432
40481
  ;; From @almadar/std (behaviors/registry/agent/organisms/std-agent-assistant.orb)
40433
40482
  app std-agent-assistant {
40434
40483
  alias : AgentAssistant
40435
- version : "1.0.0"
40484
+ version : "2.0.0"
40436
40485
  orbitals : (AgentAssistantOrbital AgentRecordsOrbital)
40437
40486
  override-surface : (config)
40438
40487
  ;; via uses Alias from "std/behaviors/std-agent-assistant" { config { ... } }
@@ -40649,36 +40698,6 @@ app ui-drawer-slot {
40649
40698
  source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-drawer-slot.orb)"
40650
40699
  }
40651
40700
 
40652
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-cards.orb)
40653
- app ui-entity-cards {
40654
- alias : UiEntityCards
40655
- version : "1.0.0"
40656
- orbitals : (EntityCardsOrbital)
40657
- override-surface : (config)
40658
- ;; via uses Alias from "std/behaviors/ui-entity-cards" { config { ... } }
40659
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-cards.orb)"
40660
- }
40661
-
40662
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-list.orb)
40663
- app ui-entity-list {
40664
- alias : UiEntityList
40665
- version : "1.0.0"
40666
- orbitals : (EntityListOrbital)
40667
- override-surface : (config)
40668
- ;; via uses Alias from "std/behaviors/ui-entity-list" { config { ... } }
40669
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-list.orb)"
40670
- }
40671
-
40672
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-table.orb)
40673
- app ui-entity-table {
40674
- alias : UiEntityTable
40675
- version : "1.0.0"
40676
- orbitals : (EntityTableOrbital)
40677
- override-surface : (config)
40678
- ;; via uses Alias from "std/behaviors/ui-entity-table" { config { ... } }
40679
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-table.orb)"
40680
- }
40681
-
40682
40701
  ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-form.orb)
40683
40702
  app ui-form {
40684
40703
  alias : UiForm
@@ -40699,16 +40718,6 @@ app ui-form-section {
40699
40718
  source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-form-section.orb)"
40700
40719
  }
40701
40720
 
40702
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail.orb)
40703
- app ui-master-detail {
40704
- alias : UiMasterDetail
40705
- version : "1.0.0"
40706
- orbitals : (MasterDetailOrbital)
40707
- override-surface : (config)
40708
- ;; via uses Alias from "std/behaviors/ui-master-detail" { config { ... } }
40709
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail.orb)"
40710
- }
40711
-
40712
40721
  ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb)
40713
40722
  app ui-master-detail-layout {
40714
40723
  alias : UiMasterDetailLayout
@@ -40833,15 +40842,18 @@ app ui-toast-slot {
40833
40842
  orbital std-agent-assistant.orbitals.AgentAssistantOrbital {
40834
40843
  alias : AgentAssistant
40835
40844
  entity : AgentAssistant
40836
- traits : (AssistantThread = Session.traits.AgentThread AssistantContext = Context.traits.AgentContextCompactor AssistantMemory = Memory.traits.AgentMemoryRecall AssistantLoop = Loop.traits.AgentToolLoop AssistantTrace = Trace.traits.AgentTraceRecorder)
40845
+ traits : (AssistantThread = Session.traits.AgentThread AssistantChatKeeper = Session.traits.AgentChatKeeper AssistantConversation = Session.traits.AgentConversation AssistantLayout = Shell.traits.AppLayout AssistantContext = Context.traits.AgentContextCompactor AssistantMemory = Memory.traits.AgentMemoryRecall AssistantLoop = Loop.traits.AgentToolLoop AssistantTrace = Trace.traits.AgentTraceRecorder)
40837
40846
  pages : ("/assistant")
40838
40847
  config {
40848
+ appName : string = "Assistant" @label "App name in the assistant page's header" @description "Pass the app's own name so the assistant page matches the rest of the app." @tier "presentation"
40839
40849
  instructions : string = "You operate this app for the signed-in user. Use the tools to act and to look things up; when a tool reports that something was refused or denied, say so plainly." @label "How should the assistant behave?" @description "Standing instructions sent with every request." @synonyms "system prompt, persona, guidance" @tier "domain"
40840
40850
  keepMessages : number = 12 @label "Turns kept verbatim" @tier "policy"
40841
- links : [AgentLink] = [{"href":"/assistant/runs","label":"Run history"},{"href":"/assistant/memory","label":"What I remember"}] @label "Links above the conversation" @description "The pages showing the assistant's run history and memory." @tier "presentation"
40851
+ links : [AgentLink] = [{"href":"/assistant/runs","label":"Run history"}] @label "Links above the conversation" @description "Related pages, e.g. the assistant's run history." @tier "presentation"
40842
40852
  maxSteps : number = 8 @label "Model round-trips per request" @tier "policy"
40853
+ navItems : [NavItem] = [] @label "Sidebar navigation on the assistant page" @description "Pass the app's own navItems so the assistant page keeps the app's sidebar." @tier "presentation"
40843
40854
  recallLimit : number = 3 @label "Memories recalled per request" @tier "policy"
40844
- tools : [AgentTool] = [] @label "What may the assistant do?" @description "The declared inputs it may fire (`{ event: Trait.EVENT }` / `{ event: Orbital.Trait.EVENT }`) and the entities it may read (`{ read: Entity }`), as the signed-in user." @synonyms "allowlist, abilities, actions, permissions" @tier "domain"
40855
+ tools : [AgentTool] = [{"scope":"declared"}] @label "What may the assistant do?" @description "As the signed-in user: `{ scope: declared }` (the default) gives it every external input the program declares and a read over every persisted entity, so each building block's declared inputs become its abilities; or list them — `{ event: Orbital.Trait.EVENT }` for one input, `{ read: Entity }` for one entity." @synonyms "allowlist, abilities, actions, permissions" @tier "domain"
40856
+ viewerRole : string = "" @label "Viewer role on the assistant page" @description "The role the assistant page's sidebar items and their `roles` are checked against. Bind `@user.role` in an app whose identity carries a role; left empty, only items with no `roles` show." @tier "policy"
40845
40857
  }
40846
40858
  override-surface : (entity fields extend pages omit only config events roles entities mounts)
40847
40859
  source : "@almadar/std (behaviors/registry/agent/organisms/std-agent-assistant.orb orbitals[0])"
@@ -40851,8 +40863,8 @@ orbital std-agent-assistant.orbitals.AgentAssistantOrbital {
40851
40863
  orbital std-agent-assistant.orbitals.AgentRecordsOrbital {
40852
40864
  alias : AgentAssistant
40853
40865
  entity : AgentRun
40854
- traits : (AgentRunHistory = Trace.traits.AgentRunBrowse AgentMemoryList = Memory.traits.AgentMemoryBrowse)
40855
- pages : ("/assistant/runs" "/assistant/memory")
40866
+ traits : (AgentRunHistory = Trace.traits.AgentRunBrowse)
40867
+ pages : ("/assistant/runs")
40856
40868
  override-surface : (entity fields extend pages omit only config events roles entities mounts)
40857
40869
  source : "@almadar/std (behaviors/registry/agent/organisms/std-agent-assistant.orb orbitals[1])"
40858
40870
  }
@@ -41067,36 +41079,6 @@ orbital ui-drawer-slot.orbitals.DrawerSlotOrbital {
41067
41079
  source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-drawer-slot.orb orbitals[0])"
41068
41080
  }
41069
41081
 
41070
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-cards.orb orbitals[0])
41071
- orbital ui-entity-cards.orbitals.EntityCardsOrbital {
41072
- alias : UiEntityCards
41073
- entity : EntityCardsItem
41074
- traits : (EntityCardsRender)
41075
- pages : ("/entity-cards")
41076
- override-surface : (entity fields extend pages omit only config events roles entities mounts)
41077
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-cards.orb orbitals[0])"
41078
- }
41079
-
41080
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-list.orb orbitals[0])
41081
- orbital ui-entity-list.orbitals.EntityListOrbital {
41082
- alias : UiEntityList
41083
- entity : EntityListItem
41084
- traits : (EntityListRender)
41085
- pages : ("/entity-list")
41086
- override-surface : (entity fields extend pages omit only config events roles entities mounts)
41087
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-list.orb orbitals[0])"
41088
- }
41089
-
41090
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-table.orb orbitals[0])
41091
- orbital ui-entity-table.orbitals.EntityTableOrbital {
41092
- alias : UiEntityTable
41093
- entity : EntityTableItem
41094
- traits : (EntityTableRender)
41095
- pages : ("/entity-table")
41096
- override-surface : (entity fields extend pages omit only config events roles entities mounts)
41097
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-table.orb orbitals[0])"
41098
- }
41099
-
41100
41082
  ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-form.orb orbitals[0])
41101
41083
  orbital ui-form.orbitals.FormOrbital {
41102
41084
  alias : UiForm
@@ -41117,16 +41099,6 @@ orbital ui-form-section.orbitals.FormSectionOrbital {
41117
41099
  source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-form-section.orb orbitals[0])"
41118
41100
  }
41119
41101
 
41120
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail.orb orbitals[0])
41121
- orbital ui-master-detail.orbitals.MasterDetailOrbital {
41122
- alias : UiMasterDetail
41123
- entity : MasterDetailItem
41124
- traits : (MasterDetailRender)
41125
- pages : ("/master-detail")
41126
- override-surface : (entity fields extend pages omit only config events roles entities mounts)
41127
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail.orb orbitals[0])"
41128
- }
41129
-
41130
41102
  ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb orbitals[0])
41131
41103
  orbital ui-master-detail-layout.orbitals.MasterDetailLayoutOrbital {
41132
41104
  alias : UiMasterDetailLayout
@@ -41478,36 +41450,6 @@ entity ui-drawer-slot.entity {
41478
41450
  source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-drawer-slot.orb orbitals[0].entity)"
41479
41451
  }
41480
41452
 
41481
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-cards.orb orbitals[0].entity)
41482
- entity ui-entity-cards.entity {
41483
- alias : UiEntityCards
41484
- name : EntityCardsItem
41485
- persistence : runtime
41486
- fields : (id!)
41487
- override-surface : (extends name fields persistence collection)
41488
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-cards.orb orbitals[0].entity)"
41489
- }
41490
-
41491
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-list.orb orbitals[0].entity)
41492
- entity ui-entity-list.entity {
41493
- alias : UiEntityList
41494
- name : EntityListItem
41495
- persistence : runtime
41496
- fields : (id!)
41497
- override-surface : (extends name fields persistence collection)
41498
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-list.orb orbitals[0].entity)"
41499
- }
41500
-
41501
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-table.orb orbitals[0].entity)
41502
- entity ui-entity-table.entity {
41503
- alias : UiEntityTable
41504
- name : EntityTableItem
41505
- persistence : runtime
41506
- fields : (id!)
41507
- override-surface : (extends name fields persistence collection)
41508
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-table.orb orbitals[0].entity)"
41509
- }
41510
-
41511
41453
  ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-form.orb orbitals[0].entity)
41512
41454
  entity ui-form.entity {
41513
41455
  alias : UiForm
@@ -41528,16 +41470,6 @@ entity ui-form-section.entity {
41528
41470
  source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-form-section.orb orbitals[0].entity)"
41529
41471
  }
41530
41472
 
41531
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail.orb orbitals[0].entity)
41532
- entity ui-master-detail.entity {
41533
- alias : UiMasterDetail
41534
- name : MasterDetailItem
41535
- persistence : runtime
41536
- fields : (id!)
41537
- override-surface : (extends name fields persistence collection)
41538
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail.orb orbitals[0].entity)"
41539
- }
41540
-
41541
41473
  ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb orbitals[0].entity)
41542
41474
  entity ui-master-detail-layout.entity {
41543
41475
  alias : UiMasterDetailLayout
@@ -42163,6 +42095,7 @@ trait ui-dashboard-grid.traits.DashboardGridRender {
42163
42095
  skeleton : 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)
42164
42096
  sortBy : string @label "Sort By" @description "Current sort field" @tier "presentation"
42165
42097
  sortDirection : string @label "Sort Direction" @description "Current sort direction" @tier "presentation" @values (asc desc)
42098
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out. Each cell is a tile." @tier "presentation" @values (auto none)
42166
42099
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42167
42100
  totalCount : number @label "Total Count" @description "Total number of items" @tier "presentation"
42168
42101
  }
@@ -42206,7 +42139,7 @@ trait ui-detail-panel.traits.DetailPanelRender {
42206
42139
  enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
42207
42140
  error : DetailPanelError @label "Error" @description "Error state (UiError)" @tier "presentation"
42208
42141
  fieldNames : [string] = [] @label "Field Names" @description "Alias for fields - backwards compatibility" @tier "presentation"
42209
- fields : [DetailPanelFieldsItem] = [{"format":"date","icon":"circle","label":"Label","name":"Name","relation":{"cardinality":"one","entity":"Entity"},"type":"Type","values":["Item","Item 2"],"variant":"h3"},{"format":"datetime","icon":"circle","label":"Label 2","name":"Name 2","relation":{"cardinality":"many","entity":"Entity 2"},"type":"Type 2","values":["Item","Item 2"],"variant":"h4"}] @label "Fields" @description "Fields to display: field names, or declared fields ({ name, label, variant, format, colorMap, labels })" @tier "presentation"
42142
+ fields : [DetailPanelFieldsItem] = [{"format":"date","icon":"circle","label":"Label","name":"Name","relation":{"cardinality":"one","entity":"Entity"},"type":"Type","values":["Item","Item 2"],"variant":"h3"},{"format":"time","icon":"circle","label":"Label 2","name":"Name 2","relation":{"cardinality":"many","entity":"Entity 2"},"type":"Type 2","values":["Item","Item 2"],"variant":"h4"}] @label "Fields" @description "Fields to display: field names, or declared fields ({ name, label, variant, format, colorMap, labels })" @tier "presentation"
42210
42143
  footer : node @label "Footer" @description "footer prop" @tier "presentation"
42211
42144
  isLoading : boolean = false @label "Is Loading" @description "Loading state indicator" @tier "presentation"
42212
42145
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
@@ -42237,6 +42170,7 @@ trait ui-detail-panel.traits.DetailPanelRender {
42237
42170
  stages : [DetailPanelStagesItem] = [] @label "Stages" @description "The lifecycle in order, `{ value, label }` per stage (workflow)." @tier "presentation"
42238
42171
  status : DetailPanelStatus @label "Status" @description "status prop" @tier "presentation"
42239
42172
  subtitle : string @label "Subtitle" @description "subtitle prop" @tier "presentation"
42173
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out. Inline mode only; the slide-over is itself a surface." @tier "presentation" @values (auto none)
42240
42174
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42241
42175
  tabs : [DetailPanelTabsItem] = [] @label "Tabs" @description "Tabs after the overview tab, each listing declared field names (workspace)." @tier "presentation"
42242
42176
  threadContent : node @label "Thread Content" @description "The thread composed in instead of `thread` — e.g. the replies' own trait with its composer (conversation)." @tier "presentation"
@@ -42272,7 +42206,7 @@ trait ui-dock-layout.traits.DockLayoutRender {
42272
42206
  ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
42273
42207
  bottomPanel : node @label "Bottom Panel" @description "Collapsible, resizable-height bottom panel." @tier "presentation"
42274
42208
  bottomPanelClassName : string @label "Bottom Panel Class Name" @description "bottomPanelClassName prop" @tier "presentation"
42275
- bottomPanelCollapsed : boolean @label "Bottom Panel Collapsed" @description "Whether `bottomPanel` is collapsed. @default false" @tier "presentation"
42209
+ bottomPanelCollapsed : boolean @label "Bottom Panel Collapsed" @description "Whether `bottomPanel` is collapsed (controlled; the layout keeps its own state when omitted)." @tier "presentation"
42276
42210
  bottomPanelHeight : number = 30 @label "Bottom Panel Height" @description "Bottom panel size as a SplitPane ratio (0-100, percentage given to the panel). @default 30" @tier "presentation"
42277
42211
  bottomPanelIcon : icon @label "Bottom Panel Icon" @description "bottomPanelIcon prop" @tier "presentation"
42278
42212
  bottomPanelLabel : string @label "Bottom Panel Label" @description "Compact: the top-bar button that opens `bottomPanel`." @tier "presentation"
@@ -42296,13 +42230,13 @@ trait ui-dock-layout.traits.DockLayoutRender {
42296
42230
  role : 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)
42297
42231
  secondarySidebar : node @label "Secondary Sidebar" @description "Collapsible right sidebar." @tier "presentation"
42298
42232
  secondarySidebarClassName : string @label "Secondary Sidebar Class Name" @description "secondarySidebarClassName prop" @tier "presentation"
42299
- secondarySidebarCollapsed : boolean @label "Secondary Sidebar Collapsed" @description "Whether `secondarySidebar` is collapsed. @default false" @tier "presentation"
42233
+ secondarySidebarCollapsed : boolean @label "Secondary Sidebar Collapsed" @description "Whether `secondarySidebar` is collapsed (controlled; the layout keeps its own state when omitted)." @tier "presentation"
42300
42234
  secondarySidebarIcon : icon @label "Secondary Sidebar Icon" @description "secondarySidebarIcon prop" @tier "presentation"
42301
42235
  secondarySidebarLabel : string @label "Secondary Sidebar Label" @description "Compact: the top-bar button that opens `secondarySidebar` (e.g. 'Inspector', 'Chat')." @tier "presentation"
42302
42236
  secondarySidebarWidth : number = 280 @label "Secondary Sidebar Width" @description "Width of `secondarySidebar` in pixels (fixed — not resizable). @default 280" @tier "presentation"
42303
42237
  sidebar : node @label "Sidebar" @description "Collapsible, resizable left sidebar." @tier "presentation"
42304
42238
  sidebarClassName : string @label "Sidebar Class Name" @description "sidebarClassName prop" @tier "presentation"
42305
- sidebarCollapsed : boolean @label "Sidebar Collapsed" @description "Whether `sidebar` is collapsed. @default false" @tier "presentation"
42239
+ sidebarCollapsed : boolean @label "Sidebar Collapsed" @description "Whether `sidebar` is collapsed (controlled; the layout keeps its own state when omitted)." @tier "presentation"
42306
42240
  sidebarMinSize : number = 160 @label "Sidebar Min Size" @description "Minimum sidebar size in pixels, forwarded to SplitPane's `minSize`. @default 160" @tier "presentation"
42307
42241
  sidebarWidth : number = 20 @label "Sidebar Width" @description "Sidebar size as a SplitPane ratio (0-100, percentage of the sidebar/main split). @default 20" @tier "presentation"
42308
42242
  skeleton : 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)
@@ -42340,184 +42274,6 @@ trait ui-drawer-slot.traits.DrawerSlotRender {
42340
42274
  source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-drawer-slot.orb orbitals[0].traits[0])"
42341
42275
  }
42342
42276
 
42343
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-cards.orb orbitals[0].traits[0])
42344
- trait ui-entity-cards.traits.EntityCardsRender {
42345
- alias : UiEntityCards
42346
- linkedEntity : EntityCardsItem
42347
- category : interaction
42348
- states : (idle*)
42349
- events : (INIT EntityCardsLoaded @config.itemClickEvent VIEW)
42350
- transitions : ((idle -> idle on INIT) (idle -> idle on INIT) (idle -> idle on EntityCardsLoaded))
42351
- emits : (@config.itemClickEvent VIEW EntityCardsLoaded)
42352
- config {
42353
- activeFilters : Map<string,string> = {} @label "Active Filters" @description "Active filters" @tier "presentation"
42354
- alignItems : string = "stretch" @label "Align Items" @description "Align cards vertically in their cells" @tier "presentation" @values (start center end stretch)
42355
- ariaBusy : boolean @label "Aria-busy" @description "This region is updating; assistive technology waits before announcing it." @synonyms "aria-busy" @tier "presentation"
42356
- ariaCurrent : 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)
42357
- ariaDescribedby : string @label "Aria-describedby" @description "Id of the element whose text describes this one (help text, error)." @synonyms "aria-describedby" @tier "presentation"
42358
- ariaExpanded : boolean @label "Aria-expanded" @description "Whether the element it controls is expanded." @synonyms "aria-expanded" @tier "presentation"
42359
- ariaHidden : boolean @label "Aria-hidden" @description "Hide from assistive technology (decorative content only)." @synonyms "aria-hidden" @tier "presentation"
42360
- ariaLabel : 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"
42361
- ariaLabelledby : string @label "Aria-labelledby" @description "Id of the element whose text names this one." @synonyms "aria-labelledby" @tier "presentation"
42362
- ariaLive : 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)
42363
- ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
42364
- ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
42365
- children : node @label "Children" @description "Children elements (cards) - optional when using entity prop" @tier "presentation"
42366
- className : string @label "Class Name" @description "Additional CSS classes" @tier "presentation"
42367
- columns : [EntityCardsColumnsItem] = [] @label "Columns" @description "Alias for fields - backwards compatibility" @tier "presentation"
42368
- dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
42369
- enter : 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)
42370
- enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
42371
- error : EntityCardsError @label "Error" @description "Error state (UiError)" @tier "presentation"
42372
- fieldNames : [string] = [] @label "Field Names" @description "Alias for fields - backwards compatibility" @tier "presentation"
42373
- fields : [EntityCardsFieldsItem] = [{"format":"date","icon":"circle","label":"Label","name":"Name","variant":"h3"},{"format":"datetime","icon":"circle","label":"Label 2","name":"Name 2","variant":"h4"}] @label "Fields" @description "Fields to display - required for schema-driven rendering" @tier "presentation"
42374
- gap : string = "md" @label "Gap" @description "Gap between cards" @tier "presentation" @values (none sm md lg xl)
42375
- imageField : string @label "Image Field" @description "Entity field name containing an image URL to display as card thumbnail" @tier "presentation"
42376
- isLoading : boolean = false @label "Is Loading" @description "Loading state indicator" @tier "presentation"
42377
- itemActions : [EntityCardsItemActionsItem] = [{"event":"VIEW","label":"View","variant":"ghost"}] @label "Item Actions" @description "Actions for each card item (schema-driven)" @tier "presentation"
42378
- itemClickEvent : event = "ITEM_CLICK" @label "Item Click Event" @description "When set, clicking a card emits UI:{itemClickEvent} with { id, row }. Omit = cards are not clickable." @tier "presentation"
42379
- lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
42380
- maxCols : number @label "Max Cols" @description "Maximum number of columns" @tier "presentation"
42381
- minCardWidth : number = 280 @label "Min Card Width" @description "Minimum width of each card (default: 280px)" @tier "presentation"
42382
- pageProp : number @label "Page" @description "Current page number" @synonyms "page" @tier "presentation"
42383
- pageSize : number @label "Page Size" @description "Number of items per page" @tier "presentation"
42384
- role : 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)
42385
- searchValue : string @label "Search Value" @description "Current search query value" @tier "presentation"
42386
- selectedIds : [string] = [] @label "Selected Ids" @description "Currently selected item IDs" @tier "presentation"
42387
- selfFetch : boolean = true @label "Fetch its own rows on mount?" @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's." @tier "internal"
42388
- showAvatar : boolean @label "Show Avatar" @description "Show avatar/image field on cards" @tier "presentation"
42389
- showTotal : boolean = true @label "Show Total" @description "Show total count in pagination" @tier "presentation"
42390
- skeleton : string = "grid" @label "Skeleton" @description "Skeleton drawn while loading, and the shape an empty slot shows while this element's server render is in flight (`none` opts out)." @tier "presentation" @values (header table list grid detail stats form card text none)
42391
- sortBy : string @label "Sort By" @description "Current sort field" @tier "presentation"
42392
- sortDirection : string @label "Sort Direction" @description "Current sort direction" @tier "presentation" @values (asc desc)
42393
- tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42394
- totalCount : number @label "Total Count" @description "Total number of items" @tier "presentation"
42395
- variant : string @label "Variant" @description "Visual variant for the card grid" @tier "presentation"
42396
- viewerRole : string = "" @label "Viewer's role" @description "The viewer's role that each action's `roles` is checked against; bind it at the call site (e.g. `viewerRole: @user.role`). Empty = only actions with no `roles` show." @tier "policy"
42397
- }
42398
- override-surface : (linkedEntity name events effects listens emitsScope config)
42399
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-cards.orb orbitals[0].traits[0])"
42400
- }
42401
-
42402
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-list.orb orbitals[0].traits[0])
42403
- trait ui-entity-list.traits.EntityListRender {
42404
- alias : UiEntityList
42405
- linkedEntity : EntityListItem
42406
- category : interaction
42407
- states : (idle*)
42408
- events : (INIT EntityListLoaded ITEM_ACTIONS @config.itemClickEvent VIEW)
42409
- transitions : ((idle -> idle on INIT) (idle -> idle on INIT) (idle -> idle on EntityListLoaded))
42410
- emits : (ITEM_ACTIONS @config.itemClickEvent VIEW EntityListLoaded)
42411
- config {
42412
- activeFilters : Map<string,string> = {} @label "Active Filters" @description "Active filters" @tier "presentation"
42413
- ariaBusy : boolean @label "Aria-busy" @description "This region is updating; assistive technology waits before announcing it." @synonyms "aria-busy" @tier "presentation"
42414
- ariaCurrent : 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)
42415
- ariaDescribedby : string @label "Aria-describedby" @description "Id of the element whose text describes this one (help text, error)." @synonyms "aria-describedby" @tier "presentation"
42416
- ariaExpanded : boolean @label "Aria-expanded" @description "Whether the element it controls is expanded." @synonyms "aria-expanded" @tier "presentation"
42417
- ariaHidden : boolean @label "Aria-hidden" @description "Hide from assistive technology (decorative content only)." @synonyms "aria-hidden" @tier "presentation"
42418
- ariaLabel : 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"
42419
- ariaLabelledby : string @label "Aria-labelledby" @description "Id of the element whose text names this one." @synonyms "aria-labelledby" @tier "presentation"
42420
- ariaLive : 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)
42421
- ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
42422
- ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
42423
- children : node @label "Children" @description "children prop" @tier "presentation"
42424
- className : string @label "Class Name" @description "Additional CSS classes" @tier "presentation"
42425
- completedField : string @label "Completed Field" @description "Row field that marks an item completed (`true` strikes its title through)" @tier "presentation"
42426
- dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
42427
- disabledField : string @label "Disabled Field" @description "Row field that marks an item disabled (`true` dims the row and disables its click)" @tier "presentation"
42428
- emptyMessage : string @label "Empty Message" @description "emptyMessage prop" @tier "presentation"
42429
- enter : 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)
42430
- enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
42431
- entityType : string @label "Entity Type" @description "Entity type name for display" @tier "presentation"
42432
- error : EntityListError @label "Error" @description "Error state (UiError)" @tier "presentation"
42433
- fieldNames : [string] = [] @label "Field Names" @description "Alias for fields - backwards compatibility" @tier "presentation"
42434
- fields : [EntityListFieldsItem] = [{"format":"date","icon":"circle","label":"Label","name":"Name","variant":"h3"},{"format":"datetime","icon":"circle","label":"Label 2","name":"Name 2","variant":"h4"}] @label "Fields" @description "Fields to display: field names, or declared fields ({ name, label, variant, format, colorMap, labels })" @tier "presentation"
42435
- isLoading : boolean = false @label "Is Loading" @description "Loading state indicator" @tier "presentation"
42436
- itemActions : [EntityListItemActionsItem] = [{"event":"VIEW","label":"View","variant":"ghost"}] @label "Item Actions" @description "Item actions - schema-driven or function-based" @tier "presentation"
42437
- itemClickEvent : event = "ITEM_CLICK" @label "Item Click Event" @description "When set, clicking a row emits UI:{itemClickEvent} with { id, row }. Omit = rows are not clickable." @tier "presentation"
42438
- lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
42439
- pageProp : number @label "Page" @description "Current page number" @synonyms "page" @tier "presentation"
42440
- pageSize : number @label "Page Size" @description "Number of items per page" @tier "presentation"
42441
- role : 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)
42442
- searchValue : string @label "Search Value" @description "Current search query value" @tier "presentation"
42443
- selectable : boolean = false @label "Selectable" @description "selectable prop" @tier "presentation"
42444
- selectedIds : [string] = [] @label "Selected Ids" @description "Currently selected item IDs" @tier "presentation"
42445
- selfFetch : boolean = true @label "Fetch its own rows on mount?" @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's." @tier "internal"
42446
- showDividers : boolean @label "Show Dividers" @description "showDividers prop" @tier "presentation"
42447
- skeleton : string = "list" @label "Skeleton" @description "Skeleton drawn while loading, and the shape an empty slot shows while this element's server render is in flight (`none` opts out)." @tier "presentation" @values (header table list grid detail stats form card text none)
42448
- sortBy : string @label "Sort By" @description "Current sort field" @tier "presentation"
42449
- sortDirection : string @label "Sort Direction" @description "Current sort direction" @tier "presentation" @values (asc desc)
42450
- tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42451
- totalCount : number @label "Total Count" @description "Total number of items" @tier "presentation"
42452
- variant : string @label "Variant" @description "variant prop" @tier "presentation" @values (default card)
42453
- viewerRole : string = "" @label "Viewer's role" @description "The viewer's role that each action's `roles` is checked against; bind it at the call site (e.g. `viewerRole: @user.role`). Empty = only actions with no `roles` show." @tier "policy"
42454
- }
42455
- override-surface : (linkedEntity name events effects listens emitsScope config)
42456
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-list.orb orbitals[0].traits[0])"
42457
- }
42458
-
42459
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-table.orb orbitals[0].traits[0])
42460
- trait ui-entity-table.traits.EntityTableRender {
42461
- alias : UiEntityTable
42462
- linkedEntity : EntityTableItem
42463
- category : interaction
42464
- states : (idle*)
42465
- events : (INIT EntityTableLoaded @config.itemClickEvent VIEW)
42466
- transitions : ((idle -> idle on INIT) (idle -> idle on INIT) (idle -> idle on EntityTableLoaded))
42467
- emits : (@config.itemClickEvent VIEW EntityTableLoaded)
42468
- config {
42469
- activeFilters : Map<string,string> = {} @label "Active Filters" @description "Active filters" @tier "presentation"
42470
- ariaBusy : boolean @label "Aria-busy" @description "This region is updating; assistive technology waits before announcing it." @synonyms "aria-busy" @tier "presentation"
42471
- ariaCurrent : 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)
42472
- ariaDescribedby : string @label "Aria-describedby" @description "Id of the element whose text describes this one (help text, error)." @synonyms "aria-describedby" @tier "presentation"
42473
- ariaExpanded : boolean @label "Aria-expanded" @description "Whether the element it controls is expanded." @synonyms "aria-expanded" @tier "presentation"
42474
- ariaHidden : boolean @label "Aria-hidden" @description "Hide from assistive technology (decorative content only)." @synonyms "aria-hidden" @tier "presentation"
42475
- ariaLabel : 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"
42476
- ariaLabelledby : string @label "Aria-labelledby" @description "Id of the element whose text names this one." @synonyms "aria-labelledby" @tier "presentation"
42477
- ariaLive : 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)
42478
- ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
42479
- ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
42480
- bulkActions : [EntityTableBulkActionsItem] = [] @label "Bulk Actions" @description "Bulk actions" @tier "presentation"
42481
- className : string @label "Class Name" @description "Additional CSS classes" @tier "presentation"
42482
- columns : [EntityTableColumnsItem] = [] @label "Columns" @description "Columns can be Column objects or simple string field names" @tier "presentation"
42483
- dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
42484
- emptyAction : EntityTableEmptyAction @label "Empty Action" @description "emptyAction prop" @tier "presentation"
42485
- emptyDescription : string @label "Empty Description" @description "emptyDescription prop" @tier "presentation"
42486
- emptyIcon : icon @label "Empty Icon" @description "emptyIcon prop" @tier "presentation"
42487
- emptyTitle : string @label "Empty Title" @description "emptyTitle prop" @tier "presentation"
42488
- enter : 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)
42489
- enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
42490
- error : EntityTableError @label "Error" @description "Error state (UiError)" @tier "presentation"
42491
- fields : [EntityTableFieldsItem] = [{"align":"left","format":"date","header":"Header","key":"Key","label":"Label","name":"Name","sortable":false,"width":"Width"},{"align":"center","format":"datetime","header":"Header 2","key":"Key 2","label":"Label 2","name":"Name 2","sortable":true,"width":"Width 2"}] @label "Fields" @description "Fields to display - accepts string[] or Column[] for unified interface. Alias for columns" @tier "presentation"
42492
- headerActions : node @label "Header Actions" @description "Header actions" @tier "presentation"
42493
- isLoading : boolean = false @label "Is Loading" @description "Loading state indicator" @tier "presentation"
42494
- itemActions : [EntityTableItemActionsItem] = [{"event":"VIEW","label":"View","variant":"ghost"}] @label "Item Actions" @description "Item actions from generated code - maps to rowActions" @tier "presentation"
42495
- itemClickEvent : event = "ITEM_CLICK" @label "Item Click Event" @description "When set, rows are activatable and emit UI:{itemClickEvent} with { id, row }" @tier "presentation"
42496
- lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
42497
- look : string = "dense" @label "Look" @description "Layer 2 visual treatment — orthogonal to the semantic variant." @tier "presentation" @values (dense spacious striped borderless card-rows)
42498
- pageProp : number @label "Page" @description "Current page number" @synonyms "page" @tier "presentation"
42499
- pageSize : number @label "Page Size" @description "Number of items per page" @tier "presentation"
42500
- relationsData : Map<string,[EntityTableRelationsDataValueItem]> = {} @label "Relations Data" @description "Relation display data: { fieldName: [{value, label}] } — injected server-side by the runtime (relation-option injection) or bound by compiled codegen; resolves stored foreign ids to display names for a column whose field is relation-typed. Same contract DetailPanel takes." @tier "presentation"
42501
- role : 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)
42502
- rowActions : [EntityTableRowActionsItem] = [] @label "Row Actions" @description "Row actions" @tier "presentation"
42503
- searchable : boolean = false @label "Searchable" @description "Search" @tier "presentation"
42504
- searchPlaceholder : string @label "Search Placeholder" @description "searchPlaceholder prop" @tier "presentation"
42505
- searchValue : string @label "Search Value" @description "Current search query value" @tier "presentation"
42506
- selectable : boolean = false @label "Selectable" @description "Selection" @tier "presentation"
42507
- selectedIds : [string] = [] @label "Selected Ids" @description "Currently selected item IDs" @tier "presentation"
42508
- selfFetch : boolean = true @label "Fetch its own rows on mount?" @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's." @tier "internal"
42509
- showTotal : boolean = true @label "Show Total" @description "Show total count in pagination" @tier "presentation"
42510
- skeleton : string = "table" @label "Skeleton" @description "Skeleton drawn while loading, and the shape an empty slot shows while this element's server render is in flight (`none` opts out)." @tier "presentation" @values (header table list grid detail stats form card text none)
42511
- sortBy : string @label "Sort By" @description "Current sort field" @tier "presentation"
42512
- sortDirection : string = "asc" @label "Sort Direction" @description "Current sort direction" @tier "presentation" @values (asc desc)
42513
- tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42514
- totalCount : number @label "Total Count" @description "Total number of items" @tier "presentation"
42515
- viewerRole : string = "" @label "Viewer's role" @description "The viewer's role that each action's `roles` is checked against; bind it at the call site (e.g. `viewerRole: @user.role`). Empty = only actions with no `roles` show." @tier "policy"
42516
- }
42517
- override-surface : (linkedEntity name events effects listens emitsScope config)
42518
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-table.orb orbitals[0].traits[0])"
42519
- }
42520
-
42521
42277
  ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-form.orb orbitals[0].traits[0])
42522
42278
  trait ui-form.traits.FormRender {
42523
42279
  alias : UiForm
@@ -42568,9 +42324,10 @@ trait ui-form.traits.FormRender {
42568
42324
  selfFetch : boolean = true @label "Fetch its own row on mount?" @description "true (default) = a mount that carries an id loads that one row (never the collection); a create-mode mount skips the load. false = a composing atom owns the load." @tier "internal"
42569
42325
  showCancel : boolean @label "Show Cancel" @description "Show cancel button (defaults to true for schema forms)" @tier "presentation"
42570
42326
  showSubmit : boolean = true @label "Show Submit" @description "Show submit button (defaults to true for schema forms). Set false when a parent atom owns the submit action externally (e.g. wizard footers)." @tier "presentation"
42571
- skeleton : 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)
42327
+ skeleton : string = "form" @label "Skeleton" @description "The shape an empty slot shows while this form's server render is in flight (`none` opts out). @default 'form'" @tier "presentation" @values (header table list grid detail stats form card text none)
42572
42328
  submitEvent : event = "SUBMIT" @label "Submit Event" @description "Event dispatch props (for trait state machine integration)" @tier "presentation"
42573
42329
  submitLabel : string @label "Submit Label" @description "Submit button label" @tier "presentation"
42330
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface (with card padding) behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
42574
42331
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42575
42332
  title : string @label "Title" @description "Form title (used by ModalSlot to extract title)" @tier "presentation"
42576
42333
  violationTriggers : [FormViolationTriggersItem] = [] @label "Violation Triggers" @description "Violation conditions that emit VIOLATION_DETECTED when met (boolean true means enabled but config loaded separately)" @tier "presentation"
@@ -42629,9 +42386,10 @@ trait ui-form-section.traits.FormSectionRender {
42629
42386
  selfFetch : boolean = true @label "Fetch its own row on mount?" @description "true (default) = a mount that carries an id loads that one row (never the collection); a create-mode mount skips the load. false = a composing atom owns the load." @tier "internal"
42630
42387
  showCancel : boolean @label "Show Cancel" @description "Show cancel button (defaults to true for schema forms)" @tier "presentation"
42631
42388
  showSubmit : boolean = true @label "Show Submit" @description "Show submit button (defaults to true for schema forms). Set false when a parent atom owns the submit action externally (e.g. wizard footers)." @tier "presentation"
42632
- skeleton : 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)
42389
+ skeleton : string = "form" @label "Skeleton" @description "The shape an empty slot shows while this form's server render is in flight (`none` opts out). @default 'form'" @tier "presentation" @values (header table list grid detail stats form card text none)
42633
42390
  submitEvent : event = "SUBMIT" @label "Submit Event" @description "Event dispatch props (for trait state machine integration)" @tier "presentation"
42634
42391
  submitLabel : string @label "Submit Label" @description "Submit button label" @tier "presentation"
42392
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface (with card padding) behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
42635
42393
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42636
42394
  title : string @label "Title" @description "Form title (used by ModalSlot to extract title)" @tier "presentation"
42637
42395
  violationTriggers : [FormSectionViolationTriggersItem] = [] @label "Violation Triggers" @description "Violation conditions that emit VIOLATION_DETECTED when met (boolean true means enabled but config loaded separately)" @tier "presentation"
@@ -42640,53 +42398,6 @@ trait ui-form-section.traits.FormSectionRender {
42640
42398
  source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-form-section.orb orbitals[0].traits[0])"
42641
42399
  }
42642
42400
 
42643
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail.orb orbitals[0].traits[0])
42644
- trait ui-master-detail.traits.MasterDetailRender {
42645
- alias : UiMasterDetail
42646
- linkedEntity : MasterDetailItem
42647
- category : interaction
42648
- states : (idle*)
42649
- events : (INIT MasterDetailLoaded)
42650
- transitions : ((idle -> idle on INIT) (idle -> idle on INIT) (idle -> idle on MasterDetailLoaded))
42651
- emits : (MasterDetailLoaded)
42652
- config {
42653
- activeFilters : Map<string,string> = {} @label "Active Filters" @description "Active filters" @tier "presentation"
42654
- ariaBusy : boolean @label "Aria-busy" @description "This region is updating; assistive technology waits before announcing it." @synonyms "aria-busy" @tier "presentation"
42655
- ariaCurrent : 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)
42656
- ariaDescribedby : string @label "Aria-describedby" @description "Id of the element whose text describes this one (help text, error)." @synonyms "aria-describedby" @tier "presentation"
42657
- ariaExpanded : boolean @label "Aria-expanded" @description "Whether the element it controls is expanded." @synonyms "aria-expanded" @tier "presentation"
42658
- ariaHidden : boolean @label "Aria-hidden" @description "Hide from assistive technology (decorative content only)." @synonyms "aria-hidden" @tier "presentation"
42659
- ariaLabel : 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"
42660
- ariaLabelledby : string @label "Aria-labelledby" @description "Id of the element whose text names this one." @synonyms "aria-labelledby" @tier "presentation"
42661
- ariaLive : 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)
42662
- ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
42663
- ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
42664
- className : string @label "Class Name" @description "Additional CSS classes" @tier "presentation"
42665
- detailFields : [string] = [] @label "Detail Fields" @description "Fields for detail view (passed through but typically handled by separate render_ui)" @tier "presentation"
42666
- dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
42667
- enter : 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)
42668
- enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
42669
- error : MasterDetailError @label "Error" @description "Error state (UiError)" @tier "presentation"
42670
- isLoading : boolean @label "Is Loading" @description "Loading state indicator" @tier "presentation"
42671
- lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
42672
- loading : boolean @label "Loading" @description "Loading state (alias for isLoading)" @tier "presentation"
42673
- masterFields : [string] = ["Item","Item 2"] @label "Master Fields" @description "Fields to show in the master list (maps to DataTable columns)" @tier "presentation"
42674
- pageProp : number @label "Page" @description "Current page number" @synonyms "page" @tier "presentation"
42675
- pageSize : number @label "Page Size" @description "Number of items per page" @tier "presentation"
42676
- role : 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)
42677
- searchValue : string @label "Search Value" @description "Current search query value" @tier "presentation"
42678
- selectedIds : [string] = [] @label "Selected Ids" @description "Currently selected item IDs" @tier "presentation"
42679
- selfFetch : boolean = true @label "Fetch its own rows on mount?" @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's." @tier "internal"
42680
- skeleton : 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)
42681
- sortBy : string @label "Sort By" @description "Current sort field" @tier "presentation"
42682
- sortDirection : string @label "Sort Direction" @description "Current sort direction" @tier "presentation" @values (asc desc)
42683
- tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42684
- totalCount : number @label "Total Count" @description "Total number of items" @tier "presentation"
42685
- }
42686
- override-surface : (linkedEntity name events effects listens emitsScope config)
42687
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail.orb orbitals[0].traits[0])"
42688
- }
42689
-
42690
42401
  ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb orbitals[0].traits[0])
42691
42402
  trait ui-master-detail-layout.traits.MasterDetailLayoutRender {
42692
42403
  alias : UiMasterDetailLayout
@@ -42773,6 +42484,7 @@ trait ui-media-gallery.traits.MediaGalleryRender {
42773
42484
  sortBy : string @label "Sort By" @description "Current sort field" @tier "presentation"
42774
42485
  sortDirection : string @label "Sort Direction" @description "Current sort direction" @tier "presentation" @values (asc desc)
42775
42486
  srcField : string = "src" @label "Src Field" @description "Record field holding each image's URL (entity mode). Default `src`." @tier "presentation"
42487
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
42776
42488
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42777
42489
  title : string @label "Title" @description "Gallery title" @tier "presentation"
42778
42490
  totalCount : number @label "Total Count" @description "Total number of items" @tier "presentation"
@@ -42868,7 +42580,7 @@ trait ui-segment-renderer.traits.SegmentRendererRender {
42868
42580
  enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
42869
42581
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
42870
42582
  role : 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)
42871
- segments : [SegmentRendererSegmentsItem] = [{"content":"Content","type":"markdown"},{"content":"Content 2","type":"markdown"}] @label "Segments" @description "Parsed lesson segments (see `parseLessonSegments`)" @tier "presentation"
42583
+ segments : [SegmentRendererSegmentsItem] = [{"answer":"Answer","question":"Question","type":"quiz"},{"answer":"Answer 2","question":"Question 2","type":"quiz"}] @label "Segments" @description "Parsed lesson segments (see `parseLessonSegments`)" @tier "presentation"
42872
42584
  skeleton : 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)
42873
42585
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42874
42586
  userProgress : SegmentRendererUserProgress @label "User Progress" @description "User progress for restoring activation/reflection state" @tier "presentation"
@@ -42968,6 +42680,7 @@ trait ui-stat-card.traits.StatCardRender {
42968
42680
  sortDirection : string @label "Sort Direction" @description "Current sort direction" @tier "presentation" @values (asc desc)
42969
42681
  sparklineData : [number] = [] @label "Sparkline Data" @description "Sparkline data points for an inline trend chart" @tier "presentation"
42970
42682
  subtitle : string @label "Subtitle" @description "Subtitle or description" @tier "presentation"
42683
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
42971
42684
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42972
42685
  title : string @label "Title" @description "Title (alias for label)" @tier "presentation"
42973
42686
  totalCount : number @label "Total Count" @description "Total number of items" @tier "presentation"
@@ -43003,19 +42716,19 @@ trait ui-state-machine-view.traits.StateMachineViewRender {
43003
42716
  ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
43004
42717
  className : string @label "Class Name" @description "className prop" @tier "presentation"
43005
42718
  dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
43006
- direction : string @label "Direction" @description "Flow direction. @default 'ltr'" @tier "presentation" @values (ltr rtl)
42719
+ direction : string = "ltr" @label "Direction" @description "Flow direction. @default 'ltr'" @tier "presentation" @values (ltr rtl)
43007
42720
  enter : 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)
43008
42721
  enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
43009
42722
  entityFields : [string] = [] @label "Entity Fields" @description "Entity field names listed in the header." @tier "presentation"
43010
42723
  error : StateMachineViewError @label "Error" @description "Error state" @tier "presentation"
43011
42724
  isLoading : boolean = false @label "Is Loading" @description "Loading state indicator" @tier "presentation"
43012
42725
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
43013
- nodeShape : string @label "Node Shape" @description "Node silhouette. @default 'pill'" @tier "presentation" @values (pill gear)
42726
+ nodeShape : string = "pill" @label "Node Shape" @description "Node silhouette. @default 'pill'" @tier "presentation" @values (pill gear)
43014
42727
  onTransitionClick : event = "TRANSITION_CLICK" @label "On Transition Click" @description "Direct transition-click callback, for React hosts (e.g. a canvas node)." @tier "presentation"
43015
42728
  pendingSourceState : string @label "Pending Source State" @description "Source of a transition being drawn — the next state click picks its target." @tier "presentation"
43016
42729
  role : 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)
43017
42730
  selectedState : string @label "Selected State" @description "State picked in an editor (first click)." @tier "presentation"
43018
- showHeader : boolean @label "Show Header" @description "Show the trait header (name, entity, listens/emits). @default true" @tier "presentation"
42731
+ showHeader : boolean = true @label "Show Header" @description "Show the trait header (name, entity, listens/emits). @default true" @tier "presentation"
43019
42732
  skeleton : 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)
43020
42733
  stateClickEvent : event = "STATE_CLICK" @label "State Click Event" @description "Emits UI:{stateClickEvent} with { stateId } when a state is clicked." @tier "presentation"
43021
42734
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
@@ -43049,6 +42762,7 @@ trait ui-subagent-trace-panel.traits.SubagentTracePanelRender {
43049
42762
  ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
43050
42763
  ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
43051
42764
  className : string @label "Class Name" @description "Additional CSS classes" @tier "presentation"
42765
+ coordinatorActivities : [SubagentTracePanelCoordinatorActivitiesItem] = [] @label "Coordinator Activities" @description "Full coordinator activities (tool calls, results, messages, errors)." @tier "presentation"
43052
42766
  coordinatorMessages : [SubagentTracePanelCoordinatorMessagesItem] = [] @label "Coordinator Messages" @description "Canonical Coordinator conversation — same shape live and on reload. When present, takes precedence over `coordinatorActivities` for the Coordinator section." @tier "presentation"
43053
42767
  dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
43054
42768
  disclosureLevel : number = 1 @label "Disclosure Level" @description "Drives density: 1-2 → compact, 3-4 → full activity embed (when mode='overlay')." @tier "presentation"
@@ -43152,6 +42866,7 @@ trait ui-timeline.traits.TimelineRender {
43152
42866
  selfFetch : boolean = true @label "Fetch its own rows on mount?" @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's." @tier "internal"
43153
42867
  skeleton : string = "list" @label "Skeleton" @description "Skeleton drawn while loading, and the shape an empty slot shows while this element's server render is in flight (`none` opts out)." @tier "presentation" @values (header table list grid detail stats form card text none)
43154
42868
  statusField : string @label "Status Field" @description "Entity field holding each item's status (complete | active | pending | error)." @tier "presentation"
42869
+ surface : string = "auto" @label "Surface" @description "Content surface: `auto` paints the theme's surface behind this block unless it already sits on one (a card, dialog or another block); `none` opts out." @tier "presentation" @values (auto none)
43155
42870
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
43156
42871
  title : string @label "Title" @description "Timeline title" @tier "presentation"
43157
42872
  titleField : string @label "Title Field" @description "Entity field holding each item's title." @tier "presentation"
@@ -43200,20 +42915,11 @@ trait ui-toast-slot.traits.ToastSlotRender {
43200
42915
  source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-toast-slot.orb orbitals[0].traits[0])"
43201
42916
  }
43202
42917
 
43203
- ;; From @almadar/std (behaviors/registry/agent/organisms/std-agent-assistant.orb orbitals[1].pages[1])
43204
- page std-agent-assistant.pages.AssistantMemoryPage {
43205
- alias : AgentAssistant
43206
- defaultPath : /assistant/memory
43207
- traits : (AgentMemoryList)
43208
- override-surface : (path linkedEntity traits)
43209
- source : "@almadar/std (behaviors/registry/agent/organisms/std-agent-assistant.orb orbitals[1].pages[1])"
43210
- }
43211
-
43212
42918
  ;; From @almadar/std (behaviors/registry/agent/organisms/std-agent-assistant.orb orbitals[0].pages[0])
43213
42919
  page std-agent-assistant.pages.AssistantPage {
43214
42920
  alias : AgentAssistant
43215
42921
  defaultPath : /assistant
43216
- traits : (AssistantThread AssistantContext AssistantMemory AssistantLoop AssistantTrace)
42922
+ traits : (AssistantLayout AssistantThread AssistantChatKeeper AssistantContext AssistantMemory AssistantLoop AssistantTrace)
43217
42923
  override-surface : (path linkedEntity traits)
43218
42924
  source : "@almadar/std (behaviors/registry/agent/organisms/std-agent-assistant.orb orbitals[0].pages[0])"
43219
42925
  }
@@ -43416,33 +43122,6 @@ page ui-drawer-slot.pages.DrawerSlotPage {
43416
43122
  source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-drawer-slot.orb orbitals[0].pages[0])"
43417
43123
  }
43418
43124
 
43419
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-cards.orb orbitals[0].pages[0])
43420
- page ui-entity-cards.pages.EntityCardsPage {
43421
- alias : UiEntityCards
43422
- defaultPath : /entity-cards
43423
- traits : (EntityCardsRender)
43424
- override-surface : (path linkedEntity traits)
43425
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-cards.orb orbitals[0].pages[0])"
43426
- }
43427
-
43428
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-list.orb orbitals[0].pages[0])
43429
- page ui-entity-list.pages.EntityListPage {
43430
- alias : UiEntityList
43431
- defaultPath : /entity-list
43432
- traits : (EntityListRender)
43433
- override-surface : (path linkedEntity traits)
43434
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-list.orb orbitals[0].pages[0])"
43435
- }
43436
-
43437
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-entity-table.orb orbitals[0].pages[0])
43438
- page ui-entity-table.pages.EntityTablePage {
43439
- alias : UiEntityTable
43440
- defaultPath : /entity-table
43441
- traits : (EntityTableRender)
43442
- override-surface : (path linkedEntity traits)
43443
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-entity-table.orb orbitals[0].pages[0])"
43444
- }
43445
-
43446
43125
  ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-form.orb orbitals[0].pages[0])
43447
43126
  page ui-form.pages.FormPage {
43448
43127
  alias : UiForm
@@ -43461,15 +43140,6 @@ page ui-form-section.pages.FormSectionPage {
43461
43140
  source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-form-section.orb orbitals[0].pages[0])"
43462
43141
  }
43463
43142
 
43464
- ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail.orb orbitals[0].pages[0])
43465
- page ui-master-detail.pages.MasterDetailPage {
43466
- alias : UiMasterDetail
43467
- defaultPath : /master-detail
43468
- traits : (MasterDetailRender)
43469
- override-surface : (path linkedEntity traits)
43470
- source : "@almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail.orb orbitals[0].pages[0])"
43471
- }
43472
-
43473
43143
  ;; From @almadar/std (behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb orbitals[0].pages[0])
43474
43144
  page ui-master-detail-layout.pages.MasterDetailLayoutPage {
43475
43145
  alias : UiMasterDetailLayout