@buildcores/render-client 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -37,8 +37,8 @@ function App() {
37
37
  <BuildRender
38
38
  parts={parts}
39
39
  size={500}
40
- mouseSensitivity={0.01}
41
- touchSensitivity={0.01}
40
+ mouseSensitivity={0.2}
41
+ touchSensitivity={0.2}
42
42
  />
43
43
  </div>
44
44
  );
@@ -57,8 +57,8 @@ The main React component for rendering interactive 3D PC builds.
57
57
  | ------------------ | -------------------- | -------- | ------- | ---------------------------------------- |
58
58
  | `parts` | `RenderBuildRequest` | ✅ | - | PC parts configuration object |
59
59
  | `size` | `number` | ✅ | - | Video size in pixels (square dimensions) |
60
- | `mouseSensitivity` | `number` | ❌ | `0.01` | Mouse drag sensitivity (0.001-0.1) |
61
- | `touchSensitivity` | `number` | ❌ | `0.01` | Touch drag sensitivity (0.001-0.1) |
60
+ | `mouseSensitivity` | `number` | ❌ | `0.2` | Mouse drag sensitivity (0.001-1) |
61
+ | `touchSensitivity` | `number` | ❌ | `0.2` | Touch drag sensitivity (0.001-1) |
62
62
 
63
63
  #### Parts Configuration
64
64
 
@@ -0,0 +1,2 @@
1
+ import { BuildRenderVideoProps } from "./types";
2
+ export declare const BuildRenderVideo: React.FC<BuildRenderVideoProps>;
@@ -0,0 +1,2 @@
1
+ import { SpriteRenderProps } from "./types";
2
+ export declare const SpriteRender: React.FC<SpriteRenderProps>;
package/dist/api.d.ts CHANGED
@@ -6,7 +6,7 @@ export declare const API_ENDPOINTS: {
6
6
  };
7
7
  export interface RenderBuildResponse {
8
8
  /**
9
- * The rendered MP4 video as a Blob
9
+ * The rendered MP4 video as a Blob (when format is "video")
10
10
  */
11
11
  video: Blob;
12
12
  /**
@@ -18,6 +18,22 @@ export interface RenderBuildResponse {
18
18
  format?: string;
19
19
  };
20
20
  }
21
+ export interface RenderSpriteResponse {
22
+ /**
23
+ * The rendered sprite sheet as a Blob (when format is "sprite")
24
+ */
25
+ sprite: Blob;
26
+ /**
27
+ * Sprite sheet metadata
28
+ */
29
+ metadata?: {
30
+ cols?: number;
31
+ rows?: number;
32
+ totalFrames?: number;
33
+ size?: number;
34
+ format?: string;
35
+ };
36
+ }
21
37
  export interface RenderAPIService {
22
38
  /**
23
39
  * Submit a render build request
@@ -33,5 +49,6 @@ export interface RenderAPIService {
33
49
  }
34
50
  export declare const buildApiUrl: (endpoint: string) => string;
35
51
  export declare const renderBuildExperimental: (request: RenderBuildRequest) => Promise<RenderBuildResponse>;
52
+ export declare const renderSpriteExperimental: (request: RenderBuildRequest) => Promise<RenderSpriteResponse>;
36
53
  export declare const getAvailableParts: () => Promise<AvailablePartsResponse>;
37
54
  export { API_BASE_URL };
@@ -0,0 +1,12 @@
1
+ import { RenderBuildRequest } from "../types";
2
+ export interface UseSpriteRenderReturn {
3
+ spriteSrc: string | null;
4
+ isRenderingSprite: boolean;
5
+ renderError: string | null;
6
+ spriteMetadata: {
7
+ cols: number;
8
+ rows: number;
9
+ totalFrames: number;
10
+ } | null;
11
+ }
12
+ export declare const useSpriteRender: (parts: RenderBuildRequest, onLoadStart?: () => void) => UseSpriteRenderReturn;
@@ -0,0 +1,16 @@
1
+ import { type RefObject } from "react";
2
+ export declare const calculateCircularFrame: (startFrame: number, deltaX: number, sensitivity: number, totalFrames: number) => number;
3
+ interface UseSpiteScrubbingOptions {
4
+ mouseSensitivity?: number;
5
+ touchSensitivity?: number;
6
+ onFrameChange?: (frame: number) => void;
7
+ }
8
+ export declare const useSpriteScrubbing: (canvasRef: RefObject<HTMLCanvasElement | null>, totalFrames: number, options?: UseSpiteScrubbingOptions) => {
9
+ isDragging: boolean;
10
+ handleMouseDown: (e: React.MouseEvent) => void;
11
+ handleTouchStart: (e: React.TouchEvent) => void;
12
+ hasDragged: import("react").MutableRefObject<boolean>;
13
+ currentFrame: number;
14
+ setCurrentFrame: (frame: number) => void;
15
+ };
16
+ export {};
package/dist/index.d.ts CHANGED
@@ -3,9 +3,9 @@ import React__default, { RefObject } from 'react';
3
3
 
4
4
  interface BuildRenderProps {
5
5
  /**
6
- * Parts configuration for the build render.
6
+ * Parts configuration for the sprite render.
7
7
  *
8
- * This object defines which PC components should be included in the 3D render.
8
+ * This object defines which PC components should be included in the 3D sprite render.
9
9
  * Each part category contains an array with a single part ID that will be rendered.
10
10
  *
11
11
  * **Current Limitation**: Only 1 part per category is supported. Arrays must contain
@@ -26,89 +26,40 @@ interface BuildRenderProps {
26
26
  * }
27
27
  * };
28
28
  *
29
- * <BuildRender parts={parts} size={300} />
29
+ * <SpriteRender parts={parts} size={300} />
30
30
  * ```
31
- *
32
- * @example Minimal build (only required components)
33
- * ```tsx
34
- * const parts = {
35
- * parts: {
36
- * CPU: ["7xjqsomhr"], // Single CPU required
37
- * Motherboard: ["iwin2u9vx"], // Single motherboard required
38
- * PCCase: ["qq9jamk7c"], // Single case required
39
- * }
40
- * };
41
- * ```
42
- *
43
- * Note: Part IDs must correspond to valid components in the BuildCores database.
44
- * Use the available parts API to get valid part IDs for each category.
45
31
  */
46
32
  parts: RenderBuildRequest;
47
33
  /**
48
- * Video size in pixels (width and height will be the same).
34
+ * Sprite size in pixels (width and height will be the same).
49
35
  *
50
- * This determines the resolution of the rendered 3D video. Higher values
51
- * provide better quality but may impact performance.
36
+ * This determines the display size of the rendered 3D sprite. The sprite sheet
37
+ * itself is rendered at a fixed resolution, but this controls the display size.
52
38
  *
53
39
  * @example
54
40
  * ```tsx
55
- * <BuildRender parts={parts} size={300} /> // 300x300px
56
- * <BuildRender parts={parts} size={500} /> // 500x500px
57
- * <BuildRender parts={parts} size={800} /> // 800x800px - high quality
41
+ * <SpriteRender parts={parts} size={300} /> // 300x300px
42
+ * <SpriteRender parts={parts} size={500} /> // 500x500px
43
+ * <SpriteRender parts={parts} size={800} /> // 800x800px - larger display
58
44
  * ```
59
- *
60
- * Recommended sizes:
61
- * - 300px: Good for thumbnails or small previews
62
- * - 500px: Standard size for most use cases
63
- * - 800px+: High quality for detailed viewing
64
45
  */
65
46
  size: number;
66
47
  /**
67
- * Optional mouse sensitivity for dragging (default: 0.005).
48
+ * Optional mouse sensitivity for dragging (default: 0.05).
68
49
  *
69
50
  * Controls how responsive the 3D model rotation is to mouse movements.
70
51
  * Lower values make rotation slower and more precise, higher values make it faster.
71
52
  *
72
- * @example
73
- * ```tsx
74
- * <BuildRender
75
- * parts={parts}
76
- * size={300}
77
- * mouseSensitivity={0.003} // Slower, more precise
78
- * />
79
- *
80
- * <BuildRender
81
- * parts={parts}
82
- * size={300}
83
- * mouseSensitivity={0.01} // Faster rotation
84
- * />
85
- * ```
86
- *
87
- * @default 0.005
53
+ * @default 0.2
88
54
  */
89
55
  mouseSensitivity?: number;
90
56
  /**
91
- * Optional touch sensitivity for dragging (default: 0.01).
57
+ * Optional touch sensitivity for dragging (default: 0.02).
92
58
  *
93
59
  * Controls how responsive the 3D model rotation is to touch gestures on mobile devices.
94
- * Generally set higher than mouseSensitivity for better touch experience.
60
+ * Generally set similar to mouseSensitivity for consistent experience.
95
61
  *
96
- * @example
97
- * ```tsx
98
- * <BuildRender
99
- * parts={parts}
100
- * size={300}
101
- * touchSensitivity={0.008} // Slower touch rotation
102
- * />
103
- *
104
- * <BuildRender
105
- * parts={parts}
106
- * size={300}
107
- * touchSensitivity={0.015} // Faster touch rotation
108
- * />
109
- * ```
110
- *
111
- * @default 0.01
62
+ * @default 0.2
112
63
  */
113
64
  touchSensitivity?: number;
114
65
  }
@@ -173,34 +124,21 @@ declare enum PartCategory {
173
124
  * Storage: ["0bkvs17po"], // SAMSUNG 990 EVO
174
125
  * PCCase: ["qq9jamk7c"], // MONTECH KING 95 PRO
175
126
  * CPUCooler: ["62d8zelr5"], // ARCTIC LIQUID FREEZER 360
176
- * }
177
- * };
178
- * ```
179
- *
180
- * @example Minimal build (only required components)
181
- * ```tsx
182
- * const minimalBuild: RenderBuildRequest = {
183
- * parts: {
184
- * CPU: ["7xjqsomhr"], // Single CPU
185
- * Motherboard: ["iwin2u9vx"], // Single motherboard
186
- * PCCase: ["qq9jamk7c"], // Single case
187
- * }
127
+ * },
128
+ * format: "video" // Request video format
188
129
  * };
189
130
  * ```
190
131
  *
191
- * @example Gaming build configuration
132
+ * @example Sprite format request
192
133
  * ```tsx
193
- * const gamingBuild: RenderBuildRequest = {
134
+ * const spriteRequest: RenderBuildRequest = {
194
135
  * parts: {
195
- * CPU: ["x2thvstj3"], // AMD Ryzen 7 9700X
196
- * GPU: ["4a0mjb360"], // PNY GeForce RTX 5060 Ti 16GB
197
- * RAM: ["46rwpop35"], // G.SKILL NEO RGB DDR5
198
- * Motherboard: ["xy81tonxw"], // Asus ROG STRIX B850-A GAMING WIFI
199
- * PSU: ["v0qv6k9dp"], // MSI 850W
200
- * Storage: ["0bs8cxv4c"], // CORSAIR T500
201
- * PCCase: ["kb76dp9aw"], // LIAN LI O11 VISION
202
- * CPUCooler: ["0vajcxkzq"], // BE QUIET PURE ROCK 2 AIR
203
- * }
136
+ * CPU: ["7xjqsomhr"], // AMD Ryzen 7 9800X3D
137
+ * GPU: ["z7pyphm9k"], // ASUS GeForce RTX 5080 ASTRAL
138
+ * RAM: ["dpl1iyvb5"], // PNY DDR5
139
+ * Motherboard: ["iwin2u9vx"], // Asus ROG STRIX X870E-E GAMING WIFI
140
+ * },
141
+ * format: "sprite" // Request sprite sheet format
204
142
  * };
205
143
  * ```
206
144
  */
@@ -222,6 +160,15 @@ interface RenderBuildRequest {
222
160
  parts: {
223
161
  [K in PartCategory]?: string[];
224
162
  };
163
+ /**
164
+ * Output format for the rendered build.
165
+ *
166
+ * - "video": Returns an MP4 video file for video-based 360° rotation
167
+ * - "sprite": Returns a sprite sheet image for frame-based 360° rotation
168
+ *
169
+ * @default "video"
170
+ */
171
+ format?: "video" | "sprite";
225
172
  }
226
173
  /**
227
174
  * Response structure containing all available parts for each category.
@@ -300,6 +247,21 @@ declare const useVideoScrubbing: (videoRef: RefObject<HTMLVideoElement | null>,
300
247
  hasDragged: React$1.MutableRefObject<boolean>;
301
248
  };
302
249
 
250
+ declare const calculateCircularFrame: (startFrame: number, deltaX: number, sensitivity: number, totalFrames: number) => number;
251
+ interface UseSpiteScrubbingOptions {
252
+ mouseSensitivity?: number;
253
+ touchSensitivity?: number;
254
+ onFrameChange?: (frame: number) => void;
255
+ }
256
+ declare const useSpriteScrubbing: (canvasRef: RefObject<HTMLCanvasElement | null>, totalFrames: number, options?: UseSpiteScrubbingOptions) => {
257
+ isDragging: boolean;
258
+ handleMouseDown: (e: React.MouseEvent) => void;
259
+ handleTouchStart: (e: React.TouchEvent) => void;
260
+ hasDragged: React$1.MutableRefObject<boolean>;
261
+ currentFrame: number;
262
+ setCurrentFrame: (frame: number) => void;
263
+ };
264
+
303
265
  declare function useBouncePatternProgress(enabled?: boolean): {
304
266
  value: number;
305
267
  isBouncing: boolean;
@@ -317,6 +279,18 @@ interface UseBuildRenderReturn {
317
279
  }
318
280
  declare const useBuildRender: (parts: RenderBuildRequest, onLoadStart?: () => void) => UseBuildRenderReturn;
319
281
 
282
+ interface UseSpriteRenderReturn {
283
+ spriteSrc: string | null;
284
+ isRenderingSprite: boolean;
285
+ renderError: string | null;
286
+ spriteMetadata: {
287
+ cols: number;
288
+ rows: number;
289
+ totalFrames: number;
290
+ } | null;
291
+ }
292
+ declare const useSpriteRender: (parts: RenderBuildRequest, onLoadStart?: () => void) => UseSpriteRenderReturn;
293
+
320
294
  interface DragIconProps {
321
295
  width?: number;
322
296
  height?: number;
@@ -346,7 +320,7 @@ declare const API_ENDPOINTS: {
346
320
  };
347
321
  interface RenderBuildResponse {
348
322
  /**
349
- * The rendered MP4 video as a Blob
323
+ * The rendered MP4 video as a Blob (when format is "video")
350
324
  */
351
325
  video: Blob;
352
326
  /**
@@ -358,6 +332,22 @@ interface RenderBuildResponse {
358
332
  format?: string;
359
333
  };
360
334
  }
335
+ interface RenderSpriteResponse {
336
+ /**
337
+ * The rendered sprite sheet as a Blob (when format is "sprite")
338
+ */
339
+ sprite: Blob;
340
+ /**
341
+ * Sprite sheet metadata
342
+ */
343
+ metadata?: {
344
+ cols?: number;
345
+ rows?: number;
346
+ totalFrames?: number;
347
+ size?: number;
348
+ format?: string;
349
+ };
350
+ }
361
351
  interface RenderAPIService {
362
352
  /**
363
353
  * Submit a render build request
@@ -373,7 +363,8 @@ interface RenderAPIService {
373
363
  }
374
364
  declare const buildApiUrl: (endpoint: string) => string;
375
365
  declare const renderBuildExperimental: (request: RenderBuildRequest) => Promise<RenderBuildResponse>;
366
+ declare const renderSpriteExperimental: (request: RenderBuildRequest) => Promise<RenderSpriteResponse>;
376
367
  declare const getAvailableParts: () => Promise<AvailablePartsResponse>;
377
368
 
378
- export { API_BASE_URL, API_ENDPOINTS, BuildRender, DragIcon, InstructionTooltip, LoadingErrorOverlay, PartCategory, arePartsEqual, buildApiUrl, calculateCircularTime, getAvailableParts, renderBuildExperimental, useBouncePatternProgress, useBuildRender, useVideoScrubbing };
379
- export type { AvailablePartsResponse, BuildRenderProps, PartDetails, RenderAPIService, RenderBuildRequest, RenderBuildResponse, UseBuildRenderReturn };
369
+ export { API_BASE_URL, API_ENDPOINTS, BuildRender, DragIcon, InstructionTooltip, LoadingErrorOverlay, PartCategory, arePartsEqual, buildApiUrl, calculateCircularFrame, calculateCircularTime, getAvailableParts, renderBuildExperimental, renderSpriteExperimental, useBouncePatternProgress, useBuildRender, useSpriteRender, useSpriteScrubbing, useVideoScrubbing };
370
+ export type { AvailablePartsResponse, BuildRenderProps, PartDetails, RenderAPIService, RenderBuildRequest, RenderBuildResponse, RenderSpriteResponse, UseBuildRenderReturn, UseSpriteRenderReturn };