@rydr/game-sdk 8.3.0 → 8.5.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 (57) hide show
  1. package/dist/client/Room.d.ts +3 -6
  2. package/dist/client/Room.d.ts.map +1 -1
  3. package/dist/client/Room.js +149 -58
  4. package/dist/client/Room.js.map +1 -1
  5. package/dist/protocol/version.d.ts +1 -1
  6. package/dist/protocol/version.js +1 -1
  7. package/dist/ui/README.md +20 -11
  8. package/dist/ui/controller/combo-demo.d.ts +0 -3
  9. package/dist/ui/controller/combo-demo.d.ts.map +1 -1
  10. package/dist/ui/controller/combo-demo.js +7 -1
  11. package/dist/ui/controller/combo-demo.js.map +1 -1
  12. package/dist/ui/controller/control-spotlight.d.ts.map +1 -1
  13. package/dist/ui/controller/control-spotlight.js +8 -0
  14. package/dist/ui/controller/control-spotlight.js.map +1 -1
  15. package/dist/ui/controller/control-trainer.d.ts +3 -11
  16. package/dist/ui/controller/control-trainer.d.ts.map +1 -1
  17. package/dist/ui/controller/control-trainer.js +1 -1
  18. package/dist/ui/controller/control-trainer.js.map +1 -1
  19. package/dist/ui/controller/controller-map.d.ts +0 -3
  20. package/dist/ui/controller/controller-map.d.ts.map +1 -1
  21. package/dist/ui/controller/controller-map.js +0 -1
  22. package/dist/ui/controller/controller-map.js.map +1 -1
  23. package/dist/ui/controller/controller-pad.d.ts +35 -10
  24. package/dist/ui/controller/controller-pad.d.ts.map +1 -1
  25. package/dist/ui/controller/controller-pad.js +23 -8
  26. package/dist/ui/controller/controller-pad.js.map +1 -1
  27. package/dist/ui/controller/input-chip.d.ts +4 -26
  28. package/dist/ui/controller/input-chip.d.ts.map +1 -1
  29. package/dist/ui/controller/input-chip.js +107 -106
  30. package/dist/ui/controller/input-chip.js.map +1 -1
  31. package/dist/ui/controller/live-presses.d.ts +11 -0
  32. package/dist/ui/controller/live-presses.d.ts.map +1 -1
  33. package/dist/ui/controller/live-presses.js +3 -1
  34. package/dist/ui/controller/live-presses.js.map +1 -1
  35. package/dist/ui/controller/styles.js +81 -29
  36. package/dist/ui/controller/styles.js.map +1 -1
  37. package/dist/ui/controller/types.d.ts +2 -1
  38. package/dist/ui/controller/types.d.ts.map +1 -1
  39. package/dist/ui/controller/types.js.map +1 -1
  40. package/dist/ui/keycap.d.ts +19 -0
  41. package/dist/ui/keycap.d.ts.map +1 -1
  42. package/dist/ui/keycap.js +4 -1
  43. package/dist/ui/keycap.js.map +1 -1
  44. package/dist/ui/labeled-diamond.d.ts +12 -1
  45. package/dist/ui/labeled-diamond.d.ts.map +1 -1
  46. package/dist/ui/labeled-diamond.js +6 -3
  47. package/dist/ui/labeled-diamond.js.map +1 -1
  48. package/dist/ui/power-race.d.ts +84 -3
  49. package/dist/ui/power-race.d.ts.map +1 -1
  50. package/dist/ui/power-race.js +98 -41
  51. package/dist/ui/power-race.js.map +1 -1
  52. package/dist/ui/showcase/index.d.ts.map +1 -1
  53. package/dist/ui/showcase/index.js +23 -132
  54. package/dist/ui/showcase/index.js.map +1 -1
  55. package/dist/ui/styles.js +17 -5
  56. package/dist/ui/styles.js.map +1 -1
  57. package/package.json +2 -1
@@ -7,10 +7,10 @@
7
7
  * UP/DOWN/LEFT/RIGHT, R* → `createDpadKeycap` (the kit's chevron-on-steel keycap)
8
8
  * LT / RT / OPTIONS → `createButtonKeycap` (the kit's pill "L2"/"ZL" for a trigger, the
9
9
  * pad's round ☰ / + icon pip for OPTIONS)
10
- * LSTICK / RSTICK → a stick pictogram, cap centred inside four outward arrows
11
- * LSTICK / RSTICK :direction → the same pictogram with ONE arrow, cap already slid that way
12
- * LSTICK_PRESS / RSTICK_PRESS → a stick pictogram of the cap CLICKED: sunk inside a collar,
13
- * with a chevron pressing down into it
10
+ * LSTICK / RSTICK → a stick pictogram whose cap runs its travel circle: any direction
11
+ * LSTICK / RSTICK :direction → the same pictogram, cap pushing that way and back on a loop
12
+ * LSTICK_PRESS / RSTICK_PRESS → the same pictogram again, cap centred: it shrinks under a real
13
+ * press, exactly as the live pad's cap does
14
14
  *
15
15
  * The sticks are pictures rather than lettered chips throughout, because that is the one control where
16
16
  * the letter tells a rider nothing: "L3" does not say *click the stick*, and it changes per brand on
@@ -32,38 +32,30 @@ import { createKeycap, createDpadKeycap, createButtonKeycap } from "../keycap.js
32
32
  import { injectPadCss } from "./styles.js";
33
33
  import { isShellControl, parseToken, STICK_DIR_VECTOR } from "./tokens.js";
34
34
  const NS = "http://www.w3.org/2000/svg";
35
- /** The style used when a caller doesn't ask for one. */
36
- export const DEFAULT_STICK_STYLE = "profile";
37
35
  /**
38
- * Plan-view geometry. The well is deliberately SMALL for its box: the direction arrows sit **outside**
39
- * its rim, in clear air.
36
+ * Plan-view geometry. One drawing convention, deliberately plain: a well and a cap, and nothing else.
40
37
  *
41
- * They used to sit inside it, and that was the bug the well's rim is stroked in `currentColor` and so
42
- * is the arrow, so an arrow tip reaching the rim fused into it and the whole thing read as a blob
43
- * instead of an arrow. Nothing that has to stay legible should touch that ring.
38
+ * There used to be three conventions (a top-down one, this one, and a bold console-UI glyph) and every
39
+ * one of them drew direction ARROWS around the well. They're gone: an arrow at chip size is stroked in
40
+ * the same `currentColor` as the well rim, so it either touches the rim and fuses into a blob, or it
41
+ * sits outside it and eats the room the well needed to look like a well. The cap itself says it better —
42
+ * it MOVES (see {@link animateStick}), which is what a stick actually does and what an arrow was only
43
+ * ever a static shorthand for.
44
+ *
45
+ * With the arrows gone the well can have the whole box, so these are much bigger than the arrowed
46
+ * version's.
44
47
  */
45
- const WELL_R = 6.6;
46
- const CAP_R = 3.8;
47
- /** Outline chevron pointing OUTWARD, clear of the well rim. */
48
- const STICK_ARROW = "M9.3 4 L12 1 L14.7 4";
49
- /** The same cue as a SOLID triangle — heavier, and far more legible at chip size. */
50
- const STICK_TRI = "M12 0.6 L14.9 4 L9.1 4 Z";
51
- /** A solid triangle for the glyph style, whose disc has no rim to collide with. */
52
- const STICK_TRI_FAR = "M12 1.2 L15.2 5.6 L8.8 5.6 Z";
53
- /** The four rotations that turn one arrow into the "any direction" cue. */
54
- const OMNI_ROTATIONS = [0, 90, 180, 270];
55
- /** Chevron pointing DOWN at the well from outside it — the top-down style's "click" cue. */
56
- const STICK_PRESS_ARROW = "M9.4 1 L12 3.8 L14.6 1";
57
- /** Solid arrow pressing DOWN onto the thumb pad of the side-view stick. */
58
- const STICK_PRESS_TRI = "M12 7.4 L9.4 3.4 L14.6 3.4 Z";
59
- /** Solid arrow pointing DOWN *inside* the glyph style's heavy ring. */
60
- const STICK_PRESS_TRI_IN = "M12 16.8 L8.3 9.6 L15.7 9.6 Z";
61
- /** The side-view stick: a socket ellipse, a tapering shaft, and a rounded thumb pad. */
62
- const STICK_SHAFT = "M9.8 19 L10.9 12.6 L13.1 12.6 L14.2 19 Z";
48
+ const WELL_R = 9;
49
+ const CAP_R = 4.6;
63
50
  /** How far the cap slides at full deflection, in the pictogram's own 24-unit box. Kept under
64
51
  * `WELL_R - CAP_R` so a fully-deflected cap still reads as *inside* its well rather than escaping it. */
65
- const PIC_TRAVEL = 2.6;
66
- const ARROW_ROT = { up: 0, right: 90, down: 180, left: 270 };
52
+ const PIC_TRAVEL = 3.6;
53
+ /** One full revolution of the "any direction" sweep, ms. Matches `combo-demo` / `control-spotlight`. */
54
+ const SWEEP_MS = 1200;
55
+ /** One out-and-back nudge of a DIRECTIONAL cap, ms. Matches `control-trainer`'s hint sweep. */
56
+ const NUDGE_MS = 1400;
57
+ /** Where a reduced-motion "any direction" cap parks: off-centre, so it still reads as a live stick. */
58
+ const OMNI_STILL = [0.7, 0.7];
67
59
  /** Lesson colours. Kept beside the CSS block that mirrors them for the plain chips. */
68
60
  const STATE_COLOR = {
69
61
  idle: null, // null = whatever setColored would give
@@ -99,8 +91,8 @@ function textChip(text, extraClass = "") {
99
91
  return span;
100
92
  }
101
93
  /**
102
- * A directional chip renders ALREADY deflected — that is the information ("push it left"). The combo
103
- * demo calls `setDeflection(0, 0)` first and eases in, so it starts from centre there instead.
94
+ * A directional chip is BORN deflected — that is the information ("push it left"), and it's the frame a
95
+ * reduced-motion reader keeps. The loop and the combo demo both start from centre and take over anyway.
104
96
  */
105
97
  function seatCap(cap, mode, travel = PIC_TRAVEL) {
106
98
  if (mode === "omni" || mode === "press")
@@ -108,92 +100,96 @@ function seatCap(cap, mode, travel = PIC_TRAVEL) {
108
100
  const [vx, vy] = STICK_DIR_VECTOR[mode];
109
101
  cap.setAttribute("transform", `translate(${vx * travel} ${-vy * travel})`);
110
102
  }
111
- /** Emit the direction cue(s): one arrow for a direction, four for "any direction", none for a click. */
112
- function addArrows(svg, mode, d, cls) {
113
- if (mode === "press")
114
- return;
115
- const rots = mode === "omni" ? OMNI_ROTATIONS : [ARROW_ROT[mode]];
116
- for (const rot of rots)
117
- svg.appendChild(svgEl("path", { d, transform: `rotate(${rot} 12 12)` }, cls));
118
- }
119
- /** Plan view, light outline chevrons. The click is concentric rings + a chevron pressing in. */
120
- function drawTopDown(svg, mode) {
121
- svg.appendChild(svgEl("circle", { cx: 12, cy: 12, r: WELL_R }, "rydr-pad-stickpic-well"));
122
- if (mode === "press") {
123
- svg.appendChild(svgEl("path", { d: STICK_PRESS_ARROW }, "rydr-pad-stickpic-arrow"));
124
- svg.appendChild(svgEl("circle", { cx: 12, cy: 12, r: 4.9 }, "rydr-pad-stickpic-ring"));
125
- const cap = svgEl("circle", { cx: 12, cy: 13, r: 3 }, "rydr-pad-stickpic-cap rydr-pad-stickpic-press");
126
- svg.appendChild(cap);
127
- return cap;
128
- }
129
- addArrows(svg, mode, STICK_ARROW, "rydr-pad-stickpic-arrow");
130
- const cap = svgEl("circle", { cx: 12, cy: 12, r: CAP_R }, "rydr-pad-stickpic-cap");
131
- seatCap(cap, mode);
132
- svg.appendChild(cap);
133
- return cap;
103
+ /** Write a deflection onto a cap, in the SDK's convention (right = +1, **up = +1**). */
104
+ function placeCap(cap, x, y) {
105
+ cap.setAttribute("transform", `translate(${(x * PIC_TRAVEL).toFixed(2)} ${(-y * PIC_TRAVEL).toFixed(2)})`);
134
106
  }
135
107
  /**
136
- * The hybrid: plan view with SOLID arrows for directions, and a SIDE view for the click.
108
+ * Draw the pictogram: a well, and a cap in it. Same two shapes for every mode what differs is what the
109
+ * cap DOES, which is the animation's job, not the drawing's.
137
110
  *
138
- * Switching viewpoint for the click is the whole point. Pressing a stick is motion along the viewing
139
- * axis, which a plan view physically cannot depict hence the ambiguity between "click" and "push
140
- * down" that the other two styles have to work around with rings and insets. From the side it's just a
141
- * stick with an arrow on top of it.
111
+ * The click's cap carries `-press` as well, which is what the pressed CSS scales: a click is motion along
112
+ * the viewing axis, so the cap shrinks in place (smaller = pushed away from you) and stays centred,
113
+ * exactly as the live pad's own cap does.
142
114
  */
143
- function drawProfile(svg, mode) {
144
- if (mode === "press") {
145
- svg.appendChild(svgEl("path", { d: STICK_PRESS_TRI }, "rydr-pad-stickpic-fill"));
146
- svg.appendChild(svgEl("ellipse", { cx: 12, cy: 20, rx: 7.5, ry: 2.4 }, "rydr-pad-stickpic-base"));
147
- svg.appendChild(svgEl("path", { d: STICK_SHAFT }, "rydr-pad-stickpic-shaft"));
148
- const cap = svgEl("rect", { x: 7.4, y: 8.4, width: 9.2, height: 4.8, rx: 2.4 }, "rydr-pad-stickpic-cap rydr-pad-stickpic-press");
149
- svg.appendChild(cap);
150
- return cap;
151
- }
115
+ function drawStick(svg, mode) {
152
116
  svg.appendChild(svgEl("circle", { cx: 12, cy: 12, r: WELL_R }, "rydr-pad-stickpic-well"));
153
- addArrows(svg, mode, STICK_TRI, "rydr-pad-stickpic-fill");
154
- const cap = svgEl("circle", { cx: 12, cy: 12, r: CAP_R }, "rydr-pad-stickpic-cap");
117
+ const cls = mode === "press" ? "rydr-pad-stickpic-cap rydr-pad-stickpic-press" : "rydr-pad-stickpic-cap";
118
+ const cap = svgEl("circle", { cx: 12, cy: 12, r: CAP_R }, cls);
155
119
  seatCap(cap, mode);
156
120
  svg.appendChild(cap);
157
121
  return cap;
158
122
  }
159
- /** The bold console-UI mark: a solid disc and solid triangles; the click is a heavy ring with an arrow in it. */
160
- function drawGlyph(svg, mode) {
161
- if (mode === "press") {
162
- svg.appendChild(svgEl("circle", { cx: 12, cy: 12, r: 8.8 }, "rydr-pad-stickpic-bigring"));
163
- const cap = svgEl("path", { d: STICK_PRESS_TRI_IN }, "rydr-pad-stickpic-fill rydr-pad-stickpic-press");
164
- svg.appendChild(cap);
165
- return cap;
123
+ /**
124
+ * Make the cap DEMONSTRATE its gesture instead of parking at it — this is what replaced the arrows.
125
+ *
126
+ * "omni" the cap runs its travel circle: every direction, in turn.
127
+ * a dir → the cap pushes that way and comes back, on a loop. A cap parked at full deflection reads
128
+ * as "already done" (the same reason `control-trainer` sweeps its hints); moving out and
129
+ * back reads as an instruction.
130
+ * "press" → nothing. A click is along the viewing axis, so there is no in-plane motion to loop; it
131
+ * shows the live pad's pressed look when the rider actually clicks (`setPressed`).
132
+ *
133
+ * `prefers-reduced-motion` gets a still frame, not a twitch: a directional cap parks deflected, an
134
+ * undirected one parks off-centre.
135
+ *
136
+ * Returns the stopper, which a driver calls on its first `setDeflection`: once the combo demo, the
137
+ * trainer or real axes are driving this cap, two things writing the same transform would fight.
138
+ */
139
+ function animateStick(wrap, cap, mode) {
140
+ if (mode === "press")
141
+ return () => { };
142
+ const reduceMotion = typeof matchMedia === "function" && matchMedia("(prefers-reduced-motion: reduce)").matches;
143
+ if (reduceMotion) {
144
+ if (mode === "omni")
145
+ placeCap(cap, OMNI_STILL[0], OMNI_STILL[1]);
146
+ return () => { };
166
147
  }
167
- addArrows(svg, mode, STICK_TRI_FAR, "rydr-pad-stickpic-fill");
168
- const cap = svgEl("circle", { cx: 12, cy: 12, r: 5.4 }, "rydr-pad-stickpic-cap");
169
- seatCap(cap, mode);
170
- svg.appendChild(cap);
171
- return cap;
148
+ // The cap's CSS transition smooths a driver's occasional writes; per-frame it would only add lag.
149
+ wrap.classList.add("anim");
150
+ let raf = 0;
151
+ let t0 = 0;
152
+ const frame = (t) => {
153
+ if (!t0)
154
+ t0 = t;
155
+ const p = t - t0;
156
+ if (mode === "omni") {
157
+ const a = (p / SWEEP_MS) * Math.PI * 2;
158
+ placeCap(cap, Math.cos(a), Math.sin(a));
159
+ }
160
+ else {
161
+ const [vx, vy] = STICK_DIR_VECTOR[mode];
162
+ const s = 0.5 - 0.5 * Math.cos((p / NUDGE_MS) * Math.PI * 2);
163
+ placeCap(cap, vx * s, vy * s);
164
+ }
165
+ raf = requestAnimationFrame(frame);
166
+ };
167
+ raf = requestAnimationFrame(frame);
168
+ return () => {
169
+ cancelAnimationFrame(raf);
170
+ wrap.classList.remove("anim");
171
+ };
172
172
  }
173
- const STICK_DRAW = {
174
- topdown: drawTopDown,
175
- profile: drawProfile,
176
- glyph: drawGlyph,
177
- };
178
173
  /**
179
- * The stick pictogram. Three things must be tellable apart at a glance on a trainer screen:
174
+ * The stick pictogram. Three things must be tellable apart at a glance on a trainer screen, and none of
175
+ * them is drawn — all three are the SAME well and cap, told apart by how the cap moves:
180
176
  *
181
- * "omni" — the whole stick, free movement: FOUR outward arrows
182
- * a dir — the stick pushed one way: ONE arrow that way, cap already slid there
183
- * "press" — the stick CLICKED straight down (`LSTICK_PRESS`)
177
+ * "omni" — the whole stick, free movement: the cap runs its circle
178
+ * a dir — the stick pushed one way: the cap pushes out that way and comes back, on a loop
179
+ * "press" — the stick CLICKED straight down (`LSTICK_PRESS`): the cap stays centred and shrinks under
180
+ * a real press, the live pad's own click
184
181
  *
185
182
  * Sticks are pictures rather than lettered chips because that is the one control where the letter tells
186
183
  * a rider nothing — "L3" does not say *click the stick*, and it changes per brand on top of that. The
187
- * printed label still reaches them through the chip's tooltip. See {@link StickPictogramStyle} for the
188
- * three drawing conventions and why a click is the hard case.
184
+ * printed label still reaches them through the chip's tooltip.
189
185
  */
190
- function stickChip(mode, style) {
186
+ function stickChip(mode) {
191
187
  const wrap = document.createElement("span");
192
- wrap.className = `rydr-pad-chip stick ${style}`;
188
+ wrap.className = "rydr-pad-chip stick";
193
189
  const svg = svgEl("svg", { viewBox: "0 0 24 24" });
194
- const cap = STICK_DRAW[style](svg, mode);
190
+ const cap = drawStick(svg, mode);
195
191
  wrap.appendChild(svg);
196
- return { el: wrap, cap };
192
+ return { el: wrap, cap, stop: animateStick(wrap, cap, mode) };
197
193
  }
198
194
  /**
199
195
  * Build the chip for one control.
@@ -204,7 +200,6 @@ function stickChip(mode, style) {
204
200
  export function createInputChip(token, opts = {}) {
205
201
  injectPadCss();
206
202
  const set = opts.glyphSet ?? DEFAULT_GLYPH_SET;
207
- const stickStyle = opts.stickStyle ?? DEFAULT_STICK_STYLE;
208
203
  const parsed = parseToken(token);
209
204
  let el;
210
205
  let setPressed;
@@ -219,14 +214,14 @@ export function createInputChip(token, opts = {}) {
219
214
  /** The control whose real presses this chip reflects (a stick pictogram has none). */
220
215
  let pressName;
221
216
  if (parsed.kind === "stick") {
222
- const { el: node, cap } = stickChip(parsed.dir ?? "omni", stickStyle);
217
+ const { el: node, cap, stop } = stickChip(parsed.dir ?? "omni");
223
218
  el = node;
224
219
  node.title = parsed.stick === "LSTICK" ? "Left stick" : "Right stick";
225
220
  setPressed = (on) => node.classList.toggle("pressed", on);
226
221
  setState = (s) => classState(node, s);
227
- setDeflection = (x, y) => {
228
- cap.setAttribute("transform", `translate(${(x * PIC_TRAVEL).toFixed(2)} ${(-y * PIC_TRAVEL).toFixed(2)})`);
229
- };
222
+ // A driver taking over ends the self-demonstrating loop — see animateStick.
223
+ setDeflection = (x, y) => { stop(); placeCap(cap, x, y); };
224
+ disposeInner = stop;
230
225
  }
231
226
  else if (isShellControl(parsed.name)) {
232
227
  // The rider's resistance − / +, i.e. the UPPER shoulders. Same rectangle as a trigger, because
@@ -242,12 +237,18 @@ export function createInputChip(token, opts = {}) {
242
237
  else if (parsed.name === "LSTICK_PRESS" || parsed.name === "RSTICK_PRESS") {
243
238
  // Clicking a stick is its own gesture, so it gets its own picture rather than a "L3"/"LS" chip.
244
239
  // The brand letter still reaches the rider through the tooltip and assistive tech.
245
- const { el: node } = stickChip("press", stickStyle);
240
+ const { el: node } = stickChip("press");
246
241
  el = node;
247
242
  const side = parsed.name === "LSTICK_PRESS" ? "Left" : "Right";
248
243
  node.title = `${side} stick click (${buttonLabel(set, parsed.name)})`;
249
244
  setPressed = (on) => node.classList.toggle("pressed", on);
250
- setState = (s) => classState(node, s);
245
+ // The click chip is the one whose lesson states must also MOVE. Everywhere else a state is a colour,
246
+ // because the shape already says which control it is; here the shape is a dot in a well and the
247
+ // gesture is the only thing that distinguishes clicking the stick from pushing it. So `active` —
248
+ // "you are holding it right now" — drives the very same `pressed` class a real press drives, which
249
+ // is what makes the chip in the card and the cap on the live drawing perform the same click. `hint`
250
+ // loops that click in white, from CSS (see .rydr-pad-hint .rydr-pad-stickpic-press).
251
+ setState = (s) => { classState(node, s); setPressed(s === "active"); };
251
252
  pressName = parsed.name;
252
253
  }
253
254
  else if (DIAMONDS.includes(parsed.name)) {
@@ -1 +1 @@
1
- {"version":3,"file":"input-chip.js","sourceRoot":"","sources":["../../../src/ui/controller/input-chip.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"input-chip.js","sourceRoot":"","sources":["../../../src/ui/controller/input-chip.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,17 @@ export interface LivePressesOptions extends Omit<HeldPartsOptions, "held"> {
52
52
  * deadzone — the component's own animation gets its cap back on the next frame by simply drawing it.
53
53
  */
54
54
  setStick?(side: "l" | "r", x: number, y: number, state: PadPartState): void;
55
+ /**
56
+ * Put a stick back: neither the rider nor the caller's own animation is moving this one.
57
+ *
58
+ * REQUIRED alongside `setStick`, and the reason is the release. `setStick` is called only while a stick
59
+ * is PAST the deadzone, on the understanding that the caller redraws its cap on the next frame — but a
60
+ * caller only ever writes the sticks its OWN animation names, so a deflection on any other side had
61
+ * nobody to undo it and the cap stayed parked where the rider left it, still lit. Called once per pass
62
+ * for every side the rider is not deflecting; the implementation decides whether its own animation owns
63
+ * that side (in which case it leaves it alone) and otherwise recentres it.
64
+ */
65
+ restStick?(side: "l" | "r"): void;
55
66
  /**
56
67
  * The rider let go of a part this pass had lit. A component that repaints the part itself every frame
57
68
  * (because its animation owns it) should hand it back rather than blank it — blanking flashes one dark
@@ -1 +1 @@
1
- {"version":3,"file":"live-presses.d.ts","sourceRoot":"","sources":["../../../src/ui/controller/live-presses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,wFAAwF;IACxF,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC5B,gGAAgG;IAChG,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAAC,CAa9D;AAED,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC;IACxE,8EAA8E;IAC9E,KAAK,EAAE,YAAY,CAAC;IACpB,uGAAuG;IACvG,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAChD;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5E;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,IAAI,CAgBjG"}
1
+ {"version":3,"file":"live-presses.d.ts","sourceRoot":"","sources":["../../../src/ui/controller/live-presses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,wFAAwF;IACxF,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC5B,gGAAgG;IAChG,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAAC,CAa9D;AAED,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC;IACxE,8EAA8E;IAC9E,KAAK,EAAE,YAAY,CAAC;IACpB,uGAAuG;IACvG,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAChD;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5E;;;;;;;;;OASG;IACH,SAAS,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;IAClC;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,IAAI,CAiBjG"}
@@ -57,7 +57,7 @@ export function createLivePresses(opts) {
57
57
  if (!next.has(part))
58
58
  opts.release(part);
59
59
  lit = next;
60
- const { axis, setStick } = opts;
60
+ const { axis, setStick, restStick } = opts;
61
61
  if (!axis || !setStick)
62
62
  return;
63
63
  for (const side of ["l", "r"]) {
@@ -65,6 +65,8 @@ export function createLivePresses(opts) {
65
65
  const y = axis(side === "l" ? "LY" : "RY");
66
66
  if (Math.hypot(x, y) > STICK_LIT_DEADZONE)
67
67
  setStick(side, x, y, opts.state);
68
+ else
69
+ restStick?.(side);
68
70
  }
69
71
  };
70
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"live-presses.js","sourceRoot":"","sources":["../../../src/ui/controller/live-presses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAoB,MAAM,aAAa,CAAC;AAe/D;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,IAAsB;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAW,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,IAAI,CAAC;YAAE,SAAS;QACvD,MAAM,GAAG,GAAG,eAAe,CAAC,IAAoC,CAAC,CAAC;QAClE,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,kBAAkB;YAAE,SAAS;QAC5E,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,wEAAwE;IACrG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAwBD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,IAAI,GAAG,GAAG,IAAI,GAAG,EAAW,CAAC;IAC7B,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/E,KAAK,MAAM,IAAI,IAAI,IAAI;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,KAAK,MAAM,IAAI,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChE,GAAG,GAAG,IAAI,CAAC;QAEX,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC/B,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAU,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,kBAAkB;gBAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"live-presses.js","sourceRoot":"","sources":["../../../src/ui/controller/live-presses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAoB,MAAM,aAAa,CAAC;AAe/D;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,IAAsB;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAW,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,IAAI,CAAC;YAAE,SAAS;QACvD,MAAM,GAAG,GAAG,eAAe,CAAC,IAAoC,CAAC,CAAC;QAClE,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,kBAAkB;YAAE,SAAS;QAC5E,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,wEAAwE;IACrG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAmCD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,IAAI,GAAG,GAAG,IAAI,GAAG,EAAW,CAAC;IAC7B,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/E,KAAK,MAAM,IAAI,IAAI,IAAI;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,KAAK,MAAM,IAAI,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChE,GAAG,GAAG,IAAI,CAAC;QAEX,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAC3C,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC/B,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAU,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,kBAAkB;gBAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;;gBACvE,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -69,10 +69,25 @@ const CSS = `
69
69
  the off-centre click that sank the first attempt at this. Scoped to the stick cap group, whose
70
70
  bounding box is the cap itself; the buttons keep the pure translate above, where the origin can't
71
71
  matter. Declared after that rule (same specificity) so it wins for a stick. */
72
- .rydr-pad-stickcap { transform-box: fill-box; transform-origin: center; }
73
- .rydr-pad-part.on .rydr-pad-stickcap { transform: translateY(${PRESS_DEPTH}px) scale(${STICK_PRESS_SCALE}); }
72
+ .rydr-pad-stickcap {
73
+ transform-box: fill-box; transform-origin: center;
74
+ /* The click, as two numbers rather than as a transform. Both the real press below and the lesson's
75
+ "do this" loop (rydr-pad-click) read them, so the two can never drift apart: there is exactly one
76
+ definition of what clicking a stick LOOKS like on this drawing. */
77
+ --pad-click-depth: ${PRESS_DEPTH}px;
78
+ --pad-click-scale: ${STICK_PRESS_SCALE};
79
+ }
80
+ .rydr-pad-part.on .rydr-pad-stickcap { transform: translateY(var(--pad-click-depth)) scale(var(--pad-click-scale)); }
81
+ /* A stick CLICK is the one prompt that does move: it CLICKS, on a loop. Every other "do this" prompt
82
+ stays raised, because a sunk button would claim the rider is already holding it — but a raised white
83
+ cap is the one prompt that says nothing at all, being pixel-identical to a hinted round button. The
84
+ gesture itself is along the viewing axis, so the only way to name it is to perform it: the cap sinks
85
+ and shrinks and comes back, exactly the frame a real click lands on, in white instead of the accent.
86
+ The stick twin of a hinted DIRECTION sweeping out and back (see control-trainer's hint sweep). */
87
+ .rydr-pad-part.hint .rydr-pad-stickcap { animation: rydr-pad-click 1.6s ease-in-out infinite; }
74
88
  /* Only a real press sinks. A white "do this" prompt must stay RAISED — it is an instruction, and a
75
- sunk-looking prompt would claim the rider is already holding it. */
89
+ sunk-looking prompt would claim the rider is already holding it. (The stick click above is the one
90
+ exception, and it earns it by being a MOTION rather than a resting state.) */
76
91
  .rydr-pad-decor .rydr-pad-shape { fill: rgba(255,255,255,0.06); stroke: var(--pad-body-stroke); stroke-width: 1; }
77
92
  .rydr-pad-well { fill: rgba(0,0,0,0.30); stroke: var(--pad-body-stroke); stroke-width: 1; }
78
93
 
@@ -143,6 +158,15 @@ const CSS = `
143
158
  0%, 100% { opacity: 0.6; }
144
159
  50% { opacity: 1; }
145
160
  }
161
+ /* ONE definition of the click gesture, for every surface that has to demonstrate one: the pad's stick
162
+ cap and the chip pictogram's. Neither depth nor scale is written here — each surface declares
163
+ --pad-click-depth / --pad-click-scale beside its own pressed rule, so the loop lands on precisely the
164
+ frame that surface's real press lands on. The cap holds the clicked frame for a beat (45%→70%) rather
165
+ than touching it and leaving: a click that bounces straight back reads as a twitch. */
166
+ @keyframes rydr-pad-click {
167
+ 0%, 100% { transform: translateY(0) scale(1); }
168
+ 45%, 70% { transform: translateY(var(--pad-click-depth, 0px)) scale(var(--pad-click-scale, 1)); }
169
+ }
146
170
 
147
171
  /* Not present on the rider's current device (opt-in, via the "available" option). */
148
172
  .rydr-pad-part.unavailable { opacity: 0.22; }
@@ -200,33 +224,30 @@ const CSS = `
200
224
  .rydr-pad-chip.stick > svg { width: 30px; height: 30px; display: block; }
201
225
  .rydr-pad-stickpic-well { fill: rgba(0,0,0,0.35); stroke: currentColor; stroke-width: 1.4; opacity: 0.75; }
202
226
  .rydr-pad-stickpic-cap { fill: currentColor; opacity: 0.9; transition: transform 120ms ease-out; }
203
- .rydr-pad-stickpic-arrow { fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
204
- /* The chip's own CLICK, pressed. Same idea as the pad's cap, one drawing convention at a time: the two
205
- views ALONG the click axis (topdown, glyph) shrink, because that is what going away from the viewer
206
- looks like while profile is a SIDE view, where a click is honestly just travel down the shaft and
207
- shrinking it would read as the stick getting shorter. fill-box for the same reason as the pad, and
208
- scoped to the press pictogram's own class so it never fights the transform attribute that
209
- setDeflection writes on a DIRECTIONAL chip's cap. */
227
+ /* While the chip runs its own loop (the cap sweeping its circle, or nudging one way and back — see
228
+ animateStick in input-chip.ts) it writes a transform EVERY frame, and a transition on top of that is
229
+ pure lag. The transition stays for the driven case, where writes are occasional. */
230
+ .rydr-pad-chip.stick.anim .rydr-pad-stickpic-cap { transition: none; }
231
+ /* The chip's own CLICK, pressed: the cap SHRINKS IN PLACE, same as the live pad's cap. Pressing a stick
232
+ is motion along the viewing axis and the cap carries no lettering to travel with it, so smaller —
233
+ pushed away from you is the honest cue; sliding it would say "pushed sideways" instead, which is a
234
+ different gesture. fill-box for the same reason as the pad: without it the scale is about the
235
+ DRAWING's origin, so the cap drifts towards the corner as it shrinks. Scoped to the press pictogram's
236
+ own class so it never fights the transform attribute a DIRECTIONAL chip's cap carries. */
210
237
  .rydr-pad-chip.stick .rydr-pad-stickpic-press {
211
238
  transform-box: fill-box; transform-origin: center;
212
239
  transition: transform 120ms cubic-bezier(0.3, 0, 0.2, 1);
213
- }
214
- .rydr-pad-chip.stick.topdown.pressed .rydr-pad-stickpic-press,
215
- .rydr-pad-chip.stick.glyph.pressed .rydr-pad-stickpic-press { transform: scale(0.78); }
216
- .rydr-pad-chip.stick.profile.pressed .rydr-pad-stickpic-press { transform: translateY(2.4px); }
217
-
218
- /* the recessed collar of the top-down style's CLICK: the cap sits sunk inside it */
219
- .rydr-pad-stickpic-ring { fill: none; stroke: currentColor; stroke-width: 1.3; opacity: 0.55; }
220
- /* solid arrows the profile and glyph styles use filled triangles rather than outline chevrons,
221
- which is most of why they read better than the top-down style at chip size */
222
- .rydr-pad-stickpic-fill { fill: currentColor; }
223
- /* the side-view stick of the profile style: its socket and its tapering shaft */
224
- .rydr-pad-stickpic-base { fill: none; stroke: currentColor; stroke-width: 1.5; opacity: 0.6; }
225
- .rydr-pad-stickpic-shaft { fill: currentColor; opacity: 0.5; }
226
- /* the glyph style's heavy outer ring */
227
- .rydr-pad-stickpic-bigring { fill: none; stroke: currentColor; stroke-width: 2; }
228
- /* the glyph style is ringless — its solid disc carries the whole mark */
229
- .rydr-pad-chip.stick.glyph .rydr-pad-stickpic-cap { opacity: 1; }
240
+ /* Same two knobs as the pad's cap, so the pressed rule below and the hinted loop share one frame.
241
+ No depth: the pictogram's well is drawn flat with no shadow under the cap, so a 1-unit drop in a
242
+ 24-unit box would read as the cap slipping rather than sinking. Scale carries it alone, a touch
243
+ deeper than the pad's to survive being 30px wide. */
244
+ --pad-click-scale: ${STICK_PRESS_SCALE * 0.85};
245
+ }
246
+ .rydr-pad-chip.stick.pressed .rydr-pad-stickpic-press { transform: scale(var(--pad-click-scale)); }
247
+ /* The chip's "do this": the same click, looping, in the hint's white the pad's cap one line down is
248
+ doing exactly this at exactly this rate, which is the point. Without it a hinted click chip is a
249
+ static dot and the rider is told nothing about what to do with their thumb. */
250
+ .rydr-pad-chip.stick.rydr-pad-hint .rydr-pad-stickpic-press { animation: rydr-pad-click 1.6s ease-in-out infinite; }
230
251
 
231
252
  /* ── chip lesson states, mirroring the pad's ─────────────────────────────────
232
253
  Only the PLAIN chips (shoulder rectangle, stick pictogram, system chip) are styled here. The
@@ -384,8 +405,17 @@ const CSS = `
384
405
  .rydr-padtrainer .rydr-pad-chip {
385
406
  transition: background 260ms ease, border-color 260ms ease, color 260ms ease, transform 90ms linear;
386
407
  }
387
- /* …except a press, which must still read as instant even mid-lesson. */
388
- .rydr-padtrainer .rydr-pad-part.on .rydr-pad-shape { transition: fill 70ms linear, filter 70ms linear; }
408
+ /* …except a press, which must still read as instant even mid-lesson — the rider's own hand included
409
+ (.done, the green): a hand that takes ~a quarter-second to show up feels like lag, not a hand-off. */
410
+ .rydr-padtrainer .rydr-pad-part.on .rydr-pad-shape,
411
+ .rydr-padtrainer .rydr-pad-part.done .rydr-pad-shape,
412
+ .rydr-padtrainer .rydr-pad-stick.done .rydr-pad-shape {
413
+ transition: fill 70ms linear, stroke 70ms linear, filter 70ms linear;
414
+ }
415
+ .rydr-padtrainer .rydr-pad-part.on .rydr-pad-glyph,
416
+ .rydr-padtrainer .rydr-pad-part.done .rydr-pad-glyph { transition: fill 70ms linear; }
417
+ .rydr-padtrainer .rydr-pad-part.on .rydr-pad-glyph-vec,
418
+ .rydr-padtrainer .rydr-pad-part.done .rydr-pad-glyph-vec { transition: stroke 70ms linear; }
389
419
  .rydr-padtrainer .rydr-pad-chip.rydr-pad-active { transition: background 70ms linear, border-color 70ms linear, color 70ms linear; }
390
420
  /* The shared drawing spans the whole width, so it reads as one pad serving both panels rather than as a
391
421
  third column. Its own size preset still caps it. */
@@ -463,6 +493,17 @@ const CSS = `
463
493
  .rydr-padspot .rydr-pad-part .rydr-pad-glyph-vec {
464
494
  transition: fill 260ms ease, stroke 260ms ease;
465
495
  }
496
+ /* …except the rider's own hand (.done, the green) and a real press, which must read as instant: the glide
497
+ is for one control handing over to the next, not for answering a button someone just pushed. */
498
+ .rydr-padspot .rydr-pad-part.on .rydr-pad-shape,
499
+ .rydr-padspot .rydr-pad-part.done .rydr-pad-shape,
500
+ .rydr-padspot .rydr-pad-stick.done .rydr-pad-shape {
501
+ transition: fill 70ms linear, stroke 70ms linear, filter 70ms linear;
502
+ }
503
+ .rydr-padspot .rydr-pad-part.on .rydr-pad-glyph,
504
+ .rydr-padspot .rydr-pad-part.done .rydr-pad-glyph { transition: fill 70ms linear; }
505
+ .rydr-padspot .rydr-pad-part.on .rydr-pad-glyph-vec,
506
+ .rydr-padspot .rydr-pad-part.done .rydr-pad-glyph-vec { transition: stroke 70ms linear; }
466
507
 
467
508
  /* glow: false — the halo reads as "this is highlighted", the fill alone reads as "this is held down",
468
509
  and the second is the only thing a spotlight is saying. */
@@ -494,6 +535,17 @@ const CSS = `
494
535
  full opacity rather than leaving it stuck at whatever frame the animation was cancelled on. */
495
536
  .rydr-pad-part.hint .rydr-pad-shape,
496
537
  .rydr-pad-chip.rydr-pad-hint { animation: none; opacity: 1; }
538
+ /* The hinted CLICK is the one prompt whose animation carries the actual instruction, so it can't just
539
+ be cancelled: park it on the clicked frame. Raised, it would be indistinguishable from a hinted
540
+ round button, which is the whole thing this says. White still separates it from a real press. */
541
+ .rydr-pad-part.hint .rydr-pad-stickcap {
542
+ animation: none;
543
+ transform: translateY(var(--pad-click-depth)) scale(var(--pad-click-scale));
544
+ }
545
+ .rydr-pad-chip.stick.rydr-pad-hint .rydr-pad-stickpic-press {
546
+ animation: none;
547
+ transform: scale(var(--pad-click-scale));
548
+ }
497
549
  .rydr-padtrainer-check, .rydr-padtrainer-step { transition: none; animation: none; }
498
550
  /* The spotlight forces mode "still" here, so nothing fades in or out — every caption is simply up. */
499
551
  .rydr-padspot-tag, .rydr-padspot-caret, .rydr-padspot .rydr-pad-part .rydr-pad-shape { transition: none; }
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/ui/controller/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,QAAQ,GAAG,cAAc,CAAC;AAChC,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,wFAAwF;AACxF,MAAM,UAAU,YAAY;IAC1B,IAAI,WAAW,IAAI,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,WAAW,GAAG,IAAI,CAAC;QACnB,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC;IACpB,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,qGAAqG;AACrG,mGAAmG;AACnG,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;2DA0B+C,WAAW;;;;;;;;;;;;;+DAaP,WAAW,aAAa,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4avG,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/ui/controller/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,QAAQ,GAAG,cAAc,CAAC;AAChC,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,wFAAwF;AACxF,MAAM,UAAU,YAAY;IAC1B,IAAI,WAAW,IAAI,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,WAAW,GAAG,IAAI,CAAC;QACnB,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC;IACpB,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,qGAAqG;AACrG,mGAAmG;AACnG,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;2DA0B+C,WAAW;;;;;;;;;;;;;;;;;uBAiB/C,WAAW;uBACX,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAsKjB,iBAAiB,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqT9C,CAAC"}
@@ -23,7 +23,8 @@ import type { GlyphSet } from "../../protocol/glyphs.js";
23
23
  *
24
24
  * A {@link GlyphSet} plus the shapes that need their own drawing regardless of lettering: a Joy-Con
25
25
  * pair is a Nintendo device but is two slim halves rather than one shell, so `"joycon"` is a *drawing*
26
- * key rather than a glyph family — reachable only by asking for it explicitly.
26
+ * key rather than a glyph family — reachable only by asking for it explicitly, or by a HOST that
27
+ * knows more than the lettering telling us through `PadHardwareStore.padBrand`.
27
28
  */
28
29
  export type PadBrandKey = GlyphSet | "joycon";
29
30
  /** Every drawable, highlightable part of a controller. Positional names only. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/controller/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/controller/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ui/controller/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAsFH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAA8C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEzF;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,6EAA6E;IAC7E,uEAAuE;IACvE,8EAA8E;IAC9E,+BAA+B,CAAC;AAElC,sFAAsF;AACtF,MAAM,UAAU,UAAU,CAAC,CAAW;IACpC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QAC9B,KAAK,MAAM;YACT,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,KAAK,MAAM;YACT,8FAA8F;YAC9F,uFAAuF;YACvF,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ui/controller/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAuFH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAA8C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEzF;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,6EAA6E;IAC7E,uEAAuE;IACvE,8EAA8E;IAC9E,+BAA+B,CAAC;AAElC,sFAAsF;AACtF,MAAM,UAAU,UAAU,CAAC,CAAW;IACpC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QAC9B,KAAK,MAAM;YACT,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,KAAK,MAAM;YACT,8FAA8F;YAC9F,uFAAuF;YACvF,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC"}