@almadar/std 16.186.0 → 16.188.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 (83) hide show
  1. package/behaviors/lolo/ui/core/.hand-authored.json +4 -0
  2. package/behaviors/lolo/ui/core/atoms/std-board.lolo +138 -4
  3. package/behaviors/lolo/ui/core/atoms/std-browse.lolo +148 -8
  4. package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +141 -3
  5. package/behaviors/lolo/ui/core/atoms/std-event-log.lolo +255 -2
  6. package/behaviors/lolo/ui/core/atoms/std-gallery.lolo +148 -1
  7. package/behaviors/lolo/ui/core/atoms/std-list.lolo +193 -1
  8. package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +329 -0
  9. package/behaviors/lolo/ui/core/atoms/std-selection.lolo +182 -1
  10. package/behaviors/lolo/ui/core/atoms/std-tree.lolo +113 -3
  11. package/behaviors/lolo/ui/game/atoms/std-area-fill.lolo +93 -0
  12. package/behaviors/lolo/ui/game/atoms/std-loop-lock.lolo +79 -0
  13. package/behaviors/lolo/ui/game/atoms/std-pad-lock.lolo +93 -0
  14. package/behaviors/lolo/ui/game/atoms/std-patrol-hazard.lolo +14 -7
  15. package/behaviors/lolo/ui/game/atoms/std-platformer-body.lolo +21 -4
  16. package/behaviors/lolo/ui/game/atoms/std-velocity-gate.lolo +101 -0
  17. package/behaviors/registry/infra/atoms/std-approval-gate.orb +16 -8
  18. package/behaviors/registry/infra/atoms/std-cache-aside.orb +62 -31
  19. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +32 -16
  20. package/behaviors/registry/infra/atoms/std-data-erasure.orb +16 -8
  21. package/behaviors/registry/infra/atoms/std-mod-queue.orb +16 -8
  22. package/behaviors/registry/infra/atoms/std-rate-limiter.orb +28 -14
  23. package/behaviors/registry/infra/organisms/std-status-lifecycle-control.orb +2 -1
  24. package/behaviors/registry/ml/organisms/std-escalating-decision.orb +10 -5
  25. package/behaviors/registry/ml/organisms/std-knowledge-tracing.orb +4 -2
  26. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +2 -1
  27. package/behaviors/registry/ui/core/atoms/std-board.orb +355 -2
  28. package/behaviors/registry/ui/core/atoms/std-browse.orb +304 -31
  29. package/behaviors/registry/ui/core/atoms/std-calendar.orb +344 -0
  30. package/behaviors/registry/ui/core/atoms/std-dashboard-grid-embedded.orb +2 -1
  31. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +4 -2
  32. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +6 -3
  33. package/behaviors/registry/ui/core/atoms/std-event-log.orb +773 -0
  34. package/behaviors/registry/ui/core/atoms/std-export.orb +4 -2
  35. package/behaviors/registry/ui/core/atoms/std-gallery.orb +390 -0
  36. package/behaviors/registry/ui/core/atoms/std-import.orb +4 -2
  37. package/behaviors/registry/ui/core/atoms/std-list.orb +451 -0
  38. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +1141 -0
  39. package/behaviors/registry/ui/core/atoms/std-selection.orb +436 -0
  40. package/behaviors/registry/ui/core/atoms/std-tree.orb +292 -1
  41. package/behaviors/registry/ui/game/atoms/std-area-fill.orb +955 -0
  42. package/behaviors/registry/ui/game/atoms/std-fx-trail.orb +1 -1
  43. package/behaviors/registry/ui/game/atoms/std-gate-lock.orb +1 -1
  44. package/behaviors/registry/ui/game/atoms/std-lives.orb +1 -1
  45. package/behaviors/registry/ui/game/atoms/std-loop-lock.orb +785 -0
  46. package/behaviors/registry/ui/game/atoms/std-pad-lock.orb +903 -0
  47. package/behaviors/registry/ui/game/atoms/std-patrol-hazard.orb +190 -44
  48. package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +868 -637
  49. package/behaviors/registry/ui/game/atoms/std-velocity-gate.orb +1040 -0
  50. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +8 -4
  51. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +6 -3
  52. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +10 -5
  53. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +8 -4
  54. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +8 -4
  55. package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +7 -4
  56. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +8 -4
  57. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +12 -6
  58. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +8 -4
  59. package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +6 -3
  60. package/behaviors/registry/ui/learning/atoms/std-learn-slope-probe.orb +1 -1
  61. package/behaviors/registry/ui/marketing/atoms/std-marketing-article.orb +2 -1
  62. package/behaviors/registry/ui/marketing/atoms/std-marketing-footer.orb +2 -1
  63. package/behaviors/registry/ui/marketing/atoms/std-marketing-split.orb +2 -1
  64. package/behaviors/registry/ui/marketing/atoms/std-marketing-stats.orb +2 -1
  65. package/behaviors/registry/ui/marketing/atoms/std-marketing-steps.orb +2 -1
  66. package/behaviors/registry/ui/marketing/atoms/std-marketing-team.orb +2 -1
  67. package/dist/behaviors/exports-reader.js +7822 -3996
  68. package/dist/behaviors/functions/index.d.ts +598 -270
  69. package/dist/behaviors/functions/index.js +7805 -3989
  70. package/dist/behaviors/index.d.ts +1 -1
  71. package/dist/behaviors/index.js +7823 -3997
  72. package/dist/behaviors/query.js +7822 -3996
  73. package/dist/behaviors-embeddings.hash.json +3 -3
  74. package/dist/behaviors-embeddings.json +535 -519
  75. package/dist/behaviors-registry.json +2877 -2268
  76. package/dist/index.d.ts +1 -1
  77. package/dist/index.js +7823 -3997
  78. package/dist/knob-embeddings.hash.json +3 -3
  79. package/dist/knob-embeddings.json +1 -1
  80. package/dist/registry/factory-signatures.json +1 -1
  81. package/package.json +1 -1
  82. package/behaviors/lolo/ui/core/organisms/ui-ui-slot-renderer.lolo +0 -71
  83. package/behaviors/registry/ui/core/organisms/ui-ui-slot-renderer.orb +0 -234
@@ -1,5 +1,5 @@
1
1
  app std-patrol-hazard "1.0.0"
2
- "Headless patrol-hazard mechanic for side-view boards: moves each configured patrol back and forth along its [x0, x1] beat at its own speed (33ms tick, ping-pong with clamped turnarounds), tracks the player position off the body authority's BODY_MOVED, and emits PATROL_HIT once per contact — a per-patrol hit flag re-arms only after the player separates, so damage rules stay sparse (when two patrols connect on the same tick the first reports; the other reports on the next tick). Patrols live on a [runtime, shared] entity for the render layer (boards draw them as markers/sprites); damage, lives, and respawn stay downstream (std-lives) — this atom simulates, it never judges. Renders nothing."
2
+ "Headless patrol-hazard mechanic for side-view boards: moves each configured patrol back and forth along its [x0, x1] beat at its own speed (33ms tick, ping-pong with clamped turnarounds; a patrol declaring waveAmp/wavePeriod also bobs vertically — cy = y + waveAmp·sin(2πt/wavePeriod from a per-row time accumulator — and the hit test and render read cy, so a waveAmp of 0 keeps the flat beat), tracks the player position off the body authority's BODY_MOVED, and emits PATROL_HIT once per contact — a per-patrol hit flag re-arms only after the player separates, so damage rules stay sparse (when two patrols connect on the same tick the first reports; the other reports on the next tick). Patrols live on a [runtime, shared] entity for the render layer (boards draw them as markers/sprites); damage, lives, and respawn stay downstream (std-lives) — this atom simulates, it never judges. Renders nothing."
3
3
  orbital PatrolHazardOrbital {
4
4
  type Patrol = {
5
5
  id : string!
@@ -7,8 +7,12 @@ orbital PatrolHazardOrbital {
7
7
  x1 : number!
8
8
  y : number!
9
9
  speed : number!
10
+ waveAmp : number
11
+ wavePeriod : number
10
12
  x : number
11
13
  dir : number
14
+ t : number
15
+ cy : number
12
16
  touching : boolean
13
17
  hit : boolean
14
18
  }
@@ -25,7 +29,7 @@ orbital PatrolHazardOrbital {
25
29
 
26
30
  state active {
27
31
  INIT -> active
28
- (set @entity.patrols (array/map @config.patrols (fn p (object/merge @p { x: (object/get @p x0), dir: 1, touching: false, hit: false }))))
32
+ (set @entity.patrols (array/map @config.patrols (fn p (object/merge @p { x: (object/get @p x0), dir: 1, t: 0, cy: (object/get @p y), touching: false, hit: false }))))
29
33
  (set @entity.px @config.playerSpawnX)
30
34
  (set @entity.py @config.playerSpawnY)
31
35
 
@@ -34,7 +38,7 @@ orbital PatrolHazardOrbital {
34
38
  (set @entity.py @payload.y)
35
39
 
36
40
  RESTART -> active
37
- (set @entity.patrols (array/map @config.patrols (fn p (object/merge @p { x: (object/get @p x0), dir: 1, touching: false, hit: false }))))
41
+ (set @entity.patrols (array/map @config.patrols (fn p (object/merge @p { x: (object/get @p x0), dir: 1, t: 0, cy: (object/get @p y), touching: false, hit: false }))))
38
42
  }
39
43
 
40
44
  ticks {
@@ -45,11 +49,14 @@ orbital PatrolHazardOrbital {
45
49
  (let ((overshoot (> @nx (object/get @p x1))) (undershoot (< @nx (object/get @p x0))))
46
50
  (let ((cx (if @overshoot (object/get @p x1) (if @undershoot (object/get @p x0) @nx)))
47
51
  (cdir (if @overshoot -1 (if @undershoot 1 (object/get @p dir)))))
48
- (let ((near (and (<= (math/abs (- @entity.px @cx)) @config.hitRadius) (<= (math/abs (- @entity.py (object/get @p y))) @config.hitRadius))))
49
- (object/merge @p { x: @cx, dir: @cdir, hit: (and @near (== (object/get @p touching) false)), touching: @near }))))))))
52
+ (let ((nt (+ (object/get @p t) 0.033)))
53
+ (let ((amp (if (== (object/get @p waveAmp) null) 0 (object/get @p waveAmp))) (period (if (== (object/get @p wavePeriod) null) 3 (object/get @p wavePeriod))))
54
+ (let ((cy (+ (object/get @p y) (* @amp (math/sin (/ (* 6.283185307179586 @nt) @period))))))
55
+ (let ((near (and (<= (math/abs (- @entity.px @cx)) @config.hitRadius) (<= (math/abs (- @entity.py @cy)) @config.hitRadius))))
56
+ (object/merge @p { x: @cx, dir: @cdir, t: @nt, cy: @cy, hit: (and @near (== (object/get @p touching) false)), touching: @near })))))))))))
50
57
  (let ((hits (array/filter @entity.patrols (fn p (== (object/get @p hit) true)))))
51
58
  (if (> (array/len @hits) 0)
52
- (emit PATROL_HIT { id: (object/get (array/first @hits) id), x: (object/get (array/first @hits) x), y: (object/get (array/first @hits) y) })
59
+ (emit PATROL_HIT { id: (object/get (array/first @hits) id), x: (object/get (array/first @hits) x), y: (object/get (array/first @hits) cy) })
53
60
  null))
54
61
  }
55
62
 
@@ -75,7 +82,7 @@ orbital PatrolHazardOrbital {
75
82
  @tier "domain"
76
83
  patrols : [Patrol] = []
77
84
  @label "Patrols"
78
- @description "One row per patroller: id, the [x0, x1] beat it walks, its fixed y, and its speed in units/s. Current x/dir/touching/hit are stamped at runtime."
85
+ @description "One row per patroller: id, the [x0, x1] beat it walks, its base y, its speed in units/s, and optionally waveAmp/wavePeriod for a vertical sine bob (waveAmp 0 = flat ping-pong). Current x/dir/t/cy/touching/hit are stamped at runtime."
79
86
  @tier "domain"
80
87
  hitRadius : number = 0.7
81
88
  @label "Hit Radius"
@@ -1,5 +1,5 @@
1
1
  app std-platformer-body "1.0.0"
2
- "Headless run/jump platformer-physics authority: the SOLE writer of body + fell + hazardId + goalId on side-view boards. Where std-motion-body owns free 2D drift (no collision), this atom owns the platformer contract: every 33ms physics tick it integrates gravity into the body's vertical velocity, steps position in per-second units, and collides the body rect against the config platforms with one-way semantics — a body moving in the gravity direction that overlaps a ground/platform tile lands on its anti-gravity face (vy zeroed, grounded set), while a body moving against gravity passes through, so jumping up through a platform and walking up a staircase both just work. The sign of gravity IS the vertical convention: positive pulls toward +y (screen boards, y down — sprite canvases), negative toward −y (math canvases, y up); jumps always fire against it. Intents: STEER sets horizontal velocity (dir −1/0/1 × moveSpeed, hold-to-run: keydown steers, keyup steers 0), JUMP kicks vertical velocity when grounded, PLACE teleports (spawns, hazard respawns), RESTART reseeds. Emits BODY_MOVED every tick for the render layer (boards that don't subscribe pay nothing), plus the sparse rule signals a board needs to score: BODY_JUMPED, BODY_LANDED (with impact speed), BODY_HAZARD (once per hazard entry, re-arms on exit), BODY_GOAL (same arming), BODY_FELL (once per fall past killY, re-armed by PLACE/RESTART). Curve skating: when config.skate is on and the grounded body comes within skateSnap of the config.skateCurve surface, the body rides the curve — y snaps to the interpolated surface and tangential gravity (g·slope/(1+slope²)) accelerates vx, so the body slides downhill along the graph itself and launches ballistically off its ends; jumping kicks free. Sparse BODY_SKATE_START/BODY_SKATE_END signals fire on engage/disengage so boards can layer fx. Lives, score, and win/lose stay downstream — this atom simulates, it never judges. Renders nothing."
2
+ "Headless run/jump platformer-physics authority: the SOLE writer of body + fell + hazardId + goalId on side-view boards. Where std-motion-body owns free 2D drift (no collision), this atom owns the platformer contract: every 33ms physics tick it integrates gravity into the body's vertical velocity, steps position in per-second units, and collides the body rect against the config platforms with one-way semantics — a body moving in the gravity direction that overlaps a ground/platform tile lands on its anti-gravity face (vy zeroed, grounded set), while a body moving against gravity passes through, so jumping up through a platform and walking up a staircase both just work. The sign of gravity IS the vertical convention: positive pulls toward +y (screen boards, y down — sprite canvases), negative toward −y (math canvases, y up); jumps always fire against it. Intents: STEER sets horizontal velocity (dir −1/0/1 × moveSpeed, hold-to-run: keydown steers, keyup steers 0), JUMP kicks vertical velocity when grounded, PLACE teleports (spawns, hazard respawns), RESTART reseeds. Emits BODY_MOVED every tick for the render layer (boards that don't subscribe pay nothing), plus the sparse rule signals a board needs to score: BODY_JUMPED, BODY_LANDED (with impact speed), BODY_HAZARD (once per hazard entry, re-arms on exit), BODY_GOAL (same arming), BODY_FELL (once per fall past killY, re-armed by PLACE/RESTART). Drift regions: config.driftRegions lists axis-aligned rects each carrying a constant acceleration (ax, ay) applied with the same 0.033s dt whenever the body's center is inside (empty list = zero behavior change). Curve skating: when config.skate is on and the grounded body comes within skateSnap of the config.skateCurve surface, the body rides the curve — y snaps to the interpolated surface and tangential gravity (g·slope/(1+slope²)) accelerates vx, so the body slides downhill along the graph itself and launches ballistically off its ends; jumping kicks free. Sparse BODY_SKATE_START/BODY_SKATE_END signals fire on engage/disengage so boards can layer fx. Lives, score, and win/lose stay downstream — this atom simulates, it never judges. Renders nothing."
3
3
  orbital PlatformerBodyOrbital {
4
4
  type PlatformerBody = {
5
5
  x : number!
@@ -23,6 +23,15 @@ orbital PlatformerBodyOrbital {
23
23
  x : number!
24
24
  y : number!
25
25
  }
26
+ type BodyDriftRegion = {
27
+ id : string!
28
+ x0 : number!
29
+ x1 : number!
30
+ y0 : number!
31
+ y1 : number!
32
+ ax : number!
33
+ ay : number!
34
+ }
26
35
 
27
36
  entity PlatformerBodyData [runtime, shared] {
28
37
  id : string!
@@ -69,7 +78,10 @@ orbital PlatformerBodyOrbital {
69
78
  physicsTick every 33ms
70
79
  when (and @config.running (> @entity.body.width 0))
71
80
  (let ((gdir (if (> @config.gravity 0) 1 -1)))
72
- (let ((vy1 (math/clamp (+ @entity.body.vy (* @config.gravity 0.033)) (- 0 @config.maxFallSpeed) @config.maxFallSpeed)))
81
+ (let ((bcx (+ (object/get @entity.body x) (/ (object/get @entity.body width) 2))) (bcy (+ (object/get @entity.body y) (/ (object/get @entity.body height) 2))))
82
+ (let ((drift (array/find @config.driftRegions (fn r (and (>= @bcx (object/get @r x0)) (and (<= @bcx (object/get @r x1)) (and (>= @bcy (object/get @r y0)) (<= @bcy (object/get @r y1)))))))))
83
+ (let ((dax (if (== @drift null) 0 (object/get @drift ax))) (day (if (== @drift null) 0 (object/get @drift ay))))
84
+ (let ((vy1 (math/clamp (+ @entity.body.vy (* (+ @config.gravity @day) 0.033)) (- 0 @config.maxFallSpeed) @config.maxFallSpeed)))
73
85
  (let ((bw (object/get @entity.body width)) (bh (object/get @entity.body height)))
74
86
  (let ((nx (math/clamp (+ @entity.body.x (* @entity.body.vx 0.033)) @config.xMin @config.xMax)))
75
87
  (let ((ny (+ @entity.body.y (* @vy1 0.033))))
@@ -86,12 +98,13 @@ orbital PlatformerBodyOrbital {
86
98
  (let ((movingUp (< (* @vy1 @gdir) -0.01)))
87
99
  (let ((skateNow (and @inRange (and (<= (math/abs (- @ny2 @curveY)) @config.skateSnap) (and (or @landed @entity.skating) (or @entity.body.grounded (not @movingUp)))))))
88
100
  (let ((vx2 (if @skateNow (math/clamp (+ @entity.body.vx (* (/ (* @config.gravity @slope) (+ 1 (* @slope @slope))) 0.033)) (- 0 @config.maxFallSpeed) @config.maxFallSpeed) @entity.body.vx)))
101
+ (let ((vx3 (if (== @drift null) @vx2 (math/clamp (+ @vx2 (* @dax 0.033)) (- 0 @config.maxFallSpeed) @config.maxFallSpeed))))
89
102
  (let ((fy (if @skateNow @curveY @ny2)) (fvy (if @skateNow (* @slope @vx2) @vy2)) (fgrounded (or @landed @skateNow)))
90
103
  (let ((hazardHit (array/find @config.platforms (fn p (and (== (object/get @p type) "hazard") (geo/aabb-overlap @rect { x: @p.x, y: @p.y, w: @p.width, h: @p.height }))))))
91
104
  (let ((goalHit (array/find @config.platforms (fn p (and (== (object/get @p type) "goal") (geo/aabb-overlap @rect { x: @p.x, y: @p.y, w: @p.width, h: @p.height }))))))
92
105
  (let ((fellNow (if (> @gdir 0) (> @fy @config.killY) (< @fy @config.killY))))
93
106
  (do
94
- (set @entity.body (object/merge @entity.body { x: @nx, y: @fy, vx: (if (or (== @nx @config.xMin) (== @nx @config.xMax)) 0 @vx2), vy: @fvy, grounded: @fgrounded }))
107
+ (set @entity.body (object/merge @entity.body { x: @nx, y: @fy, vx: (if (or (== @nx @config.xMin) (== @nx @config.xMax)) 0 @vx3), vy: @fvy, grounded: @fgrounded }))
95
108
  (set @entity.skating @skateNow)
96
109
  (if (and @skateNow (== @entity.skating false))
97
110
  (emit BODY_SKATE_START { x: @nx, y: @fy, slope: @slope })
@@ -121,7 +134,7 @@ orbital PlatformerBodyOrbital {
121
134
  (set @entity.fell true)
122
135
  (emit BODY_FELL { x: @nx, y: @fy }))
123
136
  null)
124
- (emit BODY_MOVED { x: @nx, y: @fy, vx: @entity.body.vx, vy: @fvy, grounded: @fgrounded, skating: @skateNow, speed: (math/hypot @entity.body.vx @fvy) }))))))))))))))))))))))))
137
+ (emit BODY_MOVED { x: @nx, y: @fy, vx: @entity.body.vx, vy: @fvy, grounded: @fgrounded, skating: @skateNow, speed: (math/hypot @entity.body.vx @fvy) }))))))))))))))))))))))))))))
125
138
  }
126
139
 
127
140
  emits {
@@ -244,6 +257,10 @@ orbital PlatformerBodyOrbital {
244
257
  @label "Skate Snap"
245
258
  @description "Max vertical gap (world units) between the body's min corner and the curve surface for skating to engage or stay engaged; larger values grab earlier on landing, smaller values release sooner on bumps"
246
259
  @tier "domain"
260
+ driftRegions : [BodyDriftRegion] = []
261
+ @label "Drift Regions"
262
+ @description "Axis-aligned rects (x0..x1, y0..y1 in world units) each carrying a constant acceleration (ax, ay in units/s²) applied with the physics dt whenever the body's center is inside — winds, currents, gradient pushes. Empty list = zero behavior change."
263
+ @tier "domain"
247
264
  }
248
265
  }
249
266
 
@@ -0,0 +1,101 @@
1
+ app std-velocity-gate "1.0.0"
2
+ "Headless velocity-gate mechanic: gates that open only when the player crosses them inside a speed band, optionally in a required direction, optionally sustained for a dwell. Listens BODY_MOVED and, per closed gate, tests the player's rect (padded by reachMargin), their speed against [minSpeed, maxSpeed], and their horizontal direction against dir (0 = either). Instant gates (dwellMs 0) open on the first passing cross; dwell gates (dwellMs > 0) accumulate ~33ms per passing move and open once held reaches dwellMs — a failing move resets the hold. The first newly opened gate emits VELOCITY_GATE_OPENED (the shared entity carries the rest). Entering a closed INSTANT gate while NOT passing emits VELOCITY_GATE_DENIED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a hint fx; dwell gates never deny (a hot entry is fine — coming to rest inside is the point), a failed hold simply resets. RESTART re-closes every gate. Renders nothing; boards draw the gate band/chest and read open/held from the shared entity (the render authority)."
3
+ orbital VelocityGateOrbital {
4
+ type VelocityGate = {
5
+ id : string!
6
+ x : number!
7
+ y : number!
8
+ width : number!
9
+ height : number!
10
+ minSpeed : number!
11
+ maxSpeed : number!
12
+ dwellMs : number!
13
+ dir : number!
14
+ hint : string
15
+ open : boolean
16
+ touching : boolean
17
+ denied : boolean
18
+ held : number
19
+ reported : boolean
20
+ }
21
+
22
+ entity VelocityGateData [runtime, shared] {
23
+ id : string!
24
+ gates : [VelocityGate] = []
25
+ }
26
+
27
+ trait VelocityGate -> @rebindable VelocityGateData [lifecycle] {
28
+ initial: active
29
+
30
+ state active {
31
+ INIT -> active
32
+ (set @entity.gates (array/map @config.gates (fn g (object/merge @g { open: false, touching: false, denied: false, held: 0, reported: false }))))
33
+
34
+ BODY_MOVED -> active when @config.running
35
+ (set @entity.gates (array/map @entity.gates (fn g
36
+ (let ((inside (and (== (object/get @g open) false)
37
+ (and (>= @payload.x (- (object/get @g x) @config.reachMargin))
38
+ (and (<= @payload.x (+ (object/get @g x) (object/get @g width) @config.reachMargin))
39
+ (and (>= @payload.y (- (object/get @g y) @config.reachMargin))
40
+ (<= @payload.y (+ (object/get @g y) (object/get @g height) @config.reachMargin))))))))
41
+ (let ((dirOk (or (== (object/get @g dir) 0) (== (math/sign @payload.vx) (object/get @g dir)))))
42
+ (let ((pass (and @inside (and (>= @payload.speed (object/get @g minSpeed)) (and (<= @payload.speed (object/get @g maxSpeed)) @dirOk)))))
43
+ (let ((held (if @pass (+ (object/get @g held) 33) 0)))
44
+ (let ((openNow (or (object/get @g open) (if (> (object/get @g dwellMs) 0) (>= @held (object/get @g dwellMs)) @pass))))
45
+ (object/merge @g { touching: @inside, held: @held, open: @openNow, denied: (and (== (object/get @g dwellMs) 0) (and @inside (and (== @pass false) (== (object/get @g touching) false)))) })))))))))
46
+ (let ((newly (array/filter @entity.gates (fn g (and (== (object/get @g open) true) (== (object/get @g reported) false))))))
47
+ (if (> (array/len @newly) 0)
48
+ (do
49
+ (set @entity.gates (array/map @entity.gates (fn g (if (== (object/get @g id) (object/get (array/first @newly) id)) (object/merge @g { reported: true }) @g))))
50
+ (emit VELOCITY_GATE_OPENED { id: (object/get (array/first @newly) id), x: (object/get (array/first @newly) x), y: (object/get (array/first @newly) y) }))
51
+ null))
52
+ (let ((denied (array/filter @entity.gates (fn g (== (object/get @g denied) true)))))
53
+ (if (> (array/len @denied) 0)
54
+ (emit VELOCITY_GATE_DENIED { id: (object/get (array/first @denied) id), x: (object/get (array/first @denied) x), y: (object/get (array/first @denied) y), speed: @payload.speed })
55
+ null))
56
+
57
+ RESTART -> active
58
+ (set @entity.gates (array/map @config.gates (fn g (object/merge @g { open: false, touching: false, denied: false, held: 0, reported: false }))))
59
+ }
60
+
61
+ emits {
62
+ VELOCITY_GATE_OPENED -> external {
63
+ id : string!
64
+ x : number!
65
+ y : number!
66
+ }
67
+ @description "A gate's speed band was satisfied (instantly, or held for its dwell) and it flipped open; boards layer treasure fx and rewards. When several gates open on one move, the first reports and the shared entity carries the rest."
68
+ @tier "domain"
69
+ VELOCITY_GATE_DENIED -> external {
70
+ id : string!
71
+ x : number!
72
+ y : number!
73
+ speed : number!
74
+ }
75
+ @description "The player entered a closed gate outside its speed band or against its direction; fires once per approach and re-arms after they step out. Boards answer with a PLACE back plus a hint fx."
76
+ @tier "domain"
77
+ }
78
+
79
+ listens {
80
+ BODY_MOVED { x : number!, y : number!, vx : number!, vy : number!, grounded : boolean!, skating : boolean!, speed : number! }
81
+ RESTART { id : string }
82
+ }
83
+
84
+ config {
85
+ running : boolean = true
86
+ @label "Running"
87
+ @description "When true, BODY_MOVED tests every gate's band and opens/denies; toggle to freeze every gate as-is."
88
+ @tier "domain"
89
+ gates : [VelocityGate] = []
90
+ @label "Gates"
91
+ @description "One row per velocity gate: id, min-corner rect (x, y, width, height in world units), the speed band [minSpeed, maxSpeed] that opens it, the hold required (dwellMs 0 = instant), the horizontal direction required (dir -1/0/+1), and an optional hint shown when denied. open/touching/denied/held/reported are stamped at runtime."
92
+ @tier "domain"
93
+ reachMargin : number = 0.6
94
+ @label "Reach Margin"
95
+ @description "Extra world units padded around a closed gate's rect when testing player contact (approximates the body's size)."
96
+ @tier "domain"
97
+ }
98
+ }
99
+
100
+ page "/velocity-gate" as VelocityGatePage -> VelocityGate
101
+ }
@@ -299,7 +299,8 @@
299
299
  "linkedEntity": "ApprovalRequest",
300
300
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
301
301
  "name": "LoadingSpinner",
302
- "ref": "Spinner.traits.SpinnerRender"
302
+ "ref": "Spinner.traits.SpinnerRender",
303
+ "refId": "trt_01KXG04KQTE55FSTDE4V4XKESN"
303
304
  },
304
305
  {
305
306
  "config": {
@@ -312,7 +313,8 @@
312
313
  "linkedEntity": "ApprovalRequest",
313
314
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
314
315
  "name": "ErrorSpinner",
315
- "ref": "Spinner.traits.SpinnerRender"
316
+ "ref": "Spinner.traits.SpinnerRender",
317
+ "refId": "trt_01KXG04KQTE55FSTDE4V4XKESN"
316
318
  },
317
319
  {
318
320
  "config": {
@@ -333,7 +335,8 @@
333
335
  "linkedEntity": "ApprovalRequest",
334
336
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
335
337
  "name": "LoadingText",
336
- "ref": "Typography.traits.TypographyRender"
338
+ "ref": "Typography.traits.TypographyRender",
339
+ "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
337
340
  },
338
341
  {
339
342
  "config": {
@@ -346,7 +349,8 @@
346
349
  "linkedEntity": "ApprovalRequest",
347
350
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
348
351
  "name": "ShieldCheckIcon",
349
- "ref": "Icon.traits.IconRender"
352
+ "ref": "Icon.traits.IconRender",
353
+ "refId": "trt_01KXG04K2JE4GSQVWEWHAHDE2A"
350
354
  },
351
355
  {
352
356
  "config": {
@@ -363,7 +367,8 @@
363
367
  "linkedEntity": "ApprovalRequest",
364
368
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
365
369
  "name": "ApprovalQueueTitle",
366
- "ref": "Typography.traits.TypographyRender"
370
+ "ref": "Typography.traits.TypographyRender",
371
+ "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
367
372
  },
368
373
  {
369
374
  "config": {
@@ -388,14 +393,16 @@
388
393
  "linkedEntity": "ApprovalRequest",
389
394
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
390
395
  "name": "CloseButton",
391
- "ref": "Button.traits.ButtonRender"
396
+ "ref": "Button.traits.ButtonRender",
397
+ "refId": "trt_01KXG04JBQPWD7RW8X33NXPXG9"
392
398
  },
393
399
  {
394
400
  "id": "trt_01KY21K6QC0P4NS69R6ATZPC18",
395
401
  "linkedEntity": "ApprovalRequest",
396
402
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
397
403
  "name": "ApprovalDivider",
398
- "ref": "Divider.traits.DividerRender"
404
+ "ref": "Divider.traits.DividerRender",
405
+ "refId": "trt_01KXG04JVTJZ479S2KPR7HD1KB"
399
406
  },
400
407
  {
401
408
  "config": {
@@ -412,7 +419,8 @@
412
419
  "linkedEntity": "ApprovalRequest",
413
420
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
414
421
  "name": "ErrorAlert",
415
- "ref": "Alert.traits.AlertRender"
422
+ "ref": "Alert.traits.AlertRender",
423
+ "refId": "trt_01KXG04MT125AX1BGFS3ZNGX67"
416
424
  },
417
425
  {
418
426
  "capabilities": [
@@ -571,7 +571,8 @@
571
571
  "linkedEntity": "CacheEntry",
572
572
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
573
573
  "name": "FetchButton",
574
- "ref": "Button.traits.ButtonRender"
574
+ "ref": "Button.traits.ButtonRender",
575
+ "refId": "trt_01KXG04JBQPWD7RW8X33NXPXG9"
575
576
  },
576
577
  {
577
578
  "config": {
@@ -596,7 +597,8 @@
596
597
  "linkedEntity": "CacheEntry",
597
598
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
598
599
  "name": "InvalidateButton",
599
- "ref": "Button.traits.ButtonRender"
600
+ "ref": "Button.traits.ButtonRender",
601
+ "refId": "trt_01KXG04JBQPWD7RW8X33NXPXG9"
600
602
  },
601
603
  {
602
604
  "config": {
@@ -621,7 +623,8 @@
621
623
  "linkedEntity": "CacheEntry",
622
624
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
623
625
  "name": "RefreshButton",
624
- "ref": "Button.traits.ButtonRender"
626
+ "ref": "Button.traits.ButtonRender",
627
+ "refId": "trt_01KXG04JBQPWD7RW8X33NXPXG9"
625
628
  },
626
629
  {
627
630
  "config": {
@@ -646,7 +649,8 @@
646
649
  "linkedEntity": "CacheEntry",
647
650
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
648
651
  "name": "RetryButton",
649
- "ref": "Button.traits.ButtonRender"
652
+ "ref": "Button.traits.ButtonRender",
653
+ "refId": "trt_01KXG04JBQPWD7RW8X33NXPXG9"
650
654
  },
651
655
  {
652
656
  "category": "interaction",
@@ -1375,7 +1379,8 @@
1375
1379
  "linkedEntity": "CacheEntry",
1376
1380
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1377
1381
  "name": "InlineIconRender1",
1378
- "ref": "Icon.traits.IconRender"
1382
+ "ref": "Icon.traits.IconRender",
1383
+ "refId": "trt_01KXG04K2JE4GSQVWEWHAHDE2A"
1379
1384
  },
1380
1385
  {
1381
1386
  "config": {
@@ -1392,14 +1397,16 @@
1392
1397
  "linkedEntity": "CacheEntry",
1393
1398
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1394
1399
  "name": "InlineTypographyRender2",
1395
- "ref": "Typography.traits.TypographyRender"
1400
+ "ref": "Typography.traits.TypographyRender",
1401
+ "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
1396
1402
  },
1397
1403
  {
1398
1404
  "id": "trt_01KY21K6RV4WQSJS26J85497YD",
1399
1405
  "linkedEntity": "CacheEntry",
1400
1406
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1401
1407
  "name": "InlineDividerRender3",
1402
- "ref": "Divider.traits.DividerRender"
1408
+ "ref": "Divider.traits.DividerRender",
1409
+ "refId": "trt_01KXG04JVTJZ479S2KPR7HD1KB"
1403
1410
  },
1404
1411
  {
1405
1412
  "config": {
@@ -1424,14 +1431,16 @@
1424
1431
  "linkedEntity": "CacheEntry",
1425
1432
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1426
1433
  "name": "InlineEmptyStateRender4",
1427
- "ref": "EmptyState.traits.EmptyStateRender"
1434
+ "ref": "EmptyState.traits.EmptyStateRender",
1435
+ "refId": "trt_01KXG04NQT80G92D2D6KWKK04S"
1428
1436
  },
1429
1437
  {
1430
1438
  "id": "trt_01KY21K6RVG39HCZQN52PWCKEM",
1431
1439
  "linkedEntity": "CacheEntry",
1432
1440
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1433
1441
  "name": "InlineSpinnerRender5",
1434
- "ref": "Spinner.traits.SpinnerRender"
1442
+ "ref": "Spinner.traits.SpinnerRender",
1443
+ "refId": "trt_01KXG04KQTE55FSTDE4V4XKESN"
1435
1444
  },
1436
1445
  {
1437
1446
  "config": {
@@ -1452,7 +1461,8 @@
1452
1461
  "linkedEntity": "CacheEntry",
1453
1462
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1454
1463
  "name": "InlineTypographyRender6",
1455
- "ref": "Typography.traits.TypographyRender"
1464
+ "ref": "Typography.traits.TypographyRender",
1465
+ "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
1456
1466
  },
1457
1467
  {
1458
1468
  "config": {
@@ -1465,7 +1475,8 @@
1465
1475
  "linkedEntity": "CacheEntry",
1466
1476
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1467
1477
  "name": "InlineIconRender7",
1468
- "ref": "Icon.traits.IconRender"
1478
+ "ref": "Icon.traits.IconRender",
1479
+ "refId": "trt_01KXG04K2JE4GSQVWEWHAHDE2A"
1469
1480
  },
1470
1481
  {
1471
1482
  "config": {
@@ -1482,7 +1493,8 @@
1482
1493
  "linkedEntity": "CacheEntry",
1483
1494
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1484
1495
  "name": "InlineTypographyRender8",
1485
- "ref": "Typography.traits.TypographyRender"
1496
+ "ref": "Typography.traits.TypographyRender",
1497
+ "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
1486
1498
  },
1487
1499
  {
1488
1500
  "config": {
@@ -1503,14 +1515,16 @@
1503
1515
  "linkedEntity": "CacheEntry",
1504
1516
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1505
1517
  "name": "InlineStatusDotRender9",
1506
- "ref": "StatusDot.traits.StatusDotRender"
1518
+ "ref": "StatusDot.traits.StatusDotRender",
1519
+ "refId": "trt_01KXG04KT7W5V5P7XAVNZP4Z3R"
1507
1520
  },
1508
1521
  {
1509
1522
  "id": "trt_01KY21K6RV9M61DNR9X6B39M9N",
1510
1523
  "linkedEntity": "CacheEntry",
1511
1524
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1512
1525
  "name": "InlineDividerRender10",
1513
- "ref": "Divider.traits.DividerRender"
1526
+ "ref": "Divider.traits.DividerRender",
1527
+ "refId": "trt_01KXG04JVTJZ479S2KPR7HD1KB"
1514
1528
  },
1515
1529
  {
1516
1530
  "config": {
@@ -1523,7 +1537,8 @@
1523
1537
  "linkedEntity": "CacheEntry",
1524
1538
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1525
1539
  "name": "InlineIconRender11",
1526
- "ref": "Icon.traits.IconRender"
1540
+ "ref": "Icon.traits.IconRender",
1541
+ "refId": "trt_01KXG04K2JE4GSQVWEWHAHDE2A"
1527
1542
  },
1528
1543
  {
1529
1544
  "config": {
@@ -1540,7 +1555,8 @@
1540
1555
  "linkedEntity": "CacheEntry",
1541
1556
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1542
1557
  "name": "InlineTypographyRender12",
1543
- "ref": "Typography.traits.TypographyRender"
1558
+ "ref": "Typography.traits.TypographyRender",
1559
+ "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
1544
1560
  },
1545
1561
  {
1546
1562
  "config": {
@@ -1553,7 +1569,8 @@
1553
1569
  "linkedEntity": "CacheEntry",
1554
1570
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1555
1571
  "name": "InlineBadgeRender13",
1556
- "ref": "Badge.traits.BadgeRender"
1572
+ "ref": "Badge.traits.BadgeRender",
1573
+ "refId": "trt_01KXG04J66F1NVJTF3ZS57P7K6"
1557
1574
  },
1558
1575
  {
1559
1576
  "config": {
@@ -1570,7 +1587,8 @@
1570
1587
  "linkedEntity": "CacheEntry",
1571
1588
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1572
1589
  "name": "InlineTypographyRender14",
1573
- "ref": "Typography.traits.TypographyRender"
1590
+ "ref": "Typography.traits.TypographyRender",
1591
+ "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
1574
1592
  },
1575
1593
  {
1576
1594
  "config": {
@@ -1587,7 +1605,8 @@
1587
1605
  "linkedEntity": "CacheEntry",
1588
1606
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1589
1607
  "name": "InlineIconRender15",
1590
- "ref": "Icon.traits.IconRender"
1608
+ "ref": "Icon.traits.IconRender",
1609
+ "refId": "trt_01KXG04K2JE4GSQVWEWHAHDE2A"
1591
1610
  },
1592
1611
  {
1593
1612
  "config": {
@@ -1604,7 +1623,8 @@
1604
1623
  "linkedEntity": "CacheEntry",
1605
1624
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1606
1625
  "name": "InlineTypographyRender16",
1607
- "ref": "Typography.traits.TypographyRender"
1626
+ "ref": "Typography.traits.TypographyRender",
1627
+ "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
1608
1628
  },
1609
1629
  {
1610
1630
  "config": {
@@ -1625,7 +1645,8 @@
1625
1645
  "linkedEntity": "CacheEntry",
1626
1646
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1627
1647
  "name": "InlineTypographyRender17",
1628
- "ref": "Typography.traits.TypographyRender"
1648
+ "ref": "Typography.traits.TypographyRender",
1649
+ "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
1629
1650
  },
1630
1651
  {
1631
1652
  "config": {
@@ -1638,7 +1659,8 @@
1638
1659
  "linkedEntity": "CacheEntry",
1639
1660
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1640
1661
  "name": "InlineIconRender18",
1641
- "ref": "Icon.traits.IconRender"
1662
+ "ref": "Icon.traits.IconRender",
1663
+ "refId": "trt_01KXG04K2JE4GSQVWEWHAHDE2A"
1642
1664
  },
1643
1665
  {
1644
1666
  "config": {
@@ -1655,7 +1677,8 @@
1655
1677
  "linkedEntity": "CacheEntry",
1656
1678
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1657
1679
  "name": "InlineTypographyRender19",
1658
- "ref": "Typography.traits.TypographyRender"
1680
+ "ref": "Typography.traits.TypographyRender",
1681
+ "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
1659
1682
  },
1660
1683
  {
1661
1684
  "config": {
@@ -1676,14 +1699,16 @@
1676
1699
  "linkedEntity": "CacheEntry",
1677
1700
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1678
1701
  "name": "InlineStatusDotRender20",
1679
- "ref": "StatusDot.traits.StatusDotRender"
1702
+ "ref": "StatusDot.traits.StatusDotRender",
1703
+ "refId": "trt_01KXG04KT7W5V5P7XAVNZP4Z3R"
1680
1704
  },
1681
1705
  {
1682
1706
  "id": "trt_01KY21K6RVQFD7P2W5K5HX0NPA",
1683
1707
  "linkedEntity": "CacheEntry",
1684
1708
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1685
1709
  "name": "InlineDividerRender21",
1686
- "ref": "Divider.traits.DividerRender"
1710
+ "ref": "Divider.traits.DividerRender",
1711
+ "refId": "trt_01KXG04JVTJZ479S2KPR7HD1KB"
1687
1712
  },
1688
1713
  {
1689
1714
  "config": {
@@ -1700,28 +1725,32 @@
1700
1725
  "linkedEntity": "CacheEntry",
1701
1726
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1702
1727
  "name": "InlineAlertRender22",
1703
- "ref": "Alert.traits.AlertRender"
1728
+ "ref": "Alert.traits.AlertRender",
1729
+ "refId": "trt_01KXG04MT125AX1BGFS3ZNGX67"
1704
1730
  },
1705
1731
  {
1706
1732
  "id": "trt_01KY21K6RVG3KCAAGQJ9JA7ZJA",
1707
1733
  "linkedEntity": "CacheEntry",
1708
1734
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1709
1735
  "name": "InlineSpinnerRender23",
1710
- "ref": "Spinner.traits.SpinnerRender"
1736
+ "ref": "Spinner.traits.SpinnerRender",
1737
+ "refId": "trt_01KXG04KQTE55FSTDE4V4XKESN"
1711
1738
  },
1712
1739
  {
1713
1740
  "id": "trt_01KY21K6RVSCF6A38ETVH9BP82",
1714
1741
  "linkedEntity": "CacheEntry",
1715
1742
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1716
1743
  "name": "InlineSpinnerRender24",
1717
- "ref": "Spinner.traits.SpinnerRender"
1744
+ "ref": "Spinner.traits.SpinnerRender",
1745
+ "refId": "trt_01KXG04KQTE55FSTDE4V4XKESN"
1718
1746
  },
1719
1747
  {
1720
1748
  "id": "trt_01KY21K6RVMYR6XTQ684R633YZ",
1721
1749
  "linkedEntity": "CacheEntry",
1722
1750
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1723
1751
  "name": "InlineSpinnerRender25",
1724
- "ref": "Spinner.traits.SpinnerRender"
1752
+ "ref": "Spinner.traits.SpinnerRender",
1753
+ "refId": "trt_01KXG04KQTE55FSTDE4V4XKESN"
1725
1754
  },
1726
1755
  {
1727
1756
  "config": {
@@ -1746,14 +1775,16 @@
1746
1775
  "linkedEntity": "CacheEntry",
1747
1776
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1748
1777
  "name": "InlineEmptyStateRender26",
1749
- "ref": "EmptyState.traits.EmptyStateRender"
1778
+ "ref": "EmptyState.traits.EmptyStateRender",
1779
+ "refId": "trt_01KXG04NQT80G92D2D6KWKK04S"
1750
1780
  },
1751
1781
  {
1752
1782
  "id": "trt_01KY1DXS2KNX0G69Z8Z0JYGQ88",
1753
1783
  "linkedEntity": "CacheEntry",
1754
1784
  "linkedEntityId": "ent_01KXG04F55MM0AG8Z1VNK7P7GC",
1755
1785
  "name": "InlineSpinnerRender27",
1756
- "ref": "Spinner.traits.SpinnerRender"
1786
+ "ref": "Spinner.traits.SpinnerRender",
1787
+ "refId": "trt_01KXG04KQTE55FSTDE4V4XKESN"
1757
1788
  }
1758
1789
  ],
1759
1790
  "uses": [