@rydr/game-sdk 7.0.1 → 8.0.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 (115) hide show
  1. package/README.md +47 -4
  2. package/dist/client/PlatformClient.d.ts +14 -7
  3. package/dist/client/PlatformClient.d.ts.map +1 -1
  4. package/dist/client/PlatformClient.js.map +1 -1
  5. package/dist/difficulty/index.d.ts +141 -0
  6. package/dist/difficulty/index.d.ts.map +1 -0
  7. package/dist/difficulty/index.js +300 -0
  8. package/dist/difficulty/index.js.map +1 -0
  9. package/dist/nav/README.md +1 -1
  10. package/dist/protocol/glyphs.d.ts +7 -0
  11. package/dist/protocol/glyphs.d.ts.map +1 -1
  12. package/dist/protocol/glyphs.js +26 -0
  13. package/dist/protocol/glyphs.js.map +1 -1
  14. package/dist/protocol/version.d.ts +1 -1
  15. package/dist/protocol/version.js +1 -1
  16. package/dist/ui/README.md +143 -11
  17. package/dist/ui/action-diamond.js +1 -1
  18. package/dist/ui/action-diamond.js.map +1 -1
  19. package/dist/ui/controller/combo-demo.d.ts +74 -0
  20. package/dist/ui/controller/combo-demo.d.ts.map +1 -0
  21. package/dist/ui/controller/combo-demo.js +295 -0
  22. package/dist/ui/controller/combo-demo.js.map +1 -0
  23. package/dist/ui/controller/combo-strip.d.ts +36 -0
  24. package/dist/ui/controller/combo-strip.d.ts.map +1 -0
  25. package/dist/ui/controller/combo-strip.js +66 -0
  26. package/dist/ui/controller/combo-strip.js.map +1 -0
  27. package/dist/ui/controller/control-trainer.d.ts +132 -0
  28. package/dist/ui/controller/control-trainer.d.ts.map +1 -0
  29. package/dist/ui/controller/control-trainer.js +570 -0
  30. package/dist/ui/controller/control-trainer.js.map +1 -0
  31. package/dist/ui/controller/controller-map.d.ts +82 -0
  32. package/dist/ui/controller/controller-map.d.ts.map +1 -0
  33. package/dist/ui/controller/controller-map.js +291 -0
  34. package/dist/ui/controller/controller-map.js.map +1 -0
  35. package/dist/ui/controller/controller-pad.d.ts +122 -0
  36. package/dist/ui/controller/controller-pad.d.ts.map +1 -0
  37. package/dist/ui/controller/controller-pad.js +200 -0
  38. package/dist/ui/controller/controller-pad.js.map +1 -0
  39. package/dist/ui/controller/index.d.ts +26 -0
  40. package/dist/ui/controller/index.d.ts.map +1 -0
  41. package/dist/ui/controller/index.js +26 -0
  42. package/dist/ui/controller/index.js.map +1 -0
  43. package/dist/ui/controller/input-chip.d.ts +101 -0
  44. package/dist/ui/controller/input-chip.d.ts.map +1 -0
  45. package/dist/ui/controller/input-chip.js +323 -0
  46. package/dist/ui/controller/input-chip.js.map +1 -0
  47. package/dist/ui/controller/layouts/dualsense.d.ts +12 -0
  48. package/dist/ui/controller/layouts/dualsense.d.ts.map +1 -0
  49. package/dist/ui/controller/layouts/dualsense.js +64 -0
  50. package/dist/ui/controller/layouts/dualsense.js.map +1 -0
  51. package/dist/ui/controller/layouts/index.d.ts +20 -0
  52. package/dist/ui/controller/layouts/index.d.ts.map +1 -0
  53. package/dist/ui/controller/layouts/index.js +34 -0
  54. package/dist/ui/controller/layouts/index.js.map +1 -0
  55. package/dist/ui/controller/layouts/joycon.d.ts +21 -0
  56. package/dist/ui/controller/layouts/joycon.d.ts.map +1 -0
  57. package/dist/ui/controller/layouts/joycon.js +76 -0
  58. package/dist/ui/controller/layouts/joycon.js.map +1 -0
  59. package/dist/ui/controller/layouts/switch-pro.d.ts +12 -0
  60. package/dist/ui/controller/layouts/switch-pro.d.ts.map +1 -0
  61. package/dist/ui/controller/layouts/switch-pro.js +60 -0
  62. package/dist/ui/controller/layouts/switch-pro.js.map +1 -0
  63. package/dist/ui/controller/layouts/xbox.d.ts +11 -0
  64. package/dist/ui/controller/layouts/xbox.d.ts.map +1 -0
  65. package/dist/ui/controller/layouts/xbox.js +59 -0
  66. package/dist/ui/controller/layouts/xbox.js.map +1 -0
  67. package/dist/ui/controller/layouts/zwift.d.ts +27 -0
  68. package/dist/ui/controller/layouts/zwift.d.ts.map +1 -0
  69. package/dist/ui/controller/layouts/zwift.js +62 -0
  70. package/dist/ui/controller/layouts/zwift.js.map +1 -0
  71. package/dist/ui/controller/pad-svg.d.ts +105 -0
  72. package/dist/ui/controller/pad-svg.d.ts.map +1 -0
  73. package/dist/ui/controller/pad-svg.js +289 -0
  74. package/dist/ui/controller/pad-svg.js.map +1 -0
  75. package/dist/ui/controller/parts-map.d.ts +96 -0
  76. package/dist/ui/controller/parts-map.d.ts.map +1 -0
  77. package/dist/ui/controller/parts-map.js +187 -0
  78. package/dist/ui/controller/parts-map.js.map +1 -0
  79. package/dist/ui/controller/styles.d.ts +19 -0
  80. package/dist/ui/controller/styles.d.ts.map +1 -0
  81. package/dist/ui/controller/styles.js +364 -0
  82. package/dist/ui/controller/styles.js.map +1 -0
  83. package/dist/ui/controller/tokens.d.ts +106 -0
  84. package/dist/ui/controller/tokens.d.ts.map +1 -0
  85. package/dist/ui/controller/tokens.js +50 -0
  86. package/dist/ui/controller/tokens.js.map +1 -0
  87. package/dist/ui/controller/types.d.ts +157 -0
  88. package/dist/ui/controller/types.d.ts.map +1 -0
  89. package/dist/ui/controller/types.js +61 -0
  90. package/dist/ui/controller/types.js.map +1 -0
  91. package/dist/ui/index.d.ts +9 -1
  92. package/dist/ui/index.d.ts.map +1 -1
  93. package/dist/ui/index.js +9 -1
  94. package/dist/ui/index.js.map +1 -1
  95. package/dist/ui/keycap.d.ts +65 -20
  96. package/dist/ui/keycap.d.ts.map +1 -1
  97. package/dist/ui/keycap.js +99 -28
  98. package/dist/ui/keycap.js.map +1 -1
  99. package/dist/ui/{pause-menu.d.ts → option-menu.d.ts} +34 -24
  100. package/dist/ui/option-menu.d.ts.map +1 -0
  101. package/dist/ui/{pause-menu.js → option-menu.js} +134 -90
  102. package/dist/ui/option-menu.js.map +1 -0
  103. package/dist/ui/showcase/gallery.d.ts +13 -1
  104. package/dist/ui/showcase/gallery.d.ts.map +1 -1
  105. package/dist/ui/showcase/gallery.js.map +1 -1
  106. package/dist/ui/showcase/index.d.ts.map +1 -1
  107. package/dist/ui/showcase/index.js +265 -9
  108. package/dist/ui/showcase/index.js.map +1 -1
  109. package/dist/ui/solo-labeled-diamond.js +1 -1
  110. package/dist/ui/solo-labeled-diamond.js.map +1 -1
  111. package/dist/ui/styles.js +14 -9
  112. package/dist/ui/styles.js.map +1 -1
  113. package/package.json +5 -1
  114. package/dist/ui/pause-menu.d.ts.map +0 -1
  115. package/dist/ui/pause-menu.js.map +0 -1
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Pad layout descriptors — the DATA behind the controller drawing.
3
+ *
4
+ * One renderer ({@link buildPadSvg}) draws every controller from one of these. The alternative, a
5
+ * hand-drawn SVG per brand, would duplicate the `data-part` contract, the press/idle CSS, the stick
6
+ * group structure and the per-part titles once per brand — and every new part would have to be added
7
+ * everywhere.
8
+ *
9
+ * **Parts are keyed by POSITION, never by letter.** That is load-bearing, and it is the whole reason a
10
+ * game can hand us one action list and get a correct drawing on every controller: the canonical
11
+ * {@link ButtonName} vocabulary is positional (`DIAMOND_DOWN` *is* "the bottom button" on every
12
+ * device), but a Switch Pro prints `A` on the right and `B` on the bottom — the mirror of an Xbox pad.
13
+ * Keying by position lets the renderer stay brand-agnostic while every letter comes from
14
+ * `buttonLabel()` in `protocol/glyphs.ts`, the only module allowed to contain one.
15
+ *
16
+ * Ported from the platform shell's `pad-layouts/`, which is where this geometry was first tuned. The
17
+ * coordinate tables are deliberately unchanged so the two stay interchangeable — see the note on
18
+ * {@link PAD_BODY_PATH} about the usable interior.
19
+ */
20
+ import type { GlyphSet } from "../../protocol/glyphs.js";
21
+ /**
22
+ * Which silhouette to draw.
23
+ *
24
+ * A {@link GlyphSet} plus the shapes that need their own drawing regardless of lettering: a Joy-Con
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.
27
+ */
28
+ export type PadBrandKey = GlyphSet | "joycon";
29
+ /** Every drawable, highlightable part of a controller. Positional names only. */
30
+ export type PadPart = "dpadUp" | "dpadDown" | "dpadLeft" | "dpadRight" | "faceTop" | "faceRight" | "faceBottom" | "faceLeft" | "lb" | "rb" | "lt" | "rt" | "lstickPress" | "rstickPress" | "start" | "select" | "home";
31
+ export type PartGeom = {
32
+ kind: "circle";
33
+ cx: number;
34
+ cy: number;
35
+ r: number;
36
+ } | {
37
+ kind: "rect";
38
+ x: number;
39
+ y: number;
40
+ w: number;
41
+ h: number;
42
+ rx?: number;
43
+ } | {
44
+ kind: "path";
45
+ d: string;
46
+ };
47
+ export interface PartSpec {
48
+ geom: PartGeom;
49
+ /** Text glyph centred on the part. Omitted for parts the brand leaves blank. */
50
+ glyph?: string;
51
+ /** Vector glyph instead of text — PlayStation's ✕ ◯ ▢ △. Drawn centred on the part. */
52
+ glyphPath?: string;
53
+ /** Accessible / tooltip name, e.g. "A button (bottom)". */
54
+ label: string;
55
+ }
56
+ export interface StickSpec {
57
+ cx: number;
58
+ cy: number;
59
+ /** Recess radius and thumb-cap radius, in viewBox units. */
60
+ well: number;
61
+ cap: number;
62
+ /** Cap travel at full deflection, viewBox units. */
63
+ travel: number;
64
+ label: string;
65
+ }
66
+ export interface TriggerSpec {
67
+ geom: PartGeom;
68
+ /**
69
+ * Travel meter, filled bottom-up as the value goes 0 → 1.
70
+ *
71
+ * The platform drives this from real analog trigger travel. In *this* protocol `LT`/`RT` are plain
72
+ * clicks — `buttons.ts` says so explicitly, and protocol 27 removed the trigger axes — so the SDK
73
+ * drives it `0`/`1` from button state. The rect stays because a filled meter still reads as "held",
74
+ * and keeping the geometry identical is what lets the two sides share these tables.
75
+ */
76
+ meter: {
77
+ x: number;
78
+ y: number;
79
+ w: number;
80
+ h: number;
81
+ rx?: number;
82
+ };
83
+ glyph: string;
84
+ label: string;
85
+ }
86
+ export interface PadLayout {
87
+ brand: PadBrandKey;
88
+ /** Used in the drawing's accessible name, e.g. "Xbox-style controller". */
89
+ displayName: string;
90
+ /** SHARED across every layout so host CSS never varies and swapping brands can't reflow. */
91
+ viewBox: readonly [number, number, number, number];
92
+ body: {
93
+ d: string;
94
+ };
95
+ /**
96
+ * Everything below the face buttons is OPTIONAL, because not every controller has it and drawing a
97
+ * control the rider cannot press is worse than drawing nothing. The Zwift family is the case that
98
+ * forced this: it reports a d-pad and the four face buttons and *nothing else* — no sticks, no
99
+ * triggers, no stick clicks, no system buttons (see `layouts/zwift.ts`). The renderer skips whatever
100
+ * is absent, and `PadDriver` no-ops on it.
101
+ */
102
+ dpad?: Record<"up" | "down" | "left" | "right", PartSpec>;
103
+ face: Record<"top" | "right" | "bottom" | "left", PartSpec>;
104
+ bumpers?: {
105
+ l: PartSpec;
106
+ r: PartSpec;
107
+ };
108
+ triggers?: {
109
+ l: TriggerSpec;
110
+ r: TriggerSpec;
111
+ };
112
+ sticks?: {
113
+ l: StickSpec;
114
+ r: StickSpec;
115
+ };
116
+ system?: {
117
+ start?: PartSpec;
118
+ select?: PartSpec;
119
+ home?: PartSpec;
120
+ };
121
+ /** Non-interactive brand furniture (DualSense touchpad, Switch capture bar, Zwift handlebar). */
122
+ decor?: readonly {
123
+ geom: PartGeom;
124
+ opacity?: number;
125
+ }[];
126
+ }
127
+ /**
128
+ * Shared canvas for all layouts: `[minX, minY, width, height]`.
129
+ *
130
+ * The origin starts at **y −20**, above the shell's top edge, purely to give the shoulder row room.
131
+ * Triggers and bumpers are the only parts drawn off the body — stacked flush they read as one
132
+ * four-line block, so the negative band lets each sit clear of the other and of the shell, the way
133
+ * they're separated on the hardware.
134
+ */
135
+ export declare const PAD_VIEWBOX: readonly [number, number, number, number];
136
+ /**
137
+ * The gamepad silhouette, shared by every gamepad-shaped layout.
138
+ *
139
+ * One body, not four: the meaningful difference between brands is where the CONTROLS sit (Xbox offsets
140
+ * its sticks diagonally, DualSense puts both low and symmetric, Switch mirrors Xbox), not the outline
141
+ * — and separately hand-tuned outlines are separate chances for a control to end up drawn outside the
142
+ * shell. The two-piece devices (Joy-Con, Zwift) carry their own body path because their shape, not
143
+ * just their control placement, is genuinely different.
144
+ *
145
+ * Its usable interior, which every control must stay inside:
146
+ * top edge x 58 → 182 at y 22 — bumpers must fit within THIS, not the wider waist below
147
+ * waist x 28 → 212 around y 54 (where the face diamond and sticks sit)
148
+ * central mass down to y 98; below that only the grips, under x 30–80 and x 160–210
149
+ * Triggers are the one deliberate exception: they sit ABOVE the top edge, as on the hardware.
150
+ */
151
+ export declare const PAD_BODY_PATH: string;
152
+ /** Centre of a part, for placing its glyph and for anchoring a callout line at it. */
153
+ export declare function partCentre(g: PartGeom): {
154
+ x: number;
155
+ y: number;
156
+ };
157
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/controller/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Pad layout descriptors — the DATA behind the controller drawing.
3
+ *
4
+ * One renderer ({@link buildPadSvg}) draws every controller from one of these. The alternative, a
5
+ * hand-drawn SVG per brand, would duplicate the `data-part` contract, the press/idle CSS, the stick
6
+ * group structure and the per-part titles once per brand — and every new part would have to be added
7
+ * everywhere.
8
+ *
9
+ * **Parts are keyed by POSITION, never by letter.** That is load-bearing, and it is the whole reason a
10
+ * game can hand us one action list and get a correct drawing on every controller: the canonical
11
+ * {@link ButtonName} vocabulary is positional (`DIAMOND_DOWN` *is* "the bottom button" on every
12
+ * device), but a Switch Pro prints `A` on the right and `B` on the bottom — the mirror of an Xbox pad.
13
+ * Keying by position lets the renderer stay brand-agnostic while every letter comes from
14
+ * `buttonLabel()` in `protocol/glyphs.ts`, the only module allowed to contain one.
15
+ *
16
+ * Ported from the platform shell's `pad-layouts/`, which is where this geometry was first tuned. The
17
+ * coordinate tables are deliberately unchanged so the two stay interchangeable — see the note on
18
+ * {@link PAD_BODY_PATH} about the usable interior.
19
+ */
20
+ /**
21
+ * Shared canvas for all layouts: `[minX, minY, width, height]`.
22
+ *
23
+ * The origin starts at **y −20**, above the shell's top edge, purely to give the shoulder row room.
24
+ * Triggers and bumpers are the only parts drawn off the body — stacked flush they read as one
25
+ * four-line block, so the negative band lets each sit clear of the other and of the shell, the way
26
+ * they're separated on the hardware.
27
+ */
28
+ export const PAD_VIEWBOX = [0, -20, 240, 180];
29
+ /**
30
+ * The gamepad silhouette, shared by every gamepad-shaped layout.
31
+ *
32
+ * One body, not four: the meaningful difference between brands is where the CONTROLS sit (Xbox offsets
33
+ * its sticks diagonally, DualSense puts both low and symmetric, Switch mirrors Xbox), not the outline
34
+ * — and separately hand-tuned outlines are separate chances for a control to end up drawn outside the
35
+ * shell. The two-piece devices (Joy-Con, Zwift) carry their own body path because their shape, not
36
+ * just their control placement, is genuinely different.
37
+ *
38
+ * Its usable interior, which every control must stay inside:
39
+ * top edge x 58 → 182 at y 22 — bumpers must fit within THIS, not the wider waist below
40
+ * waist x 28 → 212 around y 54 (where the face diamond and sticks sit)
41
+ * central mass down to y 98; below that only the grips, under x 30–80 and x 160–210
42
+ * Triggers are the one deliberate exception: they sit ABOVE the top edge, as on the hardware.
43
+ */
44
+ export const PAD_BODY_PATH = "M 58 22 L 182 22 C 200 22 210 34 212 52 L 220 94 C 226 122 214 146 192 146 " +
45
+ "C 178 146 167 137 162 124 L 156 110 C 152 102 145 98 137 98 L 103 98 " +
46
+ "C 95 98 88 102 84 110 L 78 124 C 73 137 62 146 48 146 C 26 146 14 122 20 94 " +
47
+ "L 28 52 C 30 34 40 22 58 22 Z";
48
+ /** Centre of a part, for placing its glyph and for anchoring a callout line at it. */
49
+ export function partCentre(g) {
50
+ switch (g.kind) {
51
+ case "circle":
52
+ return { x: g.cx, y: g.cy };
53
+ case "rect":
54
+ return { x: g.x + g.w / 2, y: g.y + g.h / 2 };
55
+ case "path":
56
+ // Paths carry their own glyph placement; none do today. Callers that need a real centre for a
57
+ // path part should measure the rendered node instead (the map view does exactly that).
58
+ return { x: 0, y: 0 };
59
+ }
60
+ }
61
+ //# sourceMappingURL=types.js.map
@@ -0,0 +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"}
@@ -9,6 +9,13 @@
9
9
  * overlay, and the pre-assembled bar that composes both — so every game with a heat mechanic shares
10
10
  * one look and can take just the pieces it needs (a game drawing its own bar takes only the cues).
11
11
  *
12
+ * …and the **controller family** (`./controller/`), for showing a rider their whole control scheme:
13
+ * `mountControllerPad` draws the controller in their hands and lights it as they press;
14
+ * `mountControllerMap` surrounds it with action callouts joined by lines to their buttons; and
15
+ * `mountComboDemo` animates the combination one action needs. A game describes its controls once as a
16
+ * declarative `ControlAction[]` and the SDK owns the rest — which physical button that is on the
17
+ * rider's pad, the letter printed on it, the layout, and the animation.
18
+ *
12
19
  * Self-contained, like `@rydr/game-sdk/three`'s perf-overlay: it injects its own scoped `.rydr-ui-*`
13
20
  * CSS once into `<head>`, depends on no global styles or CSS variables, and pulls in no three.js — so
14
21
  * a game gets the look just by constructing a component. Wire any keycap to real input by passing the
@@ -26,6 +33,7 @@
26
33
  * ──────────────────────────────────────────────────────────────────────────────────────────────
27
34
  */
28
35
  export * from "./keycap.js";
36
+ export * from "./controller/index.js";
29
37
  export * from "./card.js";
30
38
  export * from "./action-card.js";
31
39
  export * from "./action-diamond.js";
@@ -35,7 +43,7 @@ export * from "./choice-card.js";
35
43
  export * from "./labeled-diamond.js";
36
44
  export * from "./solo-labeled-diamond.js";
37
45
  export * from "./rarity-card.js";
38
- export * from "./pause-menu.js";
46
+ export * from "./option-menu.js";
39
47
  export * from "./power-race.js";
40
48
  export * from "./admin-nav.js";
41
49
  export * from "./heat-vignette.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
package/dist/ui/index.js CHANGED
@@ -9,6 +9,13 @@
9
9
  * overlay, and the pre-assembled bar that composes both — so every game with a heat mechanic shares
10
10
  * one look and can take just the pieces it needs (a game drawing its own bar takes only the cues).
11
11
  *
12
+ * …and the **controller family** (`./controller/`), for showing a rider their whole control scheme:
13
+ * `mountControllerPad` draws the controller in their hands and lights it as they press;
14
+ * `mountControllerMap` surrounds it with action callouts joined by lines to their buttons; and
15
+ * `mountComboDemo` animates the combination one action needs. A game describes its controls once as a
16
+ * declarative `ControlAction[]` and the SDK owns the rest — which physical button that is on the
17
+ * rider's pad, the letter printed on it, the layout, and the animation.
18
+ *
12
19
  * Self-contained, like `@rydr/game-sdk/three`'s perf-overlay: it injects its own scoped `.rydr-ui-*`
13
20
  * CSS once into `<head>`, depends on no global styles or CSS variables, and pulls in no three.js — so
14
21
  * a game gets the look just by constructing a component. Wire any keycap to real input by passing the
@@ -26,6 +33,7 @@
26
33
  * ──────────────────────────────────────────────────────────────────────────────────────────────
27
34
  */
28
35
  export * from "./keycap.js";
36
+ export * from "./controller/index.js";
29
37
  export * from "./card.js";
30
38
  export * from "./action-card.js";
31
39
  export * from "./action-diamond.js";
@@ -35,7 +43,7 @@ export * from "./choice-card.js";
35
43
  export * from "./labeled-diamond.js";
36
44
  export * from "./solo-labeled-diamond.js";
37
45
  export * from "./rarity-card.js";
38
- export * from "./pause-menu.js";
46
+ export * from "./option-menu.js";
39
47
  export * from "./power-race.js";
40
48
  export * from "./admin-nav.js";
41
49
  export * from "./heat-vignette.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
@@ -2,20 +2,26 @@
2
2
  * KEYCAP — a DOM/CSS keycap of the controller face buttons (zero dependencies), so a game can show
3
3
  * "which button to press" in a consistent visual language. Two shapes:
4
4
  *
5
- * • "full" — the classic diamond: the active button enlarged + coloured, the other three small + grey.
5
+ * • "full" — the classic diamond: the active button enlarged, the other three small + grey.
6
6
  * • "solo" — light variation: JUST the active button (the idle siblings removed).
7
7
  *
8
8
  * The keycap is a small STATE MACHINE: it can pulse (the bouncing attract animation), show a pressed
9
- * sink, run a depleting COOLDOWN ring + countdown, render colored or neutral ("mono"), and hide.
9
+ * sink, run a depleting COOLDOWN ring + countdown, and hide.
10
+ *
11
+ * **Mono by default** — a white face with a dark letter, which is the RYDR look everywhere (the shell
12
+ * draws all of its own chrome that way). The per-button role hues still exist behind
13
+ * `colored: true`, for a deliberately loud isolated affordance or to show the palette itself.
10
14
  *
11
15
  * Two button families share that machine: `createKeycap` for the A/B/Y/Z face buttons (a letter on
12
16
  * the active pip) and `createDpadKeycap` for the UP/DOWN/LEFT/RIGHT directional buttons (a white
13
17
  * chevron on a steel-grey pip, rotated per direction). They differ ONLY in the face drawn and the
14
18
  * button name the press-wiring listens for; everything else is identical.
15
19
  *
16
- * A third factory, `createLabelKeycap`, covers the buttons whose printed name is a WORD rather than a
17
- * letterthe system/options button, the shoulder triggers, the stick clicks as a PILL instead of a
18
- * circle, since "Options" cannot fit in a pip sized for one glyph.
20
+ * A third factory, `createButtonKeycap`, covers what's left the system/options button, the shoulder
21
+ * triggers, the stick clicks and draws each the way the pad does: `OPTIONS` as a round pip with the
22
+ * pad's ICON (`☰` on Xbox/DualSense, `+` on a Switch Pro), since it's a small round key like the
23
+ * others; the triggers and stick clicks as a text PILL, since those are printed with a word ("LT",
24
+ * "L2", "LS") that no pip sized for one glyph could hold.
19
25
  */
20
26
  import type { ButtonName, ButtonEdge } from "../protocol/index.js";
21
27
  import { type GlyphSet } from "../protocol/glyphs.js";
@@ -40,7 +46,12 @@ export interface ButtonSource {
40
46
  export interface KeycapOptions {
41
47
  /** "solo" (default) shows only the active button; "full" shows the 4-button diamond. */
42
48
  variant?: KeycapVariant;
43
- /** Per-button hue (default true). `false` → a neutral palette (full colour can be too loud). */
49
+ /**
50
+ * Per-button hue. **Default `false` — mono** (a white face with a dark letter), which is the RYDR
51
+ * look: the shell draws every keycap in its chrome that way, so a coloured cap is the one loud key
52
+ * on the screen. Pass `true` only for a deliberately loud, isolated affordance (or to show the
53
+ * palette itself, as the showcase does).
54
+ */
44
55
  colored?: boolean;
45
56
  /** Run the bouncing pulse on the active button (default true). */
46
57
  animate?: boolean;
@@ -55,6 +66,20 @@ export interface KeycapOptions {
55
66
  * a settings screen, a showcase, a screenshot.
56
67
  */
57
68
  glyphSet?: GlyphSet;
69
+ /**
70
+ * Size multiplier for the whole keycap — pip diameter, letter, glyph and (on the pill shape) its
71
+ * height, padding and type. Default `1`.
72
+ *
73
+ * **This is the ONLY sanctioned way to make a keycap smaller.** The kit's rule against restyling
74
+ * stands: don't override the `.rydr-ui-*` sizes and never wrap a cap in `transform: scale()`, which
75
+ * leaves a full-size layout box, blurs the text and breaks any positioning done against it. This
76
+ * option resizes the real geometry instead, so layout stays honest.
77
+ *
78
+ * For **secondary** emphasis only — a hint the rider *may* use (the option menu's `Shortcut` caps ride
79
+ * at `0.65`), never a primary prompt. A prompt telling the rider what to press now stays at `1`: full
80
+ * size is what keeps it legible from a few feet away on a trainer.
81
+ */
82
+ scale?: number;
58
83
  }
59
84
  /** A bare keycap with its state setters. */
60
85
  export interface Keycap {
@@ -71,6 +96,20 @@ export interface Keycap {
71
96
  setCooldown(frac: number | null, label?: string | number): void;
72
97
  /** Per-button hue on/off. */
73
98
  setColored(on: boolean): void;
99
+ /**
100
+ * Override the pip's colour outright. `null` restores whatever {@link setColored} would give.
101
+ *
102
+ * The pip's face and its 3D shadow are both derived from one `--c` custom property, set inline — so a
103
+ * caller that needs a colour outside the per-role palette has to go through here rather than a
104
+ * stylesheet rule, which an inline value would beat. Used by the guided-lesson states in
105
+ * `controller/input-chip.ts` (whitish "do this", accent "doing it", green "done").
106
+ *
107
+ * **Optional deliberately.** `createKeycap` always provides it, but consumers WRAP this interface —
108
+ * the shell's `shellKeycaps` re-letters keycaps by rebuilding them behind a handle of this shape —
109
+ * and making it required would break every such wrapper at compile time for a method they have no
110
+ * need of. Callers must therefore treat it as absent-safe.
111
+ */
112
+ setAccent?(color: string | null): void;
74
113
  /** Disabled = the action is unavailable: flat grey, inert (no pulse/press), letter dimmed. */
75
114
  setDisabled(on: boolean): void;
76
115
  /** Hide/show the keycap. */
@@ -87,24 +126,30 @@ export interface Keycap {
87
126
  */
88
127
  export declare function createKeycap(button: DiamondButton, opts?: KeycapOptions): Keycap;
89
128
  /**
90
- * Build a keycap for a button whose printed name is a **word, not a letter** — the system/options
91
- * button (`OPTIONS` → "Menu" / "Options" / "+"), the shoulder triggers (`LT`/`RT` "LT" / "L2" / "ZL")
92
- * and the stick clicks (`LSTICK_PRESS`/`RSTICK_PRESS` "LS" / "L3" / "L").
129
+ * Build a keycap for the buttons that carry neither a face letter nor a direction — the system/options
130
+ * button (`OPTIONS`), the shoulder triggers (`LT`/`RT`) and the stick clicks
131
+ * (`LSTICK_PRESS`/`RSTICK_PRESS`) drawn the way the rider's pad actually draws them:
132
+ *
133
+ * • **`OPTIONS` → a round pip with the pad's ICON** (`☰` on Xbox/DualSense, `+` on a Switch Pro).
134
+ * It is a small round key on every pad, so it gets the same circular pip as the d-pad's chevron and
135
+ * sits in the same visual family as the face buttons.
136
+ * • **everything else → a text PILL** carrying {@link buttonLabel} ("LT" / "L2" / "ZL", "LS" / "L3"),
137
+ * because those buttons really are printed with a *word*, and no word fits a pip sized for one
138
+ * glyph. The trigger hardware isn't round either.
93
139
  *
94
- * A **pill** rather than a circular pip, because "Options" does not fit in a pip sized for one glyph.
95
- * Everything else is the pip's own language reused verbatim (raised lip, pulse, pressed sink, inert
96
- * grey), so the two shapes read as one family, and the text still comes from {@link buttonLabel} — the
97
- * rule that no letter is ever hardcoded holds here too.
140
+ * Either way the state machine is the pip's, reused verbatim (raised lip, pulse, pressed sink, inert
141
+ * grey), and nothing is hardcoded per brand: the icon comes from {@link SYSTEM_ICON} and the text from
142
+ * {@link buttonLabel}.
98
143
  *
99
- * Steel-grey by default (a system button is never the confirm/back hue), and — unlike the pip
100
- * factories — the attract pulse is **off** unless asked for: these caps label a shortcut the rider can
101
- * take, not an action being demanded of them. `setCooldown` is accepted for interface parity but draws
102
- * nothing: these buttons open menus, they don't gate timed abilities.
144
+ * Steel-grey (these are never the confirm/back hues), and — unlike the pip factories — the attract
145
+ * pulse is **off** unless asked for: these caps label a shortcut the rider *can* take, not an action
146
+ * being demanded of them. `setCooldown` is accepted for interface parity but draws nothing on the pill:
147
+ * these buttons open menus, they don't gate timed abilities.
103
148
  *
104
- * Pass a face-diamond or d-pad button here and you get its letter/arrow in a pill — legal, but prefer
105
- * {@link createKeycap} / {@link createDpadKeycap}, which draw the real button shape.
149
+ * Pass a face-diamond or d-pad button here and you get its letter in a pill — legal, but prefer
150
+ * {@link createKeycap} / {@link createDpadKeycap}, which draw those buttons' real shapes.
106
151
  */
107
- export declare function createLabelKeycap(button: ButtonName, opts?: KeycapOptions): Keycap;
152
+ export declare function createButtonKeycap(button: ButtonName, opts?: KeycapOptions): Keycap;
108
153
  /**
109
154
  * Build a bare directional (UP/DOWN/LEFT/RIGHT) keycap. Identical state machine to {@link createKeycap}
110
155
  * — solo/full, pulse, pressed, cooldown ring — only the active button shows a WHITE chevron (rotated
@@ -1 +1 @@
1
- {"version":3,"file":"keycap.d.ts","sourceRoot":"","sources":["../../src/ui/keycap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAkC,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtF,+FAA+F;AAC/F,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,CAAC;AAC7F,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACzD,sEAAsE;AACtE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAC5C,8CAA8C;AAC9C,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC;AAE3C;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC/E;AAoBD,MAAM,WAAW,aAAa;IAC5B,wFAAwF;IACxF,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,gGAAgG;IAChG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,4CAA4C;AAC5C,MAAM,WAAW,MAAM;IACrB,mDAAmD;IACnD,EAAE,EAAE,WAAW,CAAC;IAChB,uCAAuC;IACvC,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,2CAA2C;IAC3C,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAChE,6BAA6B;IAC7B,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,8FAA8F;IAC9F,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,4BAA4B;IAC5B,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;CACjB;AA0KD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CAEpF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CAoBtF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CAEjF"}
1
+ {"version":3,"file":"keycap.d.ts","sourceRoot":"","sources":["../../src/ui/keycap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAkC,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtF,+FAA+F;AAC/F,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,CAAC;AAC7F,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACzD,sEAAsE;AACtE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAC5C,8CAA8C;AAC9C,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC;AAE3C;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC/E;AAoBD,MAAM,WAAW,aAAa;IAC5B,wFAAwF;IACxF,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,4CAA4C;AAC5C,MAAM,WAAW,MAAM;IACrB,mDAAmD;IACnD,EAAE,EAAE,WAAW,CAAC;IAChB,uCAAuC;IACvC,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,2CAA2C;IAC3C,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAChE,6BAA6B;IAC7B,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACvC,8FAA8F;IAC9F,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,4BAA4B;IAC5B,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;CACjB;AA2ND;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CAEpF;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CAgCvF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CAEjF"}