@ksteinstudio/game-controller 1.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.
@@ -0,0 +1,272 @@
1
+ interface Position {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ interface ElementStyle {
6
+ color?: string;
7
+ opacity?: number;
8
+ scale?: number;
9
+ borderColor?: string;
10
+ borderWidth?: number;
11
+ fontSize?: number;
12
+ fontFamily?: string;
13
+ }
14
+ interface BaseElement {
15
+ id: string;
16
+ type: 'button' | 'joystick' | 'dpad' | 'slider';
17
+ position: Position;
18
+ zIndex: number;
19
+ style?: ElementStyle;
20
+ }
21
+ interface ButtonElement extends BaseElement {
22
+ type: 'button';
23
+ label?: string;
24
+ shape: 'circle' | 'square';
25
+ size: number;
26
+ actionKey: string;
27
+ }
28
+ interface JoystickElement extends BaseElement {
29
+ type: 'joystick';
30
+ radius: number;
31
+ innerStickSize: number;
32
+ deadzone: number;
33
+ mode: 'static' | 'floating';
34
+ }
35
+ interface DpadElement extends BaseElement {
36
+ type: 'dpad';
37
+ size: number;
38
+ actionKeys?: {
39
+ up: string;
40
+ down: string;
41
+ left: string;
42
+ right: string;
43
+ };
44
+ }
45
+ interface SliderElement extends BaseElement {
46
+ type: 'slider';
47
+ length: number;
48
+ orientation: 'horizontal' | 'vertical';
49
+ actionKey: string;
50
+ }
51
+ type ControllerElement = ButtonElement | JoystickElement | DpadElement | SliderElement;
52
+ interface CanvasSettings {
53
+ aspectRatio: string;
54
+ backgroundColor?: string;
55
+ gridDensity?: number;
56
+ }
57
+ interface ControllerConfig {
58
+ version: string;
59
+ name: string;
60
+ canvas: CanvasSettings;
61
+ elements: ControllerElement[];
62
+ }
63
+
64
+ declare const enum MessageType {
65
+ CONFIG_LOAD = "CONFIG_LOAD",
66
+ INPUT_START = "INPUT_START",
67
+ INPUT_END = "INPUT_END",
68
+ JOYSTICK_MOVE = "JOYSTICK_MOVE",
69
+ DPAD_PRESS = "DPAD_PRESS",
70
+ DPAD_RELEASE = "DPAD_RELEASE",
71
+ SLIDER_CHANGE = "SLIDER_CHANGE",
72
+ RENDERER_READY = "RENDERER_READY",
73
+ CONFIG_UPDATE = "CONFIG_UPDATE"
74
+ }
75
+ interface Vector2D {
76
+ x: number;
77
+ y: number;
78
+ }
79
+ interface ConfigLoadMessage {
80
+ type: MessageType.CONFIG_LOAD;
81
+ payload: ControllerConfig;
82
+ }
83
+ interface InputStartMessage {
84
+ type: MessageType.INPUT_START;
85
+ payload: {
86
+ elementId: string;
87
+ actionKey: string;
88
+ timestamp: number;
89
+ };
90
+ }
91
+ interface InputEndMessage {
92
+ type: MessageType.INPUT_END;
93
+ payload: {
94
+ elementId: string;
95
+ actionKey: string;
96
+ timestamp: number;
97
+ };
98
+ }
99
+ interface JoystickMoveMessage {
100
+ type: MessageType.JOYSTICK_MOVE;
101
+ payload: {
102
+ elementId: string;
103
+ vector: Vector2D;
104
+ angle: number;
105
+ magnitude: number;
106
+ timestamp: number;
107
+ };
108
+ }
109
+ interface DpadPressMessage {
110
+ type: MessageType.DPAD_PRESS;
111
+ payload: {
112
+ elementId: string;
113
+ direction: 'up' | 'down' | 'left' | 'right';
114
+ actionKey: string;
115
+ timestamp: number;
116
+ };
117
+ }
118
+ interface DpadReleaseMessage {
119
+ type: MessageType.DPAD_RELEASE;
120
+ payload: {
121
+ elementId: string;
122
+ direction: 'up' | 'down' | 'left' | 'right';
123
+ actionKey: string;
124
+ timestamp: number;
125
+ };
126
+ }
127
+ interface SliderChangeMessage {
128
+ type: MessageType.SLIDER_CHANGE;
129
+ payload: {
130
+ elementId: string;
131
+ actionKey: string;
132
+ value: number;
133
+ timestamp: number;
134
+ };
135
+ }
136
+ interface RendererReadyMessage {
137
+ type: MessageType.RENDERER_READY;
138
+ }
139
+ interface ConfigUpdateMessage {
140
+ type: MessageType.CONFIG_UPDATE;
141
+ payload: ControllerConfig;
142
+ }
143
+ type ControllerMessage = ConfigLoadMessage | InputStartMessage | InputEndMessage | JoystickMoveMessage | DpadPressMessage | DpadReleaseMessage | SliderChangeMessage | RendererReadyMessage | ConfigUpdateMessage;
144
+ type InputEvent = InputStartMessage | InputEndMessage | JoystickMoveMessage | DpadPressMessage | DpadReleaseMessage | SliderChangeMessage;
145
+
146
+ type MessageHandler = (message: ControllerMessage) => void;
147
+ declare function createParentBridge(iframe: HTMLIFrameElement): {
148
+ sendConfig(config: ControllerConfig): void;
149
+ updateConfig(config: ControllerConfig): void;
150
+ onMessage(handler: MessageHandler): () => boolean;
151
+ onInput(handler: (event: InputEvent) => void): () => boolean;
152
+ destroy(): void;
153
+ };
154
+ declare function createIframeBridge(): {
155
+ emitControllerEvent(message: ControllerMessage): void;
156
+ emitInputStart(elementId: string, actionKey: string): void;
157
+ emitInputEnd(elementId: string, actionKey: string): void;
158
+ emitJoystickMove(elementId: string, x: number, y: number, angle: number, magnitude: number): void;
159
+ emitDpadPress(elementId: string, direction: "up" | "down" | "left" | "right", actionKey: string): void;
160
+ emitDpadRelease(elementId: string, direction: "up" | "down" | "left" | "right", actionKey: string): void;
161
+ emitSliderChange(elementId: string, actionKey: string, value: number): void;
162
+ signalReady(): void;
163
+ onMessage(handler: MessageHandler): () => boolean;
164
+ destroy(): void;
165
+ };
166
+ type ParentBridge = ReturnType<typeof createParentBridge>;
167
+ type IframeBridge = ReturnType<typeof createIframeBridge>;
168
+
169
+ declare function snapToGrid(value: number, gridDensity: number): number;
170
+ declare function snapPositionToGrid(position: Position, gridDensity: number): Position;
171
+ declare function pixelToPercentage(pixelValue: number, containerSize: number): number;
172
+ declare function percentageToPixel(percentageValue: number, containerSize: number): number;
173
+ declare function convertPixelPositionToPercentage(pixelX: number, pixelY: number, containerWidth: number, containerHeight: number): Position;
174
+ declare function convertPercentagePositionToPixel(position: Position, containerWidth: number, containerHeight: number): {
175
+ x: number;
176
+ y: number;
177
+ };
178
+ declare function clampPercentage(value: number): number;
179
+ declare function clamp(value: number, min: number, max: number): number;
180
+ declare function distance(a: Position, b: Position): number;
181
+ declare function normalizeVector(x: number, y: number): {
182
+ x: number;
183
+ y: number;
184
+ magnitude: number;
185
+ };
186
+ declare function angleFromVector(x: number, y: number): number;
187
+ declare function applyDeadzone(value: number, deadzone: number): number;
188
+ declare function applyDeadzoneToVector(x: number, y: number, deadzone: number): {
189
+ x: number;
190
+ y: number;
191
+ };
192
+ declare function parseAspectRatio(aspectRatio: string): {
193
+ width: number;
194
+ height: number;
195
+ };
196
+ declare function calculateCanvasDimensions(containerWidth: number, containerHeight: number, aspectRatio: string): {
197
+ width: number;
198
+ height: number;
199
+ offsetX: number;
200
+ offsetY: number;
201
+ };
202
+
203
+ interface AlignmentGuide {
204
+ axis: 'horizontal' | 'vertical';
205
+ position: number;
206
+ sourceElementId: string;
207
+ targetElementId: string;
208
+ }
209
+ interface SnapResult {
210
+ position: Position;
211
+ guides: AlignmentGuide[];
212
+ }
213
+ declare function findAlignmentGuides(draggedElement: ControllerElement, dragPosition: Position, otherElements: ControllerElement[], threshold?: number): SnapResult;
214
+ declare function generateGridLines(gridDensity: number): number[];
215
+
216
+ interface ButtonRenderContext {
217
+ element: ButtonElement;
218
+ canvasWidth: number;
219
+ canvasHeight: number;
220
+ onInputStart: (elementId: string, actionKey: string) => void;
221
+ onInputEnd: (elementId: string, actionKey: string) => void;
222
+ }
223
+ declare function createButtonElement(context: ButtonRenderContext): HTMLElement;
224
+ declare function updateButtonElement(container: HTMLElement, element: ButtonElement, canvasWidth: number, canvasHeight: number): void;
225
+
226
+ interface JoystickRenderContext {
227
+ element: JoystickElement;
228
+ canvasWidth: number;
229
+ canvasHeight: number;
230
+ onJoystickMove: (elementId: string, vector: Vector2D, angle: number, magnitude: number) => void;
231
+ }
232
+ declare function createJoystickElement(context: JoystickRenderContext): HTMLElement;
233
+ declare function updateJoystickElement(container: HTMLElement, element: JoystickElement, canvasWidth: number, canvasHeight: number): void;
234
+
235
+ interface DpadRenderContext {
236
+ element: DpadElement;
237
+ canvasWidth: number;
238
+ canvasHeight: number;
239
+ onDpadPress: (elementId: string, direction: 'up' | 'down' | 'left' | 'right', actionKey: string) => void;
240
+ onDpadRelease: (elementId: string, direction: 'up' | 'down' | 'left' | 'right', actionKey: string) => void;
241
+ }
242
+ declare function createDpadElement(context: DpadRenderContext): HTMLElement;
243
+ declare function updateDpadElement(container: HTMLElement, element: DpadElement, canvasWidth: number, canvasHeight: number): void;
244
+
245
+ interface RendererState {
246
+ config: ControllerConfig | null;
247
+ canvas: HTMLElement | null;
248
+ elementMap: Map<string, HTMLElement>;
249
+ bridge: IframeBridge;
250
+ resizeObserver: ResizeObserver | null;
251
+ }
252
+ declare function initializeRenderer(rootElement: HTMLElement): RendererState;
253
+ declare function renderControllerFromConfig(rootElement: HTMLElement, config: ControllerConfig): RendererState;
254
+ declare function destroyRenderer(state: RendererState): void;
255
+
256
+ interface ControllerSDKOptions {
257
+ config: ControllerConfig;
258
+ container: HTMLElement;
259
+ iframeSrc?: string;
260
+ onInput?: (event: InputEvent) => void;
261
+ onReady?: () => void;
262
+ width?: string;
263
+ height?: string;
264
+ }
265
+ interface ControllerSDKInstance {
266
+ updateConfig: (config: ControllerConfig) => void;
267
+ destroy: () => void;
268
+ getIframe: () => HTMLIFrameElement;
269
+ }
270
+ declare function createControllerSDK(options: ControllerSDKOptions): ControllerSDKInstance;
271
+
272
+ export { type AlignmentGuide, type BaseElement, type ButtonElement, type ButtonRenderContext, type CanvasSettings, type ConfigLoadMessage, type ConfigUpdateMessage, type ControllerConfig, type ControllerElement, type ControllerMessage, type ControllerSDKInstance, type ControllerSDKOptions, type DpadElement, type DpadPressMessage, type DpadReleaseMessage, type DpadRenderContext, type ElementStyle, type IframeBridge, type InputEndMessage, type InputEvent, type InputStartMessage, type JoystickElement, type JoystickMoveMessage, type JoystickRenderContext, MessageType, type ParentBridge, type Position, type RendererReadyMessage, type SliderChangeMessage, type SliderElement, type SnapResult, type Vector2D, angleFromVector, applyDeadzone, applyDeadzoneToVector, calculateCanvasDimensions, clamp, clampPercentage, convertPercentagePositionToPixel, convertPixelPositionToPercentage, createButtonElement, createControllerSDK, createDpadElement, createIframeBridge, createJoystickElement, createParentBridge, destroyRenderer, distance, findAlignmentGuides, generateGridLines, initializeRenderer, normalizeVector, parseAspectRatio, percentageToPixel, pixelToPercentage, renderControllerFromConfig, snapPositionToGrid, snapToGrid, updateButtonElement, updateDpadElement, updateJoystickElement };