@buildcores/render-client 1.0.2 → 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 +4 -4
- package/dist/BuildRenderVideo.d.ts +2 -0
- package/dist/SpriteRender.d.ts +2 -0
- package/dist/api.d.ts +18 -1
- package/dist/hooks/useSpriteRender.d.ts +12 -0
- package/dist/hooks/useSpriteScrubbing.d.ts +16 -0
- package/dist/index.d.ts +80 -89
- package/dist/index.esm.js +354 -96
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +357 -95
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +82 -24
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -37,8 +37,8 @@ function App() {
|
|
|
37
37
|
<BuildRender
|
|
38
38
|
parts={parts}
|
|
39
39
|
size={500}
|
|
40
|
-
mouseSensitivity={0.
|
|
41
|
-
touchSensitivity={0.
|
|
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.
|
|
61
|
-
| `touchSensitivity` | `number` | ❌ | `0.
|
|
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
|
|
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
|
|
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
|
-
* <
|
|
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
|
-
*
|
|
34
|
+
* Sprite size in pixels (width and height will be the same).
|
|
49
35
|
*
|
|
50
|
-
* This determines the
|
|
51
|
-
*
|
|
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
|
-
* <
|
|
56
|
-
* <
|
|
57
|
-
* <
|
|
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.
|
|
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
|
-
* @
|
|
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.
|
|
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
|
|
60
|
+
* Generally set similar to mouseSensitivity for consistent experience.
|
|
95
61
|
*
|
|
96
|
-
* @
|
|
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
|
|
132
|
+
* @example Sprite format request
|
|
192
133
|
* ```tsx
|
|
193
|
-
* const
|
|
134
|
+
* const spriteRequest: RenderBuildRequest = {
|
|
194
135
|
* parts: {
|
|
195
|
-
* CPU: ["
|
|
196
|
-
* GPU: ["
|
|
197
|
-
* RAM: ["
|
|
198
|
-
* Motherboard: ["
|
|
199
|
-
*
|
|
200
|
-
*
|
|
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 };
|