@rydr/game-sdk 8.4.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 (53) hide show
  1. package/dist/protocol/version.d.ts +1 -1
  2. package/dist/protocol/version.js +1 -1
  3. package/dist/ui/README.md +20 -11
  4. package/dist/ui/controller/combo-demo.d.ts +0 -3
  5. package/dist/ui/controller/combo-demo.d.ts.map +1 -1
  6. package/dist/ui/controller/combo-demo.js +7 -1
  7. package/dist/ui/controller/combo-demo.js.map +1 -1
  8. package/dist/ui/controller/control-spotlight.d.ts.map +1 -1
  9. package/dist/ui/controller/control-spotlight.js +8 -0
  10. package/dist/ui/controller/control-spotlight.js.map +1 -1
  11. package/dist/ui/controller/control-trainer.d.ts +3 -11
  12. package/dist/ui/controller/control-trainer.d.ts.map +1 -1
  13. package/dist/ui/controller/control-trainer.js +1 -1
  14. package/dist/ui/controller/control-trainer.js.map +1 -1
  15. package/dist/ui/controller/controller-map.d.ts +0 -3
  16. package/dist/ui/controller/controller-map.d.ts.map +1 -1
  17. package/dist/ui/controller/controller-map.js +0 -1
  18. package/dist/ui/controller/controller-map.js.map +1 -1
  19. package/dist/ui/controller/controller-pad.d.ts +35 -10
  20. package/dist/ui/controller/controller-pad.d.ts.map +1 -1
  21. package/dist/ui/controller/controller-pad.js +23 -8
  22. package/dist/ui/controller/controller-pad.js.map +1 -1
  23. package/dist/ui/controller/input-chip.d.ts +4 -26
  24. package/dist/ui/controller/input-chip.d.ts.map +1 -1
  25. package/dist/ui/controller/input-chip.js +107 -106
  26. package/dist/ui/controller/input-chip.js.map +1 -1
  27. package/dist/ui/controller/live-presses.d.ts +11 -0
  28. package/dist/ui/controller/live-presses.d.ts.map +1 -1
  29. package/dist/ui/controller/live-presses.js +3 -1
  30. package/dist/ui/controller/live-presses.js.map +1 -1
  31. package/dist/ui/controller/styles.js +81 -29
  32. package/dist/ui/controller/styles.js.map +1 -1
  33. package/dist/ui/controller/types.d.ts +2 -1
  34. package/dist/ui/controller/types.d.ts.map +1 -1
  35. package/dist/ui/controller/types.js.map +1 -1
  36. package/dist/ui/keycap.d.ts +19 -0
  37. package/dist/ui/keycap.d.ts.map +1 -1
  38. package/dist/ui/keycap.js +4 -1
  39. package/dist/ui/keycap.js.map +1 -1
  40. package/dist/ui/labeled-diamond.d.ts +12 -1
  41. package/dist/ui/labeled-diamond.d.ts.map +1 -1
  42. package/dist/ui/labeled-diamond.js +6 -3
  43. package/dist/ui/labeled-diamond.js.map +1 -1
  44. package/dist/ui/power-race.d.ts +84 -3
  45. package/dist/ui/power-race.d.ts.map +1 -1
  46. package/dist/ui/power-race.js +98 -41
  47. package/dist/ui/power-race.js.map +1 -1
  48. package/dist/ui/showcase/index.d.ts.map +1 -1
  49. package/dist/ui/showcase/index.js +23 -132
  50. package/dist/ui/showcase/index.js.map +1 -1
  51. package/dist/ui/styles.js +17 -5
  52. package/dist/ui/styles.js.map +1 -1
  53. package/package.json +2 -1
@@ -27,6 +27,18 @@
27
27
  * Driving it: `start()`, then pump `setPower(w)` + `tick(dt)` every frame. The HUD self-resolves to
28
28
  * `won` / `lost` when either bar crosses 100%; poll `getPhase()` or pass `onResolve`. Drive external
29
29
  * VFX (a glow, a light) off `getProgress().charge`.
30
+ *
31
+ * ── Timings ────────────────────────────────────────────────────────────────────────────────────
32
+ * Three of them, all optional:
33
+ * · `introS` — the wind-up before the bars go live (default 2 s; `0`/`false` = live on frame 1).
34
+ * A widget the rider OPENED by pressing a button wants `introS: 0` — they already committed, and
35
+ * a wind-up leaves them pedalling into nothing. A widget that arrives at them (an incoming
36
+ * missile) wants the default: the wind-up IS the warning.
37
+ * · `durationS` — the race itself: the clock's fill time, and the work that fills the charge bar.
38
+ * · `hold` — what happens after it resolves: when the win/lose stamp lands (`stampDelayS`) and when
39
+ * the overlay hides itself (`hideAfterS`, or `false` to leave it up and hide it yourself).
40
+ * `setTarget()` re-sizes the effort target in place, so a rider retuning their FTP mid-ride doesn't
41
+ * cost you a rebuilt widget.
30
42
  */
31
43
  const STYLE_ID = "rydr-power-race-styles";
32
44
  const VARIANTS = ["twin-stacked", "twin-towers"];
@@ -39,12 +51,16 @@ const GRADES = [
39
51
  { min: 0, label: "CLEAN", color: "#9aa7c7" },
40
52
  ];
41
53
  const gradeForPct = (pct) => GRADES.find((g) => pct >= g.min);
42
- /** Intro sub-phase durations (seconds). The race begins after their sum (3.5 s). */
54
+ /** Intro sub-phase weights (seconds at the default pace). `introS` scales all three together. */
43
55
  const PRIMING_WARNING_S = 0.5;
44
56
  const PRIMING_PROMPT_S = 1.0;
45
57
  const PRIMING_BARS_S = 0.5;
46
- /** Total intro duration in seconds. */
47
- export const INTRO_TOTAL_S = PRIMING_WARNING_S + PRIMING_PROMPT_S + PRIMING_BARS_S; // 3.5
58
+ /** Default total intro duration in seconds — the default of `introS`, and what it scales. */
59
+ export const INTRO_TOTAL_S = PRIMING_WARNING_S + PRIMING_PROMPT_S + PRIMING_BARS_S; // 2.0
60
+ /** Default delay from resolving to the win/lose stamp landing (seconds). */
61
+ export const DEFAULT_STAMP_DELAY_S = 0.25;
62
+ /** Default delay from resolving to the overlay hiding itself (seconds). */
63
+ export const DEFAULT_HIDE_AFTER_S = 1.25;
48
64
  /** The built-in "alert" skin — the proven Tower-Defense look. Default when no `theme` is passed. */
49
65
  export const DEFAULT_POWER_RACE_THEME = {
50
66
  deadline: "#ef4444",
@@ -63,23 +79,32 @@ const DEFAULT_TEXT = {
63
79
  lose: "MISSED",
64
80
  };
65
81
  export function createPowerRace(opts = {}) {
66
- const ftp = opts.ftp ?? 250;
67
- const durationS = opts.durationS ?? 5;
68
- const targetFtpPct = opts.targetFtpPct ?? 1.1;
82
+ let ftp = opts.ftp ?? 250;
83
+ let durationS = opts.durationS ?? 5;
84
+ let targetFtpPct = opts.targetFtpPct ?? 1.1;
69
85
  let variant = opts.variant ?? "twin-stacked";
70
86
  let scoreVariant = opts.scoreVariant ?? null;
71
87
  const text = { ...DEFAULT_TEXT, ...(opts.text ?? {}) };
72
88
  const theme = { ...DEFAULT_POWER_RACE_THEME, ...(opts.theme ?? {}) };
73
89
  const onResolve = opts.onResolve;
74
90
  const mode = opts.mode === "charge" ? "charge" : "race";
91
+ // Intro: one knob for all three sub-phases, so a game retimes the wind-up without re-choreographing
92
+ // it. The cumulative edges are precomputed — `tick` compares against them, not against a scale.
93
+ const introS = opts.introS === false ? 0 : Math.max(0, opts.introS ?? INTRO_TOTAL_S);
94
+ const introScale = introS / INTRO_TOTAL_S;
95
+ const warnEndS = PRIMING_WARNING_S * introScale;
96
+ const promptEndS = warnEndS + PRIMING_PROMPT_S * introScale;
97
+ // Resolution holds. `null` == "never" (the `false` the caller passed); a number is a delay in seconds.
98
+ const stampDelayS = opts.hold?.stampDelayS === false ? null : Math.max(0, opts.hold?.stampDelayS ?? DEFAULT_STAMP_DELAY_S);
99
+ const hideAfterS = opts.hold?.hideAfterS === false ? null : Math.max(0, opts.hold?.hideAfterS ?? DEFAULT_HIDE_AFTER_S);
75
100
  ensureStyles();
76
101
  if (!VARIANTS.includes(variant))
77
102
  variant = "twin-stacked";
78
103
  if (scoreVariant && !SCORE_VARIANTS.includes(scoreVariant))
79
104
  scoreVariant = null;
80
- const requiredJoules = targetFtpPct * ftp * durationS;
105
+ let requiredJoules = targetFtpPct * ftp * durationS;
81
106
  const root = document.createElement("div");
82
- root.className = `rpr v-${variant} mode-${mode}${scoreVariant ? ` has-score place-${scoreVariant}` : ""}`;
107
+ root.className = `rpr v-${variant} mode-${mode}${introS <= 0 ? " no-intro" : ""}${scoreVariant ? ` has-score place-${scoreVariant}` : ""}`;
83
108
  root.innerHTML = innerForVariant(variant);
84
109
  // per-instance palette → CSS custom properties (cascades to every descendant)
85
110
  root.style.setProperty("--rpr-deadline", theme.deadline);
@@ -114,7 +139,6 @@ export function createPowerRace(opts = {}) {
114
139
  let accumulatedJoules = 0;
115
140
  let lastPowerW = 0;
116
141
  let lastStage = "idle";
117
- let resolutionTimer = 0;
118
142
  let stampRevealTimer = 0;
119
143
  let hideTimer = 0;
120
144
  let primingS = 0;
@@ -172,7 +196,13 @@ export function createPowerRace(opts = {}) {
172
196
  root.classList.add("score-resolved");
173
197
  root.classList.toggle("score-miss", isMiss);
174
198
  }
175
- function applyOutcome(outcome) {
199
+ /**
200
+ * Land an outcome: recolour, score it, then schedule the stamp and the auto-hide.
201
+ *
202
+ * `hideAfterOverrideS` is `undefined` for "use the configured hold" and `null` for "don't hide" —
203
+ * `showResolution` needs to say both, and a game that asked for no auto-hide must not get one.
204
+ */
205
+ function applyOutcome(outcome, hideAfterOverrideS) {
176
206
  phase = outcome;
177
207
  root.classList.remove("racing", "won", "lost");
178
208
  root.classList.add(outcome);
@@ -186,38 +216,58 @@ export function createPowerRace(opts = {}) {
186
216
  stampEl.innerHTML = "";
187
217
  root.classList.remove("stamp-revealed");
188
218
  window.clearTimeout(stampRevealTimer);
219
+ stampRevealTimer = 0;
189
220
  window.clearTimeout(hideTimer);
190
- stampRevealTimer = window.setTimeout(() => {
221
+ hideTimer = 0;
222
+ const revealStamp = () => {
191
223
  stampEl.innerHTML = `<span class="text">${outcome === "won" ? text.win : text.lose}</span>`;
192
224
  root.classList.add("stamp-revealed");
193
- stampRevealTimer = 0;
194
- }, 250);
195
- hideTimer = window.setTimeout(() => {
196
- root.classList.remove("show");
197
- hideTimer = 0;
198
- }, 1250);
225
+ };
226
+ if (stampDelayS === 0)
227
+ revealStamp();
228
+ else if (stampDelayS !== null) {
229
+ stampRevealTimer = window.setTimeout(() => {
230
+ revealStamp();
231
+ stampRevealTimer = 0;
232
+ }, stampDelayS * 1000);
233
+ }
234
+ const hideAfter = hideAfterOverrideS === undefined ? hideAfterS : hideAfterOverrideS;
235
+ if (hideAfter !== null) {
236
+ hideTimer = window.setTimeout(() => {
237
+ root.classList.remove("show");
238
+ hideTimer = 0;
239
+ }, hideAfter * 1000);
240
+ }
199
241
  onResolve?.(outcome);
200
242
  }
201
243
  return {
202
244
  element: root,
203
245
  start() {
204
- window.clearTimeout(resolutionTimer);
205
- resolutionTimer = 0;
206
246
  window.clearTimeout(stampRevealTimer);
207
247
  stampRevealTimer = 0;
208
248
  window.clearTimeout(hideTimer);
209
249
  hideTimer = 0;
210
- phase = "priming-warning";
211
250
  primingS = 0;
212
251
  elapsedS = 0;
213
252
  accumulatedJoules = 0;
214
253
  lastPowerW = 0;
215
254
  root.classList.remove("racing", "won", "lost", "stamp-revealed", "bars-open");
216
255
  root.classList.add("show");
217
- setPrimingClass("warning");
218
256
  headingEl.textContent = text.heading;
219
257
  promptEl.textContent = text.prompt;
220
258
  stampEl.textContent = "";
259
+ if (introS <= 0) {
260
+ // No wind-up: straight into the race, so watts count from THIS frame. The priming classes are
261
+ // skipped outright rather than flipped three times in one frame, and `.no-intro` drops their
262
+ // slide/fade, so frame 1 already looks like the racing state instead of animating towards it.
263
+ phase = "racing";
264
+ setPrimingClass(null);
265
+ root.classList.add("bars-open", "racing");
266
+ }
267
+ else {
268
+ phase = "priming-warning";
269
+ setPrimingClass("warning");
270
+ }
221
271
  paint();
222
272
  },
223
273
  setPower(w) {
@@ -232,19 +282,32 @@ export function createPowerRace(opts = {}) {
232
282
  charge: Math.min(1, accumulatedJoules / requiredJoules),
233
283
  };
234
284
  },
285
+ getTarget() {
286
+ return { ftp, durationS, targetFtpPct, requiredJoules };
287
+ },
288
+ setTarget(next) {
289
+ if (next.ftp != null && next.ftp > 0)
290
+ ftp = next.ftp;
291
+ if (next.durationS != null && next.durationS > 0)
292
+ durationS = next.durationS;
293
+ if (next.targetFtpPct != null && next.targetFtpPct > 0)
294
+ targetFtpPct = next.targetFtpPct;
295
+ requiredJoules = targetFtpPct * ftp * durationS;
296
+ paint();
297
+ },
235
298
  tick(dt) {
236
299
  if (phase === "priming-warning" || phase === "priming-prompt" || phase === "priming-bars") {
237
300
  primingS += dt;
238
- if (phase === "priming-warning" && primingS >= PRIMING_WARNING_S) {
301
+ if (phase === "priming-warning" && primingS >= warnEndS) {
239
302
  phase = "priming-prompt";
240
303
  setPrimingClass("prompt");
241
304
  }
242
- if (phase === "priming-prompt" && primingS >= PRIMING_WARNING_S + PRIMING_PROMPT_S) {
305
+ if (phase === "priming-prompt" && primingS >= promptEndS) {
243
306
  phase = "priming-bars";
244
307
  setPrimingClass("bars");
245
308
  root.classList.add("bars-open");
246
309
  }
247
- if (phase === "priming-bars" && primingS >= INTRO_TOTAL_S) {
310
+ if (phase === "priming-bars" && primingS >= introS) {
248
311
  phase = "racing";
249
312
  setPrimingClass(null);
250
313
  root.classList.add("racing");
@@ -276,24 +339,13 @@ export function createPowerRace(opts = {}) {
276
339
  showResolution(outcome, opts2 = {}) {
277
340
  if (outcome !== "won" && outcome !== "lost")
278
341
  return;
279
- applyOutcome(outcome);
342
+ // A caller-supplied hide time REPLACES the configured one — it used to be a second timer racing
343
+ // the built-in 1.25 s hide, which silently capped anything longer.
344
+ const override = opts2.durationS === false ? null : opts2.durationS != null && opts2.durationS > 0 ? opts2.durationS : undefined;
345
+ applyOutcome(outcome, override);
280
346
  paint();
281
- if (resolutionTimer) {
282
- window.clearTimeout(resolutionTimer);
283
- resolutionTimer = 0;
284
- }
285
- if (opts2.durationS != null && opts2.durationS > 0) {
286
- resolutionTimer = window.setTimeout(() => {
287
- root.classList.remove("show");
288
- resolutionTimer = 0;
289
- }, opts2.durationS * 1000);
290
- }
291
347
  },
292
348
  reset() {
293
- if (resolutionTimer) {
294
- window.clearTimeout(resolutionTimer);
295
- resolutionTimer = 0;
296
- }
297
349
  if (stampRevealTimer) {
298
350
  window.clearTimeout(stampRevealTimer);
299
351
  stampRevealTimer = 0;
@@ -313,8 +365,6 @@ export function createPowerRace(opts = {}) {
313
365
  paint();
314
366
  },
315
367
  dispose() {
316
- if (resolutionTimer)
317
- window.clearTimeout(resolutionTimer);
318
368
  if (stampRevealTimer)
319
369
  window.clearTimeout(stampRevealTimer);
320
370
  if (hideTimer)
@@ -651,6 +701,13 @@ const CSS = `
651
701
  58% { transform: translateY(-50%) scale(0.92); }
652
702
  100% { transform: translateY(-50%) scale(1.28); }
653
703
  }
704
+ /* introS: 0 — no wind-up. The slide and the fade ARE the wind-up's choreography, so they go with it:
705
+ frame 1 has to read as the racing state, not as a 400 ms fade the rider pedals through having already
706
+ committed. Only the opacity cross-fade of the copy survives, which nothing has to wait for. */
707
+ .rpr.no-intro .rpr-stack,
708
+ .rpr.no-intro .rpr-towers { transition: none; }
709
+ .rpr.no-intro .rpr-heading,
710
+ .rpr.no-intro .rpr-prompt { transition: opacity 0.3s ease; }
654
711
  /* charge mode — no rival: hide the deadline bar and calm the alarm framing. The single charge bar
655
712
  stays centred by the flex/align layout it already lives in; only the effort bar remains. */
656
713
  .rpr.mode-charge .rpr-deadline-bar { display: none; }
@@ -1 +1 @@
1
- {"version":3,"file":"power-race.js","sourceRoot":"","sources":["../../src/ui/power-race.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"power-race.js","sourceRoot":"","sources":["../../src/ui/power-race.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/showcase/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAkDH,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAE7E,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAkFpD,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,iBAAsB,GAAG,UAAU,CA+xB3F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/showcase/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAkDH,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAE7E,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA6DpD,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,iBAAsB,GAAG,UAAU,CAmuB3F"}
@@ -66,25 +66,6 @@ const PAD_FAMILIES = [
66
66
  { caption: "Switch Pro", glyphSet: "nintendo" },
67
67
  { caption: "Zwift Play / Ride", glyphSet: "zwift" },
68
68
  ];
69
- /**
70
- * The idle-pip legibility candidates — see the two "Idle pips" sections. Each entry is just a class the
71
- * catalog puts on a wrapper; the actual tone/edge lives in BS_CSS under the same class, so choosing a
72
- * winner means moving ONE block into `ui/styles.ts` (and `INACTIVE` in `keycap.ts` for the tone).
73
- */
74
- const IDLE_DARK = [
75
- { cls: "d-rim", name: "D1 · Hairline rim", how: "same #3a424e face, 1.5px inner white rim" },
76
- { cls: "d-lift", name: "D2 · One step up", how: "#59626f — no edge, just a lighter steel" },
77
- { cls: "d-halo", name: "D3 · Outer halo", how: "darker #2f353e + a 1.5px ring OUTSIDE the pip" },
78
- { cls: "d-well", name: "D4 · Recessed well", how: "#262b33 + a bright top lip: reads as a hole" },
79
- { cls: "d-edge", name: "D5 · Bottom edge", how: "#3a424e + a lit lower lip + faint outer ring" },
80
- ];
81
- const IDLE_LIGHT = [
82
- { cls: "l-ghost", name: "L1 · Ghost steel", how: "#7c8798 — mid-light, still clearly \u201coff\u201d" },
83
- { cls: "l-frost", name: "L2 · Frost", how: "#aab4c2 — light enough to read across a room" },
84
- { cls: "l-outline", name: "L3 · Outline only", how: "empty core, 2px white ring: a slot, not a key" },
85
- { cls: "l-chalk", name: "L4 · Chalk", how: "#d5dbe4 flat, no inner shadow, held at 85%" },
86
- { cls: "l-pearl", name: "L5 · Pearl + halo", how: "#b9c3d1 with a white halo: pops on any card" },
87
- ];
88
69
  /** Mount the full UI catalog into `host`. Returns a handle whose `dispose()` tears it all down. */
89
70
  export function mountUiShowcase(host, opts = {}) {
90
71
  const session = opts.session;
@@ -198,17 +179,6 @@ export function mountUiShowcase(host, opts = {}) {
198
179
  el(c, "div", "bs-cap", caption);
199
180
  return stage;
200
181
  };
201
- // One idle-pip candidate: the same mono diamond (with a coloured one beside it, since the idle tone has
202
- // to survive both) under the variant's class, captioned with what it actually does.
203
- const idleCell = (grid, v) => {
204
- const c = el(grid, "div", "bs-cell");
205
- const stage = el(c, "div", "bs-stage");
206
- const row = el(stage, "div", `bs-idle ${v.cls}`);
207
- row.appendChild(createKeycap("DIAMOND_DOWN", { variant: "full", animate: false }).el);
208
- row.appendChild(createKeycap("DIAMOND_RIGHT", { variant: "full", colored: true, animate: false }).el);
209
- el(c, "div", "bs-cap", v.name);
210
- el(c, "div", "bs-cap sub", v.how);
211
- };
212
182
  // a generic "icon + name" node — the consumer's OWN content fitted inside a card's fixed slot
213
183
  const iconLabel = (name, color) => {
214
184
  const { canvas, c } = makeCanvas(20, 20);
@@ -268,23 +238,6 @@ export function mountUiShowcase(host, opts = {}) {
268
238
  cooldowns.push({ kc: cd, total: 6 });
269
239
  cell(grid, "Cooldown (on the key)", cd.el);
270
240
  }
271
- // --- idle-pip legibility studies ---------------------------------------
272
- // The full diamond's three IDLE siblings are #3a424e, which on a dark card is very nearly the card:
273
- // the active key reads, the other three barely do, so the diamond stops teaching "there are four of
274
- // these". Ten candidates, in two families — pick one and it becomes the component's own tone (the
275
- // overrides live in BS_CSS and are catalog-only until then).
276
- g.section("Idle pips — DARK candidates (still dark, but legible)", "The three idle siblings keep a dark face; the contrast comes from an EDGE (a rim, a top highlight, a halo) or a small step up in tone — never from turning them light. Compare against \u201cA/B/Y/Z diamond\u201d above, which is today\u2019s #3a424e.");
277
- {
278
- const grid = el(g.list, "div", "bs-grid");
279
- for (const v of IDLE_DARK)
280
- idleCell(grid, v);
281
- }
282
- g.section("Idle pips — LIGHT candidates (light pips on the dark surface)", "The other direction: the idle siblings go light, so the whole cluster sits ON the dark card as one bright object with the white active key as its loud member. Reads at distance; costs some of the \u201cthese three are off\u201d quietness.");
283
- {
284
- const grid = el(g.list, "div", "bs-grid");
285
- for (const v of IDLE_LIGHT)
286
- idleCell(grid, v);
287
- }
288
241
  // --- Directional buttons -----------------------------------------------
289
242
  g.section("Directional buttons", "The same state machine as the face buttons (solo/full, pulse, pressed, cooldown). A white chevron on a steel pip, not the bright key hues.");
290
243
  {
@@ -365,14 +318,6 @@ export function mountUiShowcase(host, opts = {}) {
365
318
  cooldowns.push({ kc: dia.cards.DIAMOND_RIGHT.keycap, total: 6 });
366
319
  dia.cards.DIAMOND_LEFT.setDisabled(true);
367
320
  }
368
- g.section("Move diamond (HUD) — mono", "The same diamond in mono: white keys with a dark letter instead of the bright hues. Same states.");
369
- {
370
- const stage = el(g.list, "div", "bs-diamond");
371
- const dia = mountActionDiamond(stage, { press, colored: false, cards: { DIAMOND_UP: { label: "Spark" }, DIAMOND_DOWN: { label: "Quake" }, DIAMOND_LEFT: {}, DIAMOND_RIGHT: { label: "Blaze" } } });
372
- dia.cards.DIAMOND_DOWN.setActive(true);
373
- cooldowns.push({ kc: dia.cards.DIAMOND_RIGHT.keycap, total: 6 });
374
- dia.cards.DIAMOND_LEFT.setDisabled(true);
375
- }
376
321
  // --- the labeled diamond -----------------------------------------------
377
322
  g.section("Labeled diamond", "A central A/B/Y/Z pip cluster, any number of buttons active at once, each label radiating from its key (Y above, B below, Z left, A right) and seated in the dark card. Toggle disables the Y action.");
378
323
  {
@@ -388,27 +333,6 @@ export function mountUiShowcase(host, opts = {}) {
388
333
  btn.addEventListener("click", () => { disabled = !disabled; sync(); });
389
334
  sync();
390
335
  }
391
- // --- the solo labeled diamond ------------------------------------------
392
- g.section("Labeled diamond — solo (one active)", "The labeled diamond's radiating card label, but with exactly ONE active button at a time — a big lit pip, the other three the small blank grey circles of the A/B/Y/Z diamond. Colour and mono. Press ‘Next’ to move the active button (setActive).");
393
- {
394
- const grid = el(g.list, "div", "bs-grid");
395
- const LABELS = { DIAMOND_UP: "Inspect", DIAMOND_DOWN: "Equip", DIAMOND_LEFT: "Inventory", DIAMOND_RIGHT: "Back" };
396
- const order = ["DIAMOND_DOWN", "DIAMOND_UP", "DIAMOND_LEFT", "DIAMOND_RIGHT"];
397
- for (const colored of [true, false]) {
398
- const cellWrap = el(grid, "div", "bs-cell ld-cell");
399
- const stage = el(cellWrap, "div", "bs-ld");
400
- const sld = mountSoloLabeledDiamond(stage, { inline: true, colored, animate: false, active: "DIAMOND_DOWN", label: LABELS.DIAMOND_DOWN });
401
- let i = 0;
402
- const btn = el(cellWrap, "button", "bs-btn");
403
- btn.textContent = "Next button";
404
- btn.addEventListener("click", () => {
405
- i = (i + 1) % order.length;
406
- const b = order[i];
407
- sld.setActive(b, LABELS[b] ?? "");
408
- });
409
- el(cellWrap, "div", "bs-cap", colored ? "Colour" : "Mono");
410
- }
411
- }
412
336
  // --- solo labeled diamond: label placement -----------------------------
413
337
  g.section("Solo diamond — label placement", "The label side is set with labelPos (default ‘auto’ = the active button's side), independent of which button is active. Change the active button AND the label side separately: the tuck adapts to the pip under the label — deeper for a small grey circle, shallower for the big active pip — so the letter is never covered.");
414
338
  {
@@ -491,7 +415,7 @@ export function mountUiShowcase(host, opts = {}) {
491
415
  }
492
416
  }
493
417
  // --- the power-race overlay -------------------------------------------
494
- g.section("Power race (overlay)", "The timed ∫power-vs-deadline race: charge bar (your effort) vs a deadline bar (the clock). First to 100% wins. It's a full-screen overlay — launch one and it plays out, fed by real watts (or a ~1.3×FTP sim without a session). Recolour with `theme`, relabel with `text`.");
418
+ g.section("Power race (overlay)", "The timed ∫power-vs-deadline race: charge bar (your effort) vs a deadline bar (the clock). First to 100% wins. It's a full-screen overlay — launch one and it plays out, fed by real watts (or a ~1.3×FTP sim without a session). Recolour with `theme`, relabel with `text`, retime with `introS` (the wind-up) and `hold` (the stamp + auto-hide).");
495
419
  {
496
420
  const row = el(g.list, "div", "bs-btnrow");
497
421
  const mk = (label, o) => {
@@ -504,6 +428,13 @@ export function mountUiShowcase(host, opts = {}) {
504
428
  mode: "charge",
505
429
  text: { heading: "CHARGING", prompt: "PUSH TO CHARGE", chargeLabel: "CHARGE", win: "CHARGED" },
506
430
  });
431
+ // A widget the rider OPENED: no wind-up, and the stamp lands on the spot rather than a beat late.
432
+ mk("No intro (rider opened it)", {
433
+ mode: "charge",
434
+ introS: 0,
435
+ hold: { stampDelayS: 0 },
436
+ text: { heading: "PICK THEM UP", prompt: "PUSH TO REVIVE", chargeLabel: "REVIVE", win: "ON THEIR FEET" },
437
+ });
507
438
  mk("Themed + relabelled", {
508
439
  variant: "twin-stacked",
509
440
  theme: { deadline: "#c084fc", deadlineDeep: "#4c1d95", charge: "#22d3ee", chargeDeep: "#0e7490", win: "#22c55e", winDeep: "#166534" },
@@ -565,8 +496,8 @@ export function mountUiShowcase(host, opts = {}) {
565
496
  pads.push(mountControllerPad(joyHost, { press, brand: "joycon", glyphSet: "nintendo", size: "md", allowShellOwned: true }));
566
497
  padCell("Joy-Con pair (brand: \"joycon\")", joyHost);
567
498
  }
568
- // --- joystick pictograms: three conventions, side by side --------------
569
- g.section("Joystick pictograms", "The sticks are the hard case: a CLICK is motion along the viewing axis, which a plan view physically cannot draw, and a lettered “L3” chip says nothing about what to do with your thumb. So they're pictures, in one of three conventions `profile` is the default and what you should use. Direction arrows sit OUTSIDE the well rim on purpose: the rim is stroked in the same colour, so an arrow touching it fuses into a blob and stops reading as an arrow. The other two styles are kept for the odd case that wants them: `topdown` = the abstract plan view (PlayStation / Steam overlay), `glyph` = the bold console-UI mark (Xbox / Steam Input).");
499
+ // --- joystick pictograms: one convention, self-demonstrating --------------
500
+ g.section("Joystick pictograms", "The sticks are the hard case: a CLICK is motion along the viewing axis, which a plan view physically cannot draw, and a lettered “L3” chip says nothing about what to do with your thumb. So they're pictures and all three are the SAME picture, a well and a cap, told apart by what the cap DOES. “Any direction” runs the cap round its circle; a direction pushes it that way and brings it back on a loop (parked at full deflection it would read as “already done”); a CLICK keeps it centred and shrinks it under a real press, exactly like the cap on the live pad above — click your stick and watch. There are no direction arrows any more: at chip size an arrow is stroked in the same colour as the well rim, so it either fuses into it or eats the room the well needed. `prefers-reduced-motion` gets the still frame instead of the loop.");
570
501
  {
571
502
  const table = el(g.list, "div", "bs-sticks");
572
503
  const CASES = [
@@ -575,23 +506,21 @@ export function mountUiShowcase(host, opts = {}) {
575
506
  { token: "LSTICK:up", caption: "Push up" },
576
507
  { token: "LSTICK_PRESS", caption: "CLICK the stick" },
577
508
  ];
578
- // Header row, then one row per style so each case reads down a column and each style across a row.
509
+ // Header row, then the one row of chips under it.
579
510
  el(table, "div", "bs-sticks-h", "");
580
511
  for (const c of CASES)
581
512
  el(table, "div", "bs-sticks-h", c.caption);
582
- for (const style of ["topdown", "profile", "glyph"]) {
583
- el(table, "div", "bs-sticks-name", style + (style === "profile" ? " (default)" : ""));
584
- for (const c of CASES) {
585
- const cellEl = el(table, "div", "bs-sticks-cell");
586
- // Two sizes: the real chip size, and so the shapes are legible while you decide.
587
- const chip = createInputChip(c.token, { press, stickStyle: style });
588
- stickChips.push(chip);
589
- cellEl.appendChild(chip.el);
590
- const big = createInputChip(c.token, { press, stickStyle: style });
591
- stickChips.push(big);
592
- const zoom = el(cellEl, "div", "bs-sticks-zoom");
593
- zoom.appendChild(big.el);
594
- }
513
+ el(table, "div", "bs-sticks-name", "profile (default)");
514
+ for (const c of CASES) {
515
+ const cellEl = el(table, "div", "bs-sticks-cell");
516
+ // Two sizes: the real chip size, and 2× so the motion is legible while you judge it.
517
+ const chip = createInputChip(c.token, { press });
518
+ stickChips.push(chip);
519
+ cellEl.appendChild(chip.el);
520
+ const big = createInputChip(c.token, { press });
521
+ stickChips.push(big);
522
+ const zoom = el(cellEl, "div", "bs-sticks-zoom");
523
+ zoom.appendChild(big.el);
595
524
  }
596
525
  }
597
526
  // --- STATIC VIEW: the controller map ----------------------------------
@@ -684,7 +613,7 @@ export function mountUiShowcase(host, opts = {}) {
684
613
  });
685
614
  }
686
615
  // --- GUIDED LESSON: the interactive trainer ---------------------------
687
- g.section("Guided lesson (interactive)", "One concept, two linked halves, ONE shared controller underneath — the case that named it being the trainer resistance. Each step walks three states: whitish + pulsing = “do this”, accent + pulse stops = “you're doing it”, green + ✓ = done. The prompt ALTERNATES between the two halves and builds each combination up one control at a time — the stick click lights first and STAYS lit while the shoulder joins it, then the other half takes its turn, and it loops. Completion needs a RELEASE after the combination is satisfied, so even a single control reads white blue green rather than jumping to green. Finish both and `onComplete` fires (a host would close its modal). NOTE: the shoulders are shell-owned and never reach a game — this section drives them with a stand-in merged with your own session, so latch the buttons below (or hold C + W / X) for the lesson, while any other button you press still shows on the pad (in the accent: here green is reserved for “that step is finished”).");
616
+ g.section("Guided lesson (interactive)", "One concept, two linked halves, ONE shared controller underneath — the case that named it being the trainer resistance. Each step walks three states: whitish + pulsing = “do this”, accent + pulse stops = “you're doing it”, green + ✓ = done. The prompt ALTERNATES between the two halves and builds each combination up one control at a time — the stick click lights first and STAYS lit while the shoulder joins it, then the other half takes its turn, and it loops. The STICK CLICK is the one prompt that moves: a raised white cap would be pixel-identical to a hinted round button and say nothing about what to do with your thumb, so it performs the click instead — sinking and shrinking on a loop, onto exactly the frame the “Controller (live)” pad lands on when you really click your stick, and the chip in the card overhead clicks with it at the same rate. Click it for real and the same picture goes blue. A step is DONE the moment its whole combination is held — holding all of it *is* doing it — and blue still shows up where it means something, between the first control of a combination and the last. Finish both and `onComplete` fires (a host would close its modal). NOTE: the shoulders are shell-owned and never reach a game — this section drives them with a stand-in merged with your own session, so latch the buttons below (or hold C + W / X) for the lesson, while any other button you press still shows on the pad (in the accent: here green is reserved for “that step is finished”).");
688
617
  {
689
618
  const stage = el(g.list, "div", "bs-demo");
690
619
  const status = el(g.list, "div", "bs-cap", "");
@@ -865,44 +794,6 @@ const BS_CSS = `
865
794
  /* 2x, so the shape is judgeable while the real 38px chip sits beside it for the honest size */
866
795
  .bs-sticks-zoom { transform: scale(2); transform-origin: center; width: 38px; height: 38px;
867
796
  display: flex; align-items: center; justify-content: center; margin: 0 12px; }
868
- /* ── idle-pip legibility candidates (the two "Idle pips" sections) ─────────────
869
- Every rule here targets ONLY the three idle siblings of a full diamond; the active key is untouched.
870
- "!important" is required and not laziness: makePip writes the idle tone as an INLINE "--c" on the pip,
871
- which a stylesheet cannot outrank. When one of these wins, it moves into ui/styles.ts (and its tone
872
- into INACTIVE in keycap.ts) and the !important goes away with it. */
873
- .bs-idle { display: flex; align-items: flex-end; gap: 1.4rem; }
874
- /* D1 — the face stays exactly as today; a rim draws the circle instead. */
875
- .bs-idle.d-rim .rydr-ui-pip:not(.active) {
876
- box-shadow: inset 0 0 0 1.5px rgba(255,255,255,0.5), inset 0 1px 2px rgba(0,0,0,0.5) !important; }
877
- /* D2 — no edge at all, only tone: the cheapest fix, and the one that changes the look least. */
878
- .bs-idle.d-lift .rydr-ui-pip:not(.active) { --c: #59626f !important; }
879
- /* D3 — the ring sits OUTSIDE, so the pip itself can go darker than today and still be found. */
880
- .bs-idle.d-halo .rydr-ui-pip:not(.active) {
881
- --c: #2f353e !important;
882
- box-shadow: 0 0 0 1.5px rgba(255,255,255,0.34), inset 0 1px 2px rgba(0,0,0,0.55) !important; }
883
- /* D4 — a bright top lip on a near-black face: the sibling reads as an empty socket, not a dim button. */
884
- .bs-idle.d-well .rydr-ui-pip:not(.active) {
885
- --c: #262b33 !important;
886
- box-shadow: inset 0 1.5px 0 rgba(255,255,255,0.55), inset 0 -1px 2px rgba(0,0,0,0.6) !important; }
887
- /* D5 — lit from below instead, which keeps the pressed-in feel while outlining the shape. */
888
- .bs-idle.d-edge .rydr-ui-pip:not(.active) {
889
- box-shadow: inset 0 -1.5px 0 rgba(255,255,255,0.42), 0 0 0 1px rgba(255,255,255,0.2),
890
- inset 0 1px 2px rgba(0,0,0,0.5) !important; }
891
- /* L1–L5 — the light family. The active key is already white in mono, so these trade "three dark
892
- siblings" for "one cluster", and the active pip has to carry the difference by size + lift alone. */
893
- .bs-idle.l-ghost .rydr-ui-pip:not(.active) { --c: #7c8798 !important; }
894
- .bs-idle.l-frost .rydr-ui-pip:not(.active) { --c: #aab4c2 !important; }
895
- .bs-idle.l-outline .rydr-ui-pip:not(.active) {
896
- background: rgba(255,255,255,0.06) !important;
897
- box-shadow: inset 0 0 0 2px rgba(255,255,255,0.72) !important; }
898
- .bs-idle.l-chalk .rydr-ui-pip:not(.active) {
899
- --c: #d5dbe4 !important; opacity: 0.85;
900
- background: #d5dbe4 !important; box-shadow: 0 1px 0 rgba(0,0,0,0.35) !important; }
901
- .bs-idle.l-pearl .rydr-ui-pip:not(.active) {
902
- --c: #b9c3d1 !important;
903
- box-shadow: 0 0 0 1.5px rgba(255,255,255,0.28), 0 0 8px rgba(255,255,255,0.18),
904
- inset 0 1px 2px rgba(0,0,0,0.35) !important; }
905
- .bs-cap.sub { font-weight: 600; opacity: 0.5; margin-top: -0.5rem; }
906
797
  /* the map and the demo get full-width stages: the map needs room for two callout columns beside the
907
798
  pad, and both are the components' own layout — the catalog only provides the space. */
908
799
  /* the marker stage: a positioned, clipping box standing in for a game's own play area — a marker is