@almadar/std 16.188.0 → 16.190.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.
- package/behaviors/lolo/ui/core/.hand-authored.json +0 -4
- package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +20 -8
- package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +428 -26
- package/behaviors/lolo/ui/core/atoms/std-related.lolo +5 -1
- package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +80 -0
- package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +213 -0
- package/behaviors/lolo/ui/core/molecules/{ui-rich-block-editor.lolo → ui-rich-text-editor.lolo} +25 -25
- package/behaviors/lolo/ui/game/atoms/std-choice-gate.lolo +100 -0
- package/behaviors/lolo/ui/game/atoms/std-coef-pad.lolo +114 -0
- package/behaviors/lolo/ui/game/atoms/std-curve-fog.lolo +50 -0
- package/behaviors/lolo/ui/game/atoms/std-pad-lock.lolo +5 -1
- package/behaviors/lolo/ui/game/atoms/std-platformer-body.lolo +29 -3
- package/behaviors/lolo/ui/game/atoms/std-zone-card.lolo +95 -0
- package/behaviors/lolo/ui/game/organisms/std-platformer-board-2d.lolo +9 -0
- package/behaviors/registry/ui/core/atoms/std-calendar.orb +51 -27
- package/behaviors/registry/ui/core/atoms/std-record-detail.orb +2399 -180
- package/behaviors/registry/ui/core/atoms/std-related.orb +23 -1
- package/behaviors/registry/ui/core/atoms/std-version-history.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-document-details.orb +342 -0
- package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +655 -0
- package/behaviors/registry/ui/core/molecules/{ui-rich-block-editor.orb → ui-rich-text-editor.orb} +84 -97
- package/behaviors/registry/ui/game/atoms/std-choice-gate.orb +855 -0
- package/behaviors/registry/ui/game/atoms/std-coef-pad.orb +928 -0
- package/behaviors/registry/ui/game/atoms/std-curve-fog.orb +337 -0
- package/behaviors/registry/ui/game/atoms/std-pad-lock.orb +31 -1
- package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +847 -401
- package/behaviors/registry/ui/game/atoms/std-zone-card.orb +642 -0
- package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +38 -6
- package/dist/behaviors/exports-reader.js +6491 -6163
- package/dist/behaviors/functions/index.d.ts +669 -300
- package/dist/behaviors/functions/index.js +6469 -6152
- package/dist/behaviors/index.d.ts +1 -1
- package/dist/behaviors/index.js +6492 -6164
- package/dist/behaviors/query.js +6491 -6163
- package/dist/behaviors-embeddings.hash.json +3 -3
- package/dist/behaviors-embeddings.json +367 -375
- package/dist/behaviors-registry.json +4104 -2597
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6492 -6164
- package/dist/knob-embeddings.hash.json +3 -3
- package/dist/knob-embeddings.json +1 -1
- package/dist/registry/factory-signatures.json +1 -1
- package/package.json +4 -4
- package/behaviors/lolo/ui/core/atoms/std-rich-editor.lolo +0 -790
- package/behaviors/registry/ui/core/atoms/std-rich-editor.orb +0 -2225
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
app std-pad-lock "1.0.0"
|
|
2
|
-
"Headless pad-lock mechanic: floor pads that light when the player steps on them, completing a set when every pad is lit. Listens BODY_MOVED and lights any unlit live pad the player's rect touches (|dx| <= reachX, |dy| <= reachY of the pad center); a lit pad stays lit. Pads may carry a group number (grp 0 = ungrouped, always live): when groups are used, only pads of the lowest uncompleted group are live — pads of later groups refuse to light until the current group finishes, so one sum must be finished before the next. When a group completes the trait emits PAD_GROUP_COMPLETED once for it (first newly completed group reports; the shared entity carries the rest); when every pad in the set is lit it stamps completed and emits PAD_SET_COMPLETED once. RESTART unlights every pad and resets the set. Renders nothing; boards draw the pads and read lit from the shared entity (the render authority)."
|
|
2
|
+
"Headless pad-lock mechanic: floor pads that light when the player steps on them, completing a set when every pad is lit. Listens BODY_MOVED and lights any unlit live pad the player's rect touches (|dx| <= reachX, |dy| <= reachY of the pad center); a lit pad stays lit. Pads may carry a group number (grp 0 = ungrouped, always live): when groups are used, only pads of the lowest uncompleted group are live — pads of later groups refuse to light until the current group finishes, so one sum must be finished before the next. When a group completes the trait emits PAD_GROUP_COMPLETED once for it (first newly completed group reports; the shared entity carries the rest); when every pad in the set is lit it stamps completed and emits PAD_SET_COMPLETED once. The lowest uncompleted group is stamped on the shared entity as currentGrp so boards can pulse exactly the live pads (0 = no group open / ungrouped pads). RESTART unlights every pad and resets the set. Renders nothing; boards draw the pads and read lit from the shared entity (the render authority)."
|
|
3
3
|
orbital PadLockOrbital {
|
|
4
4
|
type PadLock = {
|
|
5
5
|
id : string!
|
|
@@ -13,6 +13,7 @@ orbital PadLockOrbital {
|
|
|
13
13
|
id : string!
|
|
14
14
|
pads : [PadLock] = []
|
|
15
15
|
groupsDone : [number] = []
|
|
16
|
+
currentGrp : number = 0
|
|
16
17
|
completed : boolean = false
|
|
17
18
|
}
|
|
18
19
|
|
|
@@ -23,6 +24,7 @@ orbital PadLockOrbital {
|
|
|
23
24
|
INIT -> active
|
|
24
25
|
(set @entity.pads (array/map @config.pads (fn p (object/merge @p { lit: false }))))
|
|
25
26
|
(set @entity.groupsDone [])
|
|
27
|
+
(set @entity.currentGrp 0)
|
|
26
28
|
(set @entity.completed false)
|
|
27
29
|
|
|
28
30
|
BODY_MOVED -> active when @config.running
|
|
@@ -35,6 +37,7 @@ orbital PadLockOrbital {
|
|
|
35
37
|
(let ((newlyGrp (array/filter @doneNow (fn g (== (array/len (array/filter @entity.groupsDone (fn d (== @d @g)))) 0)))))
|
|
36
38
|
(do
|
|
37
39
|
(set @entity.pads @newPads)
|
|
40
|
+
(set @entity.currentGrp (if (== @currentGrp 9999) 0 @currentGrp))
|
|
38
41
|
(if (> (array/len @newlyGrp) 0)
|
|
39
42
|
(do
|
|
40
43
|
(set @entity.groupsDone @doneNow)
|
|
@@ -49,6 +52,7 @@ orbital PadLockOrbital {
|
|
|
49
52
|
RESTART -> active
|
|
50
53
|
(set @entity.pads (array/map @config.pads (fn p (object/merge @p { lit: false }))))
|
|
51
54
|
(set @entity.groupsDone [])
|
|
55
|
+
(set @entity.currentGrp 0)
|
|
52
56
|
(set @entity.completed false)
|
|
53
57
|
}
|
|
54
58
|
|
|
@@ -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). 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."
|
|
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, and the vertical velocity is the tangential projection (s = vx·cos θ, vy = s·sin θ — no discontinuous jumps at sample boundaries), 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!
|
|
@@ -32,12 +32,20 @@ orbital PlatformerBodyOrbital {
|
|
|
32
32
|
ax : number!
|
|
33
33
|
ay : number!
|
|
34
34
|
}
|
|
35
|
+
type CurveMod = {
|
|
36
|
+
x0 : number!
|
|
37
|
+
x1 : number!
|
|
38
|
+
a : number!
|
|
39
|
+
h : number!
|
|
40
|
+
k : number!
|
|
41
|
+
}
|
|
35
42
|
|
|
36
43
|
entity PlatformerBodyData [runtime, shared] {
|
|
37
44
|
id : string!
|
|
38
45
|
body : PlatformerBody = { x: 0, y: 0, width: 1, height: 1, vx: 0, vy: 0, grounded: false, facingRight: true }
|
|
39
46
|
fell : boolean = false
|
|
40
47
|
hazardId : string = ""
|
|
48
|
+
curveMods : [CurveMod] = []
|
|
41
49
|
goalId : string = ""
|
|
42
50
|
skating : boolean = false
|
|
43
51
|
}
|
|
@@ -66,8 +74,12 @@ orbital PlatformerBodyOrbital {
|
|
|
66
74
|
(set @entity.hazardId "")
|
|
67
75
|
(set @entity.skating false)
|
|
68
76
|
|
|
77
|
+
CURVE_MOD_ADD -> active when @config.curveModsEnabled
|
|
78
|
+
(set @entity.curveMods (array/append @entity.curveMods { x0: @payload.x0, x1: @payload.x1, a: @payload.a, h: @payload.h, k: @payload.k }))
|
|
79
|
+
|
|
69
80
|
RESTART -> active
|
|
70
81
|
(set @entity.body @config.spawn)
|
|
82
|
+
(set @entity.curveMods [])
|
|
71
83
|
(set @entity.fell false)
|
|
72
84
|
(set @entity.hazardId "")
|
|
73
85
|
(set @entity.goalId "")
|
|
@@ -95,11 +107,20 @@ orbital PlatformerBodyOrbital {
|
|
|
95
107
|
(let ((rightSamp (if @inRange (array/first (array/filter @config.skateCurve (fn s (> (object/get @s x) @cx)))) { x: 1, y: 0 })))
|
|
96
108
|
(let ((slope (if @inRange (/ (- (object/get @rightSamp y) (object/get @leftSamp y)) (- (object/get @rightSamp x) (object/get @leftSamp x))) 0)))
|
|
97
109
|
(let ((curveY (if @inRange (+ (object/get @leftSamp y) (* @slope (- @cx (object/get @leftSamp x)))) 0)))
|
|
110
|
+
(let ((curveMod (if (and @config.curveModsEnabled @inRange) (array/find @entity.curveMods (fn m (and (>= @cx (object/get @m x0)) (<= @cx (object/get @m x1))))) null)))
|
|
111
|
+
(let ((modX (if (== @curveMod null) @cx (- @cx (object/get @curveMod h)))))
|
|
112
|
+
(let ((modInRange (and (!= @curveMod null) (and (>= @modX (object/get (array/first @config.skateCurve) x)) (< @modX (object/get (array/last @config.skateCurve) x))))))
|
|
113
|
+
(let ((modLeft (if @modInRange (array/last (array/filter @config.skateCurve (fn s (<= (object/get @s x) @modX)))) @leftSamp)))
|
|
114
|
+
(let ((modRight (if @modInRange (array/first (array/filter @config.skateCurve (fn s (> (object/get @s x) @modX)))) @rightSamp)))
|
|
115
|
+
(let ((modSlope (if @modInRange (/ (- (object/get @modRight y) (object/get @modLeft y)) (- (object/get @modRight x) (object/get @modLeft x))) @slope)))
|
|
116
|
+
(let ((modCurveY (if @modInRange (+ (object/get @modLeft y) (* @modSlope (- @modX (object/get @modLeft x)))) @curveY)))
|
|
117
|
+
(let ((slope (if (== @curveMod null) @slope (* (object/get @curveMod a) @modSlope))))
|
|
118
|
+
(let ((curveY (if (== @curveMod null) @curveY (+ (* (object/get @curveMod a) @modCurveY) (object/get @curveMod k)))))
|
|
98
119
|
(let ((movingUp (< (* @vy1 @gdir) -0.01)))
|
|
99
120
|
(let ((skateNow (and @inRange (and (<= (math/abs (- @ny2 @curveY)) @config.skateSnap) (and (or @landed @entity.skating) (or @entity.body.grounded (not @movingUp)))))))
|
|
100
121
|
(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
122
|
(let ((vx3 (if (== @drift null) @vx2 (math/clamp (+ @vx2 (* @dax 0.033)) (- 0 @config.maxFallSpeed) @config.maxFallSpeed))))
|
|
102
|
-
(let ((fy (if @skateNow @curveY @ny2)) (fvy (if @skateNow (* @slope @
|
|
123
|
+
(let ((fy (if @skateNow @curveY @ny2)) (fvy (if @skateNow (* (* @vx2 (math/cos (math/atan @slope))) (math/sin (math/atan @slope))) @vy2)) (fgrounded (or @landed @skateNow)))
|
|
103
124
|
(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 }))))))
|
|
104
125
|
(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 }))))))
|
|
105
126
|
(let ((fellNow (if (> @gdir 0) (> @fy @config.killY) (< @fy @config.killY))))
|
|
@@ -134,7 +155,7 @@ orbital PlatformerBodyOrbital {
|
|
|
134
155
|
(set @entity.fell true)
|
|
135
156
|
(emit BODY_FELL { x: @nx, y: @fy }))
|
|
136
157
|
null)
|
|
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) }))))))))))))))))))))))))))))
|
|
158
|
+
(emit BODY_MOVED { x: @nx, y: @fy, vx: @entity.body.vx, vy: @fvy, grounded: @fgrounded, skating: @skateNow, speed: (math/hypot @entity.body.vx @fvy) })))))))))))))))))))))))))))))))))))))
|
|
138
159
|
}
|
|
139
160
|
|
|
140
161
|
emits {
|
|
@@ -201,6 +222,7 @@ orbital PlatformerBodyOrbital {
|
|
|
201
222
|
STEER { dir : number! }
|
|
202
223
|
JUMP { id : string }
|
|
203
224
|
PLACE { x : number!, y : number! }
|
|
225
|
+
CURVE_MOD_ADD { x0 : number!, x1 : number!, a : number!, h : number!, k : number! }
|
|
204
226
|
RESTART { id : string }
|
|
205
227
|
}
|
|
206
228
|
|
|
@@ -221,6 +243,10 @@ orbital PlatformerBodyOrbital {
|
|
|
221
243
|
@label "Gravity"
|
|
222
244
|
@description "Units/s² added to vertical velocity; the SIGN is the vertical convention — positive pulls toward +y (screen boards, y down), negative toward −y (math canvases, y up) — and jumps always fire against it"
|
|
223
245
|
@tier "domain"
|
|
246
|
+
curveModsEnabled : boolean = false
|
|
247
|
+
@label "Curve Mods Enabled"
|
|
248
|
+
@description "When true, entity.curveMods reshape the skate surface inside each mod's x-range: the road samples the base curve at (x − h) and applies a·y + k (slope scales by a) — coefficient pads lift/tilt the segment the player is riding. Default off: boards without coef pads pay nothing."
|
|
249
|
+
@tier "domain"
|
|
224
250
|
jumpStrength : number = 11
|
|
225
251
|
@label "Jump Strength"
|
|
226
252
|
@description "Vertical speed in units/s imparted by JUMP, directed against gravity; apex height ≈ jumpStrength² / (2·|gravity|)"
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
app std-zone-card "1.0.0"
|
|
2
|
+
"Headless zone-guidance mechanic for side-view boards: tracks which band of the world the player is in and holds up that zone's card — name, concept, objective — for a while after every crossing. Listens BODY_MOVED and, when the player's x crosses into a different config zone, stamps the shared entity (zoneId, card, enteredAt) and emits ZONE_CHANGED carrying the card fields; the card self-clears ttlTicks BODY_MOVED ticks later (a per-move tick counter on the entity, so pauses at speed zero still age it out) and boards clear it early via CARD_DISMISS (renamed to a board-scoped progress event) on any mechanic completion. RESTART clears the card and the clock. Renders nothing; boards draw the card from the shared entity (the render authority)."
|
|
3
|
+
orbital ZoneCardOrbital {
|
|
4
|
+
type ZoneCard = {
|
|
5
|
+
name : string!
|
|
6
|
+
concept : string
|
|
7
|
+
objective : string
|
|
8
|
+
}
|
|
9
|
+
type ZoneCardZone = {
|
|
10
|
+
id : string!
|
|
11
|
+
name : string!
|
|
12
|
+
concept : string
|
|
13
|
+
objective : string
|
|
14
|
+
x0 : number!
|
|
15
|
+
x1 : number!
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
entity ZoneCardData [runtime, shared] {
|
|
19
|
+
id : string!
|
|
20
|
+
zoneId : string = ""
|
|
21
|
+
card : ZoneCard
|
|
22
|
+
enteredAt : number = 0
|
|
23
|
+
ticks : number = 0
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
trait ZoneCard -> @rebindable ZoneCardData [lifecycle] {
|
|
27
|
+
initial: active
|
|
28
|
+
|
|
29
|
+
state active {
|
|
30
|
+
INIT -> active
|
|
31
|
+
(set @entity.zoneId "")
|
|
32
|
+
(set @entity.card null)
|
|
33
|
+
(set @entity.enteredAt 0)
|
|
34
|
+
(set @entity.ticks 0)
|
|
35
|
+
|
|
36
|
+
BODY_MOVED -> active when @config.running
|
|
37
|
+
(set @entity.ticks (+ @entity.ticks 1))
|
|
38
|
+
(let ((zmatch (array/filter @config.zones (fn z (and (>= @payload.x (object/get @z x0)) (< @payload.x (object/get @z x1)))))))
|
|
39
|
+
(do
|
|
40
|
+
(if (and (> (array/len @zmatch) 0) (!= @entity.zoneId (object/get (array/first @zmatch) id)))
|
|
41
|
+
(do
|
|
42
|
+
(set @entity.zoneId (object/get (array/first @zmatch) id))
|
|
43
|
+
(set @entity.card { name: (object/get (array/first @zmatch) name), concept: (object/get (array/first @zmatch) concept), objective: (object/get (array/first @zmatch) objective) })
|
|
44
|
+
(set @entity.enteredAt @entity.ticks)
|
|
45
|
+
(emit ZONE_CHANGED { id: (object/get (array/first @zmatch) id), name: (object/get (array/first @zmatch) name), concept: (object/get (array/first @zmatch) concept), objective: (object/get (array/first @zmatch) objective) }))
|
|
46
|
+
null)
|
|
47
|
+
(if (and (!= @entity.card null) (> (- @entity.ticks @entity.enteredAt) @config.ttlTicks))
|
|
48
|
+
(set @entity.card null)
|
|
49
|
+
null)))
|
|
50
|
+
|
|
51
|
+
CARD_DISMISS -> active
|
|
52
|
+
(set @entity.card null)
|
|
53
|
+
|
|
54
|
+
RESTART -> active
|
|
55
|
+
(set @entity.zoneId "")
|
|
56
|
+
(set @entity.card null)
|
|
57
|
+
(set @entity.enteredAt 0)
|
|
58
|
+
(set @entity.ticks 0)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
emits {
|
|
62
|
+
ZONE_CHANGED -> external {
|
|
63
|
+
id : string!
|
|
64
|
+
name : string!
|
|
65
|
+
concept : string
|
|
66
|
+
objective : string
|
|
67
|
+
}
|
|
68
|
+
@description "The player crossed into a different zone; carries the zone's card fields (name, concept, objective) so boards can swap banners/guides and hold the card up. Fires once per crossing."
|
|
69
|
+
@tier "domain"
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
listens {
|
|
73
|
+
BODY_MOVED { x : number!, y : number!, vx : number!, vy : number!, grounded : boolean!, skating : boolean!, speed : number! }
|
|
74
|
+
CARD_DISMISS { id : string }
|
|
75
|
+
RESTART { id : string }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
config {
|
|
79
|
+
running : boolean = true
|
|
80
|
+
@label "Running"
|
|
81
|
+
@description "When true, BODY_MOVED tracks the current zone and ages the card; toggle to freeze the card as-is."
|
|
82
|
+
@tier "domain"
|
|
83
|
+
zones : [ZoneCardZone] = []
|
|
84
|
+
@label "Zones"
|
|
85
|
+
@description "One row per world band: id, display name, the one-line concept, the zone's objective text, and the x-range (x0..x1) the band covers."
|
|
86
|
+
@tier "domain"
|
|
87
|
+
ttlTicks : number = 120
|
|
88
|
+
@label "TTL Ticks"
|
|
89
|
+
@description "BODY_MOVED ticks the card stays up after a zone crossing (≈ 4s at 30 moves/s) before it clears itself."
|
|
90
|
+
@tier "domain"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
page "/zone-card" as ZoneCardPage -> ZoneCard
|
|
95
|
+
}
|
|
@@ -79,6 +79,14 @@ orbital PlatformerBoard2DOrbital {
|
|
|
79
79
|
right : Asset
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
type BoardCurveMod = {
|
|
83
|
+
x0 : number!
|
|
84
|
+
x1 : number!
|
|
85
|
+
a : number!
|
|
86
|
+
h : number!
|
|
87
|
+
k : number!
|
|
88
|
+
}
|
|
89
|
+
|
|
82
90
|
entity GameState [runtime, shared] {
|
|
83
91
|
id : string!
|
|
84
92
|
body : PlatformerBody = { x: 80, y: 320, width: 32, height: 48, vx: 0, vy: 0, grounded: false, facingRight: true }
|
|
@@ -86,6 +94,7 @@ orbital PlatformerBoard2DOrbital {
|
|
|
86
94
|
hazardId : string = ""
|
|
87
95
|
goalId : string = ""
|
|
88
96
|
skating : boolean = false
|
|
97
|
+
curveMods : [BoardCurveMod] = []
|
|
89
98
|
fx : [Fx] = []
|
|
90
99
|
result : string = "none"
|
|
91
100
|
score : number = 0
|
|
@@ -237,13 +237,7 @@
|
|
|
237
237
|
"type": "string"
|
|
238
238
|
},
|
|
239
239
|
"agendaItemActions": {
|
|
240
|
-
"default": [
|
|
241
|
-
{
|
|
242
|
-
"event": "SELECT_DAY",
|
|
243
|
-
"icon": "eye",
|
|
244
|
-
"label": "View"
|
|
245
|
-
}
|
|
246
|
-
],
|
|
240
|
+
"default": [],
|
|
247
241
|
"description": "Per-item action buttons on agenda-list rows — data-list itemActions descriptors (label/event/icon/variant). Consumers override to wire their own row actions (View/Edit/Delete) so agenda hosts never need a second table for actions.",
|
|
248
242
|
"items": {
|
|
249
243
|
"properties": {
|
|
@@ -624,13 +618,7 @@
|
|
|
624
618
|
"variant": "badge"
|
|
625
619
|
}
|
|
626
620
|
],
|
|
627
|
-
"itemActions":
|
|
628
|
-
{
|
|
629
|
-
"event": "SELECT_DAY",
|
|
630
|
-
"icon": "eye",
|
|
631
|
-
"label": "View"
|
|
632
|
-
}
|
|
633
|
-
],
|
|
621
|
+
"itemActions": "@config.agendaItemActions",
|
|
634
622
|
"look": "@config.tableLook",
|
|
635
623
|
"type": "data-list"
|
|
636
624
|
}
|
|
@@ -717,6 +705,17 @@
|
|
|
717
705
|
"tier": "presentation",
|
|
718
706
|
"type": "[FilterSpec]"
|
|
719
707
|
},
|
|
708
|
+
"include": {
|
|
709
|
+
"default": [],
|
|
710
|
+
"description": "Entity relation field names to hydrate on fetch (e.g. a `category : Category` field named `category`), so chip bindings can use dot-paths like @item.category.name. Empty = no hydration, the default.",
|
|
711
|
+
"items": {
|
|
712
|
+
"type": "string"
|
|
713
|
+
},
|
|
714
|
+
"label": "Which relation fields to hydrate?",
|
|
715
|
+
"synonyms": "relation hydration, populate relations, joined fields, hydrate relations",
|
|
716
|
+
"tier": "internal",
|
|
717
|
+
"type": "[string]"
|
|
718
|
+
},
|
|
720
719
|
"onEventClick": {
|
|
721
720
|
"default": "",
|
|
722
721
|
"description": "Event emitted when a calendar chip is clicked: UI:{onEventClick} with { event } carrying the clicked row. Empty means chips are not clickable.",
|
|
@@ -963,13 +962,21 @@
|
|
|
963
962
|
"tier": "internal"
|
|
964
963
|
},
|
|
965
964
|
{
|
|
966
|
-
"description": "Emitted when a calendar chip is clicked
|
|
965
|
+
"description": "Emitted when a calendar chip is clicked ({ event } carries the clicked row) or an agenda/upcoming row action fires ({ id, row }). Consumers routing it should read the row from ?event or ?row, whichever the payload carries.",
|
|
967
966
|
"event": "@config.onEventClick",
|
|
968
967
|
"eventId": "evt_01KYBV098PMR56F9NQ5CWWPX36",
|
|
969
968
|
"payloadSchema": [
|
|
970
969
|
{
|
|
971
970
|
"name": "event",
|
|
972
|
-
"type": "
|
|
971
|
+
"type": "@entity"
|
|
972
|
+
},
|
|
973
|
+
{
|
|
974
|
+
"name": "id",
|
|
975
|
+
"type": "string"
|
|
976
|
+
},
|
|
977
|
+
{
|
|
978
|
+
"name": "row",
|
|
979
|
+
"type": "@entity"
|
|
973
980
|
}
|
|
974
981
|
],
|
|
975
982
|
"scope": "external",
|
|
@@ -1103,14 +1110,22 @@
|
|
|
1103
1110
|
"name": "Retry"
|
|
1104
1111
|
},
|
|
1105
1112
|
{
|
|
1106
|
-
"description": "Emitted when a calendar chip is clicked
|
|
1113
|
+
"description": "Emitted when a calendar chip is clicked ({ event } carries the clicked row) or an agenda/upcoming row action fires ({ id, row }). Consumers routing it should read the row from ?event or ?row, whichever the payload carries.",
|
|
1107
1114
|
"id": "evt_01KYBV098PMR56F9NQ5CWWPX36",
|
|
1108
1115
|
"key": "@config.onEventClick",
|
|
1109
1116
|
"name": "@config.on event click",
|
|
1110
1117
|
"payloadSchema": [
|
|
1111
1118
|
{
|
|
1112
1119
|
"name": "event",
|
|
1113
|
-
"type": "
|
|
1120
|
+
"type": "@entity"
|
|
1121
|
+
},
|
|
1122
|
+
{
|
|
1123
|
+
"name": "id",
|
|
1124
|
+
"type": "string"
|
|
1125
|
+
},
|
|
1126
|
+
{
|
|
1127
|
+
"name": "row",
|
|
1128
|
+
"type": "@entity"
|
|
1114
1129
|
}
|
|
1115
1130
|
],
|
|
1116
1131
|
"tier": "presentation"
|
|
@@ -1160,7 +1175,8 @@
|
|
|
1160
1175
|
"emit": {
|
|
1161
1176
|
"failure": "CalendarEventLoadFailed",
|
|
1162
1177
|
"success": "CalendarEventLoaded"
|
|
1163
|
-
}
|
|
1178
|
+
},
|
|
1179
|
+
"include": "@config.include"
|
|
1164
1180
|
}
|
|
1165
1181
|
],
|
|
1166
1182
|
[
|
|
@@ -1283,7 +1299,8 @@
|
|
|
1283
1299
|
"emit": {
|
|
1284
1300
|
"failure": "CalendarEventLoadFailed",
|
|
1285
1301
|
"success": "CalendarEventLoaded"
|
|
1286
|
-
}
|
|
1302
|
+
},
|
|
1303
|
+
"include": "@config.include"
|
|
1287
1304
|
}
|
|
1288
1305
|
],
|
|
1289
1306
|
[
|
|
@@ -1380,7 +1397,8 @@
|
|
|
1380
1397
|
]
|
|
1381
1398
|
]
|
|
1382
1399
|
]
|
|
1383
|
-
]
|
|
1400
|
+
],
|
|
1401
|
+
"include": "@config.include"
|
|
1384
1402
|
}
|
|
1385
1403
|
]
|
|
1386
1404
|
],
|
|
@@ -1408,7 +1426,8 @@
|
|
|
1408
1426
|
"emit": {
|
|
1409
1427
|
"failure": "CalendarEventLoadFailed",
|
|
1410
1428
|
"success": "CalendarEventLoaded"
|
|
1411
|
-
}
|
|
1429
|
+
},
|
|
1430
|
+
"include": "@config.include"
|
|
1412
1431
|
}
|
|
1413
1432
|
]
|
|
1414
1433
|
],
|
|
@@ -1436,7 +1455,8 @@
|
|
|
1436
1455
|
"emit": {
|
|
1437
1456
|
"failure": "CalendarEventLoadFailed",
|
|
1438
1457
|
"success": "CalendarEventLoaded"
|
|
1439
|
-
}
|
|
1458
|
+
},
|
|
1459
|
+
"include": "@config.include"
|
|
1440
1460
|
}
|
|
1441
1461
|
]
|
|
1442
1462
|
],
|
|
@@ -1471,7 +1491,8 @@
|
|
|
1471
1491
|
],
|
|
1472
1492
|
"@payload.searchTerm"
|
|
1473
1493
|
]
|
|
1474
|
-
]
|
|
1494
|
+
],
|
|
1495
|
+
"include": "@config.include"
|
|
1475
1496
|
}
|
|
1476
1497
|
]
|
|
1477
1498
|
],
|
|
@@ -1506,7 +1527,8 @@
|
|
|
1506
1527
|
],
|
|
1507
1528
|
"@payload.value"
|
|
1508
1529
|
]
|
|
1509
|
-
]
|
|
1530
|
+
],
|
|
1531
|
+
"include": "@config.include"
|
|
1510
1532
|
}
|
|
1511
1533
|
]
|
|
1512
1534
|
],
|
|
@@ -1524,7 +1546,8 @@
|
|
|
1524
1546
|
"emit": {
|
|
1525
1547
|
"failure": "CalendarEventLoadFailed",
|
|
1526
1548
|
"success": "CalendarEventLoaded"
|
|
1527
|
-
}
|
|
1549
|
+
},
|
|
1550
|
+
"include": "@config.include"
|
|
1528
1551
|
}
|
|
1529
1552
|
],
|
|
1530
1553
|
[
|
|
@@ -1549,7 +1572,8 @@
|
|
|
1549
1572
|
"emit": {
|
|
1550
1573
|
"failure": "CalendarEventLoadFailed",
|
|
1551
1574
|
"success": "CalendarEventLoaded"
|
|
1552
|
-
}
|
|
1575
|
+
},
|
|
1576
|
+
"include": "@config.include"
|
|
1553
1577
|
}
|
|
1554
1578
|
],
|
|
1555
1579
|
[
|