@pose-tracker/pose-estimation-web-react 0.1.0 → 0.2.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.
package/dist/index.cjs CHANGED
@@ -76,6 +76,12 @@ function PoseTrackerProvider({
76
76
  (model, modelUrl) => client.setModel(model, modelUrl),
77
77
  [client]
78
78
  );
79
+ const setSource = react.useCallback(
80
+ (...args) => client.setSource(...args),
81
+ [client]
82
+ );
83
+ const analyze = react.useCallback(() => client.analyze(), [client]);
84
+ const getSource = react.useCallback(() => client.getSource(), [client]);
79
85
  const getAvailableExercises = react.useCallback(() => client.getAvailableExercises(), [client]);
80
86
  const getAvailableCustomExercises = react.useCallback(
81
87
  () => client.getAvailableCustomExercises(),
@@ -106,6 +112,9 @@ function PoseTrackerProvider({
106
112
  startExercise,
107
113
  stopExercise,
108
114
  setModel,
115
+ setSource,
116
+ analyze,
117
+ getSource,
109
118
  getAvailableExercises,
110
119
  getAvailableCustomExercises,
111
120
  addEventListener,
@@ -127,6 +136,9 @@ function PoseTrackerProvider({
127
136
  startExercise,
128
137
  stopExercise,
129
138
  setModel,
139
+ setSource,
140
+ analyze,
141
+ getSource,
130
142
  getAvailableExercises,
131
143
  getAvailableCustomExercises,
132
144
  addEventListener,
@@ -150,6 +162,9 @@ function PoseCamera({
150
162
  style,
151
163
  className,
152
164
  position,
165
+ source,
166
+ sourceUrl,
167
+ sourceFile,
153
168
  drawSkeleton,
154
169
  drawPlacementBox,
155
170
  placementPaddingPercent,
@@ -170,6 +185,9 @@ function PoseCamera({
170
185
  if (!el) return;
171
186
  client.updateOptions({
172
187
  ...position ? { position } : {},
188
+ ...source !== void 0 ? { source } : {},
189
+ ...sourceUrl !== void 0 ? { sourceUrl } : {},
190
+ ...sourceFile !== void 0 ? { sourceFile } : {},
173
191
  ...typeof drawSkeleton === "boolean" ? { drawSkeleton } : {},
174
192
  ...typeof drawPlacementBox === "boolean" ? { drawPlacementBox } : {},
175
193
  ...typeof placementPaddingPercent === "number" ? { placementPaddingPercent } : {},
@@ -184,7 +202,13 @@ function PoseCamera({
184
202
  const shouldStart = autoStartProp ?? providerAutoStart;
185
203
  if (shouldStart && !startedRef.current) {
186
204
  startedRef.current = true;
187
- client.start().catch(() => {
205
+ const boot = async () => {
206
+ if (source !== void 0) {
207
+ await client.setSource(source, { sourceUrl, sourceFile });
208
+ }
209
+ await client.start();
210
+ };
211
+ boot().catch(() => {
188
212
  });
189
213
  }
190
214
  return () => {
@@ -193,6 +217,11 @@ function PoseCamera({
193
217
  _registerMountHost(null);
194
218
  };
195
219
  }, [client]);
220
+ react.useEffect(() => {
221
+ if (!startedRef.current || source === void 0) return;
222
+ void client.setSource(source, { sourceUrl, sourceFile }).catch(() => {
223
+ });
224
+ }, [client, source, sourceUrl, sourceFile]);
196
225
  return /* @__PURE__ */ jsxRuntime.jsx(
197
226
  "div",
198
227
  {
@@ -320,6 +349,10 @@ Object.defineProperty(exports, "createPoseTracker", {
320
349
  enumerable: true,
321
350
  get: function () { return poseEstimationWeb.createPoseTracker; }
322
351
  });
352
+ Object.defineProperty(exports, "normalizePoseSource", {
353
+ enumerable: true,
354
+ get: function () { return poseEstimationWeb.normalizePoseSource; }
355
+ });
323
356
  Object.defineProperty(exports, "resolvePoseModel", {
324
357
  enumerable: true,
325
358
  get: function () { return poseEstimationWeb.resolvePoseModel; }
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { PoseTrackerClient, PoseTrackerStatus, PoseTrackerMode, ErrorEvent, SdkManifest, ExerciseConfig, PreloadOptions, StartExerciseOptions, PoseTrackerClientOptions, PoseTrackerEventListener, ClassicNativeMessage, SkeletonDefinition, PoseTrackerCallbacks } from '@pose-tracker/pose-estimation-web';
2
- export { COCO_KEYPOINT_NAMES, ColdStartMode, CounterEvent, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, ErrorEvent, ExerciseConfig, InitializationEvent, Keypoint, KeypointsEvent, Pose, PoseModelAlias, PoseTracker, PoseTrackerCallbacks, PoseTrackerClient, PoseTrackerClientOptions, PoseTrackerOptions, PostureEvent, PreloadOptions, SDK_NAME, SDK_VERSION, SdkManifest, StartExerciseOptions, createPoseTracker, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
1
+ import { PoseTrackerClient, PoseTrackerStatus, PoseTrackerMode, ErrorEvent, SdkManifest, ExerciseConfig, PreloadOptions, StartExerciseOptions, PoseTrackerClientOptions, PoseTrackerEventListener, ClassicNativeMessage, PoseSource, PoseSourceType, SkeletonDefinition, PoseTrackerCallbacks } from '@pose-tracker/pose-estimation-web';
2
+ export { COCO_KEYPOINT_NAMES, ColdStartMode, CounterEvent, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, ErrorEvent, ExerciseConfig, InitializationEvent, Keypoint, KeypointsEvent, Pose, PoseModelAlias, PoseSource, PoseSourceType, PoseTracker, PoseTrackerCallbacks, PoseTrackerClient, PoseTrackerClientOptions, PoseTrackerOptions, PostureEvent, PreloadOptions, SDK_NAME, SDK_VERSION, SdkManifest, StartExerciseOptions, createPoseTracker, normalizePoseSource, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
3
3
  import React from 'react';
4
4
 
5
5
  /**
@@ -20,6 +20,9 @@ interface PoseTrackerContextValue {
20
20
  startExercise: (exerciseId: string, options?: StartExerciseOptions) => void;
21
21
  stopExercise: () => void;
22
22
  setModel: (model?: PoseTrackerClientOptions['model'], modelUrl?: string) => Promise<void>;
23
+ setSource: PoseTrackerClient['setSource'];
24
+ analyze: PoseTrackerClient['analyze'];
25
+ getSource: PoseTrackerClient['getSource'];
23
26
  getAvailableExercises: () => ExerciseConfig[];
24
27
  getAvailableCustomExercises: () => ReturnType<PoseTrackerClient['getAvailableCustomExercises']>;
25
28
  addEventListener: (listener: PoseTrackerEventListener) => () => void;
@@ -51,6 +54,16 @@ interface PoseCameraProps {
51
54
  className?: string;
52
55
  /** 'front' | 'back' — mapped to getUserMedia facingMode. Default front. */
53
56
  position?: 'front' | 'back';
57
+ /**
58
+ * Input mode. Default `camera`.
59
+ * Pass a full {@link PoseSource} or `'camera' | 'video' | 'image'` with
60
+ * `sourceUrl` / `sourceFile`.
61
+ */
62
+ source?: PoseSource | PoseSourceType;
63
+ /** URL / object URL for `source: 'video' | 'image'`. */
64
+ sourceUrl?: string;
65
+ /** File/Blob for `source: 'video' | 'image'`. */
66
+ sourceFile?: File | Blob;
54
67
  /** Draw navy/gold skeleton overlay. Default true. */
55
68
  drawSkeleton?: boolean;
56
69
  /** Placement guide while posture.ready === false. Default true. */
@@ -78,7 +91,7 @@ interface PoseCameraProps {
78
91
  * Browser camera + canvas overlay (web equivalent of RN `WebViewPoseView`).
79
92
  * Must be rendered under {@link PoseTrackerProvider}.
80
93
  */
81
- declare function PoseCamera({ style, className, position, drawSkeleton, drawPlacementBox, placementPaddingPercent, coldStart, loadingText, showWatermark, skeletonDef, skeletonUuid, debugHud, autoStart: autoStartProp, }: PoseCameraProps): React.JSX.Element;
94
+ declare function PoseCamera({ style, className, position, source, sourceUrl, sourceFile, drawSkeleton, drawPlacementBox, placementPaddingPercent, coldStart, loadingText, showWatermark, skeletonDef, skeletonUuid, debugHud, autoStart: autoStartProp, }: PoseCameraProps): React.JSX.Element;
82
95
 
83
96
  /**
84
97
  * Access the PoseTracker pipeline and subscribe to typed events (RN light parity).
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { PoseTrackerClient, PoseTrackerStatus, PoseTrackerMode, ErrorEvent, SdkManifest, ExerciseConfig, PreloadOptions, StartExerciseOptions, PoseTrackerClientOptions, PoseTrackerEventListener, ClassicNativeMessage, SkeletonDefinition, PoseTrackerCallbacks } from '@pose-tracker/pose-estimation-web';
2
- export { COCO_KEYPOINT_NAMES, ColdStartMode, CounterEvent, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, ErrorEvent, ExerciseConfig, InitializationEvent, Keypoint, KeypointsEvent, Pose, PoseModelAlias, PoseTracker, PoseTrackerCallbacks, PoseTrackerClient, PoseTrackerClientOptions, PoseTrackerOptions, PostureEvent, PreloadOptions, SDK_NAME, SDK_VERSION, SdkManifest, StartExerciseOptions, createPoseTracker, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
1
+ import { PoseTrackerClient, PoseTrackerStatus, PoseTrackerMode, ErrorEvent, SdkManifest, ExerciseConfig, PreloadOptions, StartExerciseOptions, PoseTrackerClientOptions, PoseTrackerEventListener, ClassicNativeMessage, PoseSource, PoseSourceType, SkeletonDefinition, PoseTrackerCallbacks } from '@pose-tracker/pose-estimation-web';
2
+ export { COCO_KEYPOINT_NAMES, ColdStartMode, CounterEvent, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, ErrorEvent, ExerciseConfig, InitializationEvent, Keypoint, KeypointsEvent, Pose, PoseModelAlias, PoseSource, PoseSourceType, PoseTracker, PoseTrackerCallbacks, PoseTrackerClient, PoseTrackerClientOptions, PoseTrackerOptions, PostureEvent, PreloadOptions, SDK_NAME, SDK_VERSION, SdkManifest, StartExerciseOptions, createPoseTracker, normalizePoseSource, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
3
3
  import React from 'react';
4
4
 
5
5
  /**
@@ -20,6 +20,9 @@ interface PoseTrackerContextValue {
20
20
  startExercise: (exerciseId: string, options?: StartExerciseOptions) => void;
21
21
  stopExercise: () => void;
22
22
  setModel: (model?: PoseTrackerClientOptions['model'], modelUrl?: string) => Promise<void>;
23
+ setSource: PoseTrackerClient['setSource'];
24
+ analyze: PoseTrackerClient['analyze'];
25
+ getSource: PoseTrackerClient['getSource'];
23
26
  getAvailableExercises: () => ExerciseConfig[];
24
27
  getAvailableCustomExercises: () => ReturnType<PoseTrackerClient['getAvailableCustomExercises']>;
25
28
  addEventListener: (listener: PoseTrackerEventListener) => () => void;
@@ -51,6 +54,16 @@ interface PoseCameraProps {
51
54
  className?: string;
52
55
  /** 'front' | 'back' — mapped to getUserMedia facingMode. Default front. */
53
56
  position?: 'front' | 'back';
57
+ /**
58
+ * Input mode. Default `camera`.
59
+ * Pass a full {@link PoseSource} or `'camera' | 'video' | 'image'` with
60
+ * `sourceUrl` / `sourceFile`.
61
+ */
62
+ source?: PoseSource | PoseSourceType;
63
+ /** URL / object URL for `source: 'video' | 'image'`. */
64
+ sourceUrl?: string;
65
+ /** File/Blob for `source: 'video' | 'image'`. */
66
+ sourceFile?: File | Blob;
54
67
  /** Draw navy/gold skeleton overlay. Default true. */
55
68
  drawSkeleton?: boolean;
56
69
  /** Placement guide while posture.ready === false. Default true. */
@@ -78,7 +91,7 @@ interface PoseCameraProps {
78
91
  * Browser camera + canvas overlay (web equivalent of RN `WebViewPoseView`).
79
92
  * Must be rendered under {@link PoseTrackerProvider}.
80
93
  */
81
- declare function PoseCamera({ style, className, position, drawSkeleton, drawPlacementBox, placementPaddingPercent, coldStart, loadingText, showWatermark, skeletonDef, skeletonUuid, debugHud, autoStart: autoStartProp, }: PoseCameraProps): React.JSX.Element;
94
+ declare function PoseCamera({ style, className, position, source, sourceUrl, sourceFile, drawSkeleton, drawPlacementBox, placementPaddingPercent, coldStart, loadingText, showWatermark, skeletonDef, skeletonUuid, debugHud, autoStart: autoStartProp, }: PoseCameraProps): React.JSX.Element;
82
95
 
83
96
  /**
84
97
  * Access the PoseTracker pipeline and subscribe to typed events (RN light parity).
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createPoseTracker } from '@pose-tracker/pose-estimation-web';
2
- export { COCO_KEYPOINT_NAMES, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, PoseTrackerClient, SDK_NAME, SDK_VERSION, createPoseTracker, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
2
+ export { COCO_KEYPOINT_NAMES, DEFAULT_LOADING_TEXT, DEFAULT_MOVENET_LIGHTNING_URL, PoseTrackerClient, SDK_NAME, SDK_VERSION, createPoseTracker, normalizePoseSource, resolvePoseModel, shouldShowWatermark } from '@pose-tracker/pose-estimation-web';
3
3
  import { createContext, useMemo, useRef, useState, useEffect, useCallback, useContext } from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
 
@@ -75,6 +75,12 @@ function PoseTrackerProvider({
75
75
  (model, modelUrl) => client.setModel(model, modelUrl),
76
76
  [client]
77
77
  );
78
+ const setSource = useCallback(
79
+ (...args) => client.setSource(...args),
80
+ [client]
81
+ );
82
+ const analyze = useCallback(() => client.analyze(), [client]);
83
+ const getSource = useCallback(() => client.getSource(), [client]);
78
84
  const getAvailableExercises = useCallback(() => client.getAvailableExercises(), [client]);
79
85
  const getAvailableCustomExercises = useCallback(
80
86
  () => client.getAvailableCustomExercises(),
@@ -105,6 +111,9 @@ function PoseTrackerProvider({
105
111
  startExercise,
106
112
  stopExercise,
107
113
  setModel,
114
+ setSource,
115
+ analyze,
116
+ getSource,
108
117
  getAvailableExercises,
109
118
  getAvailableCustomExercises,
110
119
  addEventListener,
@@ -126,6 +135,9 @@ function PoseTrackerProvider({
126
135
  startExercise,
127
136
  stopExercise,
128
137
  setModel,
138
+ setSource,
139
+ analyze,
140
+ getSource,
129
141
  getAvailableExercises,
130
142
  getAvailableCustomExercises,
131
143
  addEventListener,
@@ -149,6 +161,9 @@ function PoseCamera({
149
161
  style,
150
162
  className,
151
163
  position,
164
+ source,
165
+ sourceUrl,
166
+ sourceFile,
152
167
  drawSkeleton,
153
168
  drawPlacementBox,
154
169
  placementPaddingPercent,
@@ -169,6 +184,9 @@ function PoseCamera({
169
184
  if (!el) return;
170
185
  client.updateOptions({
171
186
  ...position ? { position } : {},
187
+ ...source !== void 0 ? { source } : {},
188
+ ...sourceUrl !== void 0 ? { sourceUrl } : {},
189
+ ...sourceFile !== void 0 ? { sourceFile } : {},
172
190
  ...typeof drawSkeleton === "boolean" ? { drawSkeleton } : {},
173
191
  ...typeof drawPlacementBox === "boolean" ? { drawPlacementBox } : {},
174
192
  ...typeof placementPaddingPercent === "number" ? { placementPaddingPercent } : {},
@@ -183,7 +201,13 @@ function PoseCamera({
183
201
  const shouldStart = autoStartProp ?? providerAutoStart;
184
202
  if (shouldStart && !startedRef.current) {
185
203
  startedRef.current = true;
186
- client.start().catch(() => {
204
+ const boot = async () => {
205
+ if (source !== void 0) {
206
+ await client.setSource(source, { sourceUrl, sourceFile });
207
+ }
208
+ await client.start();
209
+ };
210
+ boot().catch(() => {
187
211
  });
188
212
  }
189
213
  return () => {
@@ -192,6 +216,11 @@ function PoseCamera({
192
216
  _registerMountHost(null);
193
217
  };
194
218
  }, [client]);
219
+ useEffect(() => {
220
+ if (!startedRef.current || source === void 0) return;
221
+ void client.setSource(source, { sourceUrl, sourceFile }).catch(() => {
222
+ });
223
+ }, [client, source, sourceUrl, sourceFile]);
195
224
  return /* @__PURE__ */ jsx(
196
225
  "div",
197
226
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pose-tracker/pose-estimation-web-react",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "private": false,
5
5
  "description": "PoseTracker React (web) pose estimation — thin wrapper over @pose-tracker/pose-estimation-web. Browser camera + canvas, not React Native.",
6
6
  "type": "module",
@@ -54,7 +54,7 @@
54
54
  "access": "public"
55
55
  },
56
56
  "dependencies": {
57
- "@pose-tracker/pose-estimation-web": "0.1.0"
57
+ "@pose-tracker/pose-estimation-web": "0.2.0"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "react": ">=18.0.0",