react-native-image-stitcher 0.1.0 → 0.1.1

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/CHANGELOG.md CHANGED
@@ -16,7 +16,45 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
16
16
 
17
17
  ## [Unreleased]
18
18
 
19
- ## [0.1.0] — TBD
19
+ ## [0.1.1] — 2026-05-20
20
+
21
+ ### Added
22
+
23
+ - **Layer 2 building blocks now public.** The lower-level views,
24
+ hooks, and stitching-engine bindings that previously lived behind
25
+ the `<Camera>` wrapper are now exported from the package root.
26
+ Use these when `<Camera>` doesn't give you enough control — e.g.,
27
+ when you're hand-composing your own capture screen on top of the
28
+ same proven primitives. Full list:
29
+ - Views: `ARCameraView`, `CameraView` (+ their handle/prop types).
30
+ - UI components: `CaptureHeader`, `CaptureControlsBar`,
31
+ `CapturePreview`, `CaptureStatusOverlay`, `CaptureThumbnailStrip`,
32
+ `IncrementalPanGuide`, `PanoramaBandOverlay`, `PanoramaGuidance`,
33
+ `PanoramaSettingsModal` (+ `DEFAULT_PANORAMA_SETTINGS` constant +
34
+ `PanoramaSettings` type), `ViewportCropOverlay`.
35
+ - Hooks: `useCapture`, `useVideoCapture`, `useDeviceOrientation`,
36
+ `useIncrementalStitcher`, `useIncrementalJSDriver`.
37
+ - Engine: `IncrementalOutcome`, `incrementalStitcherIsAvailable`,
38
+ `subscribeIncrementalState`, `getIncrementalNativeModule`,
39
+ `cleanupOldKeyframes`, `IncrementalState` (type).
40
+ - Batch stitching: `stitchVideo`.
41
+ - The 0.1.0 → 1.0 stability gate still applies — the goal of
42
+ surfacing layer 2 is to support advanced consumers (e.g.,
43
+ `retailens-camera-sdk`) without forcing them to deep-import
44
+ package internals. These are likely to keep their shape through
45
+ 1.0, but the contract is not formally stable until then.
46
+
47
+ ### Changed
48
+
49
+ - README now documents both layers and recommends `<Camera>` as the
50
+ default starting point.
51
+
52
+ ### Fixed
53
+
54
+ (No bug fixes in this release — see 0.1.0 for the device-verified
55
+ camera lifecycle fixes that shipped with the initial release.)
56
+
57
+ ## [0.1.0] — 2026-05-20
20
58
 
21
59
  First public release.
22
60
 
package/dist/index.d.ts CHANGED
@@ -1,21 +1,23 @@
1
1
  /**
2
2
  * react-native-image-stitcher — public API surface.
3
3
  *
4
- * Single component (`<Camera>`) + supporting types + the two public
5
- * hooks the design doc calls out (`useARSession`, `useIMUTranslationGate`).
6
- * Everything else (internal sub-components, drivers, bridges) is
7
- * deliberately NOT re-exported so the v0.1.0 → 1.0 stability window
8
- * doesn't lock us into an inflated public surface.
4
+ * Two layers:
5
+ * 1. The high-level `<Camera>` component for hosts that want a
6
+ * drop-in capture experience. Tap = photo, hold + pan + release
7
+ * = panorama. Single mount, all UI included.
8
+ * 2. The lower-level building blocks (views, hooks, stitching
9
+ * engine bindings, settings modal, status overlays) for hosts
10
+ * that want to compose their own capture UX while reusing the
11
+ * battle-tested camera and stitching internals.
9
12
  *
10
- * If you need access to something that used to be exported and isn't
11
- * now, please open an issue describing the use-case before reaching
12
- * into the package internals.
13
+ * Layer 1 (`<Camera>`) is the recommended starting point. Reach for
14
+ * layer 2 when the high-level component doesn't give you enough
15
+ * control — e.g., the private `retailens-camera-sdk` adds
16
+ * measurement + packet detection on top of these building blocks.
13
17
  *
14
18
  * Public/private split: this lib is the open-source foundation. The
15
- * `retailens-camera-sdk` package depends on this lib and adds
16
- * RetaiLens-specific features (measurement, packet detection, etc.)
17
- * on top. Consumers wanting those features install
18
- * `retailens-camera-sdk` instead.
19
+ * `retailens-camera-sdk` package depends on this lib (peer dep) and
20
+ * adds RetaiLens-specific features on top.
19
21
  */
20
22
  export { Camera, CameraError } from './camera/Camera';
21
23
  export type { CameraProps, CameraCaptureResult, CameraErrorCode, CaptureSource, CameraLens, StitchMode, Blender, SeamFinder, Warper, FramesDroppedInfo, } from './camera/Camera';
@@ -23,4 +25,30 @@ export { useARSession, ARTrackingState } from './ar/useARSession';
23
25
  export type { UseARSessionReturn, FramePose, } from './ar/useARSession';
24
26
  export { useIMUTranslationGate } from './sensors/useIMUTranslationGate';
25
27
  export type { UseIMUTranslationGateOptions, UseIMUTranslationGateReturn, } from './sensors/useIMUTranslationGate';
28
+ export { ARCameraView } from './camera/ARCameraView';
29
+ export type { ARCameraViewHandle, ARCameraViewProps } from './camera/ARCameraView';
30
+ export { CameraView } from './camera/CameraView';
31
+ export type { CameraViewProps } from './camera/CameraView';
32
+ export { CaptureHeader } from './camera/CaptureHeader';
33
+ export { CaptureControlsBar } from './camera/CaptureControlsBar';
34
+ export { CapturePreview } from './camera/CapturePreview';
35
+ export type { CapturePreviewAction } from './camera/CapturePreview';
36
+ export { CaptureStatusOverlay } from './camera/CaptureStatusOverlay';
37
+ export type { CaptureStatusPhase } from './camera/CaptureStatusOverlay';
38
+ export { CaptureThumbnailStrip } from './camera/CaptureThumbnailStrip';
39
+ export type { CaptureThumbnailItem } from './camera/CaptureThumbnailStrip';
40
+ export { IncrementalPanGuide } from './camera/IncrementalPanGuide';
41
+ export { PanoramaBandOverlay } from './camera/PanoramaBandOverlay';
42
+ export { PanoramaGuidance } from './camera/PanoramaGuidance';
43
+ export { PanoramaSettingsModal, DEFAULT_PANORAMA_SETTINGS, } from './camera/PanoramaSettingsModal';
44
+ export type { PanoramaSettings } from './camera/PanoramaSettingsModal';
45
+ export { ViewportCropOverlay } from './camera/ViewportCropOverlay';
46
+ export { useCapture } from './camera/useCapture';
47
+ export { useVideoCapture } from './camera/useVideoCapture';
48
+ export { useDeviceOrientation } from './camera/useDeviceOrientation';
49
+ export { IncrementalOutcome, incrementalStitcherIsAvailable, subscribeIncrementalState, getIncrementalNativeModule, cleanupOldKeyframes, } from './stitching/incremental';
50
+ export type { IncrementalState } from './stitching/incremental';
51
+ export { useIncrementalStitcher } from './stitching/useIncrementalStitcher';
52
+ export { useIncrementalJSDriver } from './stitching/useIncrementalJSDriver';
53
+ export { stitchVideo } from './stitching/stitchVideo';
26
54
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -3,37 +3,110 @@
3
3
  /**
4
4
  * react-native-image-stitcher — public API surface.
5
5
  *
6
- * Single component (`<Camera>`) + supporting types + the two public
7
- * hooks the design doc calls out (`useARSession`, `useIMUTranslationGate`).
8
- * Everything else (internal sub-components, drivers, bridges) is
9
- * deliberately NOT re-exported so the v0.1.0 → 1.0 stability window
10
- * doesn't lock us into an inflated public surface.
6
+ * Two layers:
7
+ * 1. The high-level `<Camera>` component for hosts that want a
8
+ * drop-in capture experience. Tap = photo, hold + pan + release
9
+ * = panorama. Single mount, all UI included.
10
+ * 2. The lower-level building blocks (views, hooks, stitching
11
+ * engine bindings, settings modal, status overlays) for hosts
12
+ * that want to compose their own capture UX while reusing the
13
+ * battle-tested camera and stitching internals.
11
14
  *
12
- * If you need access to something that used to be exported and isn't
13
- * now, please open an issue describing the use-case before reaching
14
- * into the package internals.
15
+ * Layer 1 (`<Camera>`) is the recommended starting point. Reach for
16
+ * layer 2 when the high-level component doesn't give you enough
17
+ * control — e.g., the private `retailens-camera-sdk` adds
18
+ * measurement + packet detection on top of these building blocks.
15
19
  *
16
20
  * Public/private split: this lib is the open-source foundation. The
17
- * `retailens-camera-sdk` package depends on this lib and adds
18
- * RetaiLens-specific features (measurement, packet detection, etc.)
19
- * on top. Consumers wanting those features install
20
- * `retailens-camera-sdk` instead.
21
+ * `retailens-camera-sdk` package depends on this lib (peer dep) and
22
+ * adds RetaiLens-specific features on top.
21
23
  */
22
24
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.useIMUTranslationGate = exports.ARTrackingState = exports.useARSession = exports.CameraError = exports.Camera = void 0;
24
- // ── The main component ────────────────────────────────────────────────────
25
+ exports.stitchVideo = exports.useIncrementalJSDriver = exports.useIncrementalStitcher = exports.cleanupOldKeyframes = exports.getIncrementalNativeModule = exports.subscribeIncrementalState = exports.incrementalStitcherIsAvailable = exports.IncrementalOutcome = exports.useDeviceOrientation = exports.useVideoCapture = exports.useCapture = exports.ViewportCropOverlay = exports.DEFAULT_PANORAMA_SETTINGS = exports.PanoramaSettingsModal = exports.PanoramaGuidance = exports.PanoramaBandOverlay = exports.IncrementalPanGuide = exports.CaptureThumbnailStrip = exports.CaptureStatusOverlay = exports.CapturePreview = exports.CaptureControlsBar = exports.CaptureHeader = exports.CameraView = exports.ARCameraView = exports.useIMUTranslationGate = exports.ARTrackingState = exports.useARSession = exports.CameraError = exports.Camera = void 0;
26
+ // ─────────────────────────────────────────────────────────────────────
27
+ // Layer 1 — the high-level <Camera> component
28
+ // ─────────────────────────────────────────────────────────────────────
25
29
  var Camera_1 = require("./camera/Camera");
26
30
  Object.defineProperty(exports, "Camera", { enumerable: true, get: function () { return Camera_1.Camera; } });
27
31
  Object.defineProperty(exports, "CameraError", { enumerable: true, get: function () { return Camera_1.CameraError; } });
28
- // ── AR foundation (public per design doc) ─────────────────────────────────
32
+ // ─────────────────────────────────────────────────────────────────────
33
+ // AR foundation (public since 0.1.0)
34
+ // ─────────────────────────────────────────────────────────────────────
29
35
  // Hosts that want raw AR pose access (e.g., to build their own
30
36
  // measurement/detection on top) consume these directly.
31
37
  var useARSession_1 = require("./ar/useARSession");
32
38
  Object.defineProperty(exports, "useARSession", { enumerable: true, get: function () { return useARSession_1.useARSession; } });
33
39
  Object.defineProperty(exports, "ARTrackingState", { enumerable: true, get: function () { return useARSession_1.ARTrackingState; } });
34
- // ── IMU translation gate (public per design doc R5) ───────────────────────
40
+ // ─────────────────────────────────────────────────────────────────────
41
+ // IMU translation gate (public since 0.1.0)
42
+ // ─────────────────────────────────────────────────────────────────────
35
43
  // Hosts running their own non-AR capture flow can reuse this hook to
36
- // get the same gating logic <Camera> uses internally.
44
+ // get the same translation-budget gating logic <Camera> uses internally.
37
45
  var useIMUTranslationGate_1 = require("./sensors/useIMUTranslationGate");
38
46
  Object.defineProperty(exports, "useIMUTranslationGate", { enumerable: true, get: function () { return useIMUTranslationGate_1.useIMUTranslationGate; } });
47
+ // ═════════════════════════════════════════════════════════════════════
48
+ // Layer 2 — composable building blocks (added in 0.1.1)
49
+ // ═════════════════════════════════════════════════════════════════════
50
+ // ── Camera view components ────────────────────────────────────────────
51
+ // Drop-in replacements for vision-camera's raw <Camera> (non-AR) and a
52
+ // parallel ARKit/ARCore-backed view (AR). Use these when you need to
53
+ // hand-compose your capture UI instead of mounting <Camera>.
54
+ var ARCameraView_1 = require("./camera/ARCameraView");
55
+ Object.defineProperty(exports, "ARCameraView", { enumerable: true, get: function () { return ARCameraView_1.ARCameraView; } });
56
+ var CameraView_1 = require("./camera/CameraView");
57
+ Object.defineProperty(exports, "CameraView", { enumerable: true, get: function () { return CameraView_1.CameraView; } });
58
+ // ── UI components ─────────────────────────────────────────────────────
59
+ // Presentational pieces of the standard capture screen. Each is a
60
+ // pure component; the host wires the props.
61
+ var CaptureHeader_1 = require("./camera/CaptureHeader");
62
+ Object.defineProperty(exports, "CaptureHeader", { enumerable: true, get: function () { return CaptureHeader_1.CaptureHeader; } });
63
+ var CaptureControlsBar_1 = require("./camera/CaptureControlsBar");
64
+ Object.defineProperty(exports, "CaptureControlsBar", { enumerable: true, get: function () { return CaptureControlsBar_1.CaptureControlsBar; } });
65
+ var CapturePreview_1 = require("./camera/CapturePreview");
66
+ Object.defineProperty(exports, "CapturePreview", { enumerable: true, get: function () { return CapturePreview_1.CapturePreview; } });
67
+ var CaptureStatusOverlay_1 = require("./camera/CaptureStatusOverlay");
68
+ Object.defineProperty(exports, "CaptureStatusOverlay", { enumerable: true, get: function () { return CaptureStatusOverlay_1.CaptureStatusOverlay; } });
69
+ var CaptureThumbnailStrip_1 = require("./camera/CaptureThumbnailStrip");
70
+ Object.defineProperty(exports, "CaptureThumbnailStrip", { enumerable: true, get: function () { return CaptureThumbnailStrip_1.CaptureThumbnailStrip; } });
71
+ var IncrementalPanGuide_1 = require("./camera/IncrementalPanGuide");
72
+ Object.defineProperty(exports, "IncrementalPanGuide", { enumerable: true, get: function () { return IncrementalPanGuide_1.IncrementalPanGuide; } });
73
+ var PanoramaBandOverlay_1 = require("./camera/PanoramaBandOverlay");
74
+ Object.defineProperty(exports, "PanoramaBandOverlay", { enumerable: true, get: function () { return PanoramaBandOverlay_1.PanoramaBandOverlay; } });
75
+ var PanoramaGuidance_1 = require("./camera/PanoramaGuidance");
76
+ Object.defineProperty(exports, "PanoramaGuidance", { enumerable: true, get: function () { return PanoramaGuidance_1.PanoramaGuidance; } });
77
+ var PanoramaSettingsModal_1 = require("./camera/PanoramaSettingsModal");
78
+ Object.defineProperty(exports, "PanoramaSettingsModal", { enumerable: true, get: function () { return PanoramaSettingsModal_1.PanoramaSettingsModal; } });
79
+ Object.defineProperty(exports, "DEFAULT_PANORAMA_SETTINGS", { enumerable: true, get: function () { return PanoramaSettingsModal_1.DEFAULT_PANORAMA_SETTINGS; } });
80
+ var ViewportCropOverlay_1 = require("./camera/ViewportCropOverlay");
81
+ Object.defineProperty(exports, "ViewportCropOverlay", { enumerable: true, get: function () { return ViewportCropOverlay_1.ViewportCropOverlay; } });
82
+ // ── Capture hooks ─────────────────────────────────────────────────────
83
+ // vision-camera wrappers (useCapture / useVideoCapture) + a
84
+ // device-orientation reader that works under iOS portrait-lock.
85
+ var useCapture_1 = require("./camera/useCapture");
86
+ Object.defineProperty(exports, "useCapture", { enumerable: true, get: function () { return useCapture_1.useCapture; } });
87
+ var useVideoCapture_1 = require("./camera/useVideoCapture");
88
+ Object.defineProperty(exports, "useVideoCapture", { enumerable: true, get: function () { return useVideoCapture_1.useVideoCapture; } });
89
+ var useDeviceOrientation_1 = require("./camera/useDeviceOrientation");
90
+ Object.defineProperty(exports, "useDeviceOrientation", { enumerable: true, get: function () { return useDeviceOrientation_1.useDeviceOrientation; } });
91
+ // ── Incremental stitching engine ──────────────────────────────────────
92
+ // JS bindings around the native `IncrementalStitcher` module. Use
93
+ // these when you need finer control than <Camera>'s built-in
94
+ // hold-to-pan flow (e.g., feeding frames from a custom source, or
95
+ // reading the engine's running state to drive a custom UI).
96
+ var incremental_1 = require("./stitching/incremental");
97
+ Object.defineProperty(exports, "IncrementalOutcome", { enumerable: true, get: function () { return incremental_1.IncrementalOutcome; } });
98
+ Object.defineProperty(exports, "incrementalStitcherIsAvailable", { enumerable: true, get: function () { return incremental_1.incrementalStitcherIsAvailable; } });
99
+ Object.defineProperty(exports, "subscribeIncrementalState", { enumerable: true, get: function () { return incremental_1.subscribeIncrementalState; } });
100
+ Object.defineProperty(exports, "getIncrementalNativeModule", { enumerable: true, get: function () { return incremental_1.getIncrementalNativeModule; } });
101
+ Object.defineProperty(exports, "cleanupOldKeyframes", { enumerable: true, get: function () { return incremental_1.cleanupOldKeyframes; } });
102
+ var useIncrementalStitcher_1 = require("./stitching/useIncrementalStitcher");
103
+ Object.defineProperty(exports, "useIncrementalStitcher", { enumerable: true, get: function () { return useIncrementalStitcher_1.useIncrementalStitcher; } });
104
+ var useIncrementalJSDriver_1 = require("./stitching/useIncrementalJSDriver");
105
+ Object.defineProperty(exports, "useIncrementalJSDriver", { enumerable: true, get: function () { return useIncrementalJSDriver_1.useIncrementalJSDriver; } });
106
+ // ── Batch stitching ───────────────────────────────────────────────────
107
+ // Feed a video file straight to OpenCV's cv::Stitcher, bypassing the
108
+ // incremental pipeline. Useful when you have content captured
109
+ // outside the SDK and just want a panorama out.
110
+ var stitchVideo_1 = require("./stitching/stitchVideo");
111
+ Object.defineProperty(exports, "stitchVideo", { enumerable: true, get: function () { return stitchVideo_1.stitchVideo; } });
39
112
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-image-stitcher",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Pose-aware panorama capture + stitching for React Native. One <Camera> component, both tap-to-photo and hold-to-pan modes, both AR-backed and IMU-fallback capture paths.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -2,24 +2,28 @@
2
2
  /**
3
3
  * react-native-image-stitcher — public API surface.
4
4
  *
5
- * Single component (`<Camera>`) + supporting types + the two public
6
- * hooks the design doc calls out (`useARSession`, `useIMUTranslationGate`).
7
- * Everything else (internal sub-components, drivers, bridges) is
8
- * deliberately NOT re-exported so the v0.1.0 → 1.0 stability window
9
- * doesn't lock us into an inflated public surface.
5
+ * Two layers:
6
+ * 1. The high-level `<Camera>` component for hosts that want a
7
+ * drop-in capture experience. Tap = photo, hold + pan + release
8
+ * = panorama. Single mount, all UI included.
9
+ * 2. The lower-level building blocks (views, hooks, stitching
10
+ * engine bindings, settings modal, status overlays) for hosts
11
+ * that want to compose their own capture UX while reusing the
12
+ * battle-tested camera and stitching internals.
10
13
  *
11
- * If you need access to something that used to be exported and isn't
12
- * now, please open an issue describing the use-case before reaching
13
- * into the package internals.
14
+ * Layer 1 (`<Camera>`) is the recommended starting point. Reach for
15
+ * layer 2 when the high-level component doesn't give you enough
16
+ * control — e.g., the private `retailens-camera-sdk` adds
17
+ * measurement + packet detection on top of these building blocks.
14
18
  *
15
19
  * Public/private split: this lib is the open-source foundation. The
16
- * `retailens-camera-sdk` package depends on this lib and adds
17
- * RetaiLens-specific features (measurement, packet detection, etc.)
18
- * on top. Consumers wanting those features install
19
- * `retailens-camera-sdk` instead.
20
+ * `retailens-camera-sdk` package depends on this lib (peer dep) and
21
+ * adds RetaiLens-specific features on top.
20
22
  */
21
23
 
22
- // ── The main component ────────────────────────────────────────────────────
24
+ // ─────────────────────────────────────────────────────────────────────
25
+ // Layer 1 — the high-level <Camera> component
26
+ // ─────────────────────────────────────────────────────────────────────
23
27
  export { Camera, CameraError } from './camera/Camera';
24
28
  export type {
25
29
  CameraProps,
@@ -34,7 +38,9 @@ export type {
34
38
  FramesDroppedInfo,
35
39
  } from './camera/Camera';
36
40
 
37
- // ── AR foundation (public per design doc) ─────────────────────────────────
41
+ // ─────────────────────────────────────────────────────────────────────
42
+ // AR foundation (public since 0.1.0)
43
+ // ─────────────────────────────────────────────────────────────────────
38
44
  // Hosts that want raw AR pose access (e.g., to build their own
39
45
  // measurement/detection on top) consume these directly.
40
46
  export { useARSession, ARTrackingState } from './ar/useARSession';
@@ -43,11 +49,76 @@ export type {
43
49
  FramePose,
44
50
  } from './ar/useARSession';
45
51
 
46
- // ── IMU translation gate (public per design doc R5) ───────────────────────
52
+ // ─────────────────────────────────────────────────────────────────────
53
+ // IMU translation gate (public since 0.1.0)
54
+ // ─────────────────────────────────────────────────────────────────────
47
55
  // Hosts running their own non-AR capture flow can reuse this hook to
48
- // get the same gating logic <Camera> uses internally.
56
+ // get the same translation-budget gating logic <Camera> uses internally.
49
57
  export { useIMUTranslationGate } from './sensors/useIMUTranslationGate';
50
58
  export type {
51
59
  UseIMUTranslationGateOptions,
52
60
  UseIMUTranslationGateReturn,
53
61
  } from './sensors/useIMUTranslationGate';
62
+
63
+ // ═════════════════════════════════════════════════════════════════════
64
+ // Layer 2 — composable building blocks (added in 0.1.1)
65
+ // ═════════════════════════════════════════════════════════════════════
66
+
67
+ // ── Camera view components ────────────────────────────────────────────
68
+ // Drop-in replacements for vision-camera's raw <Camera> (non-AR) and a
69
+ // parallel ARKit/ARCore-backed view (AR). Use these when you need to
70
+ // hand-compose your capture UI instead of mounting <Camera>.
71
+ export { ARCameraView } from './camera/ARCameraView';
72
+ export type { ARCameraViewHandle, ARCameraViewProps } from './camera/ARCameraView';
73
+ export { CameraView } from './camera/CameraView';
74
+ export type { CameraViewProps } from './camera/CameraView';
75
+
76
+ // ── UI components ─────────────────────────────────────────────────────
77
+ // Presentational pieces of the standard capture screen. Each is a
78
+ // pure component; the host wires the props.
79
+ export { CaptureHeader } from './camera/CaptureHeader';
80
+ export { CaptureControlsBar } from './camera/CaptureControlsBar';
81
+ export { CapturePreview } from './camera/CapturePreview';
82
+ export type { CapturePreviewAction } from './camera/CapturePreview';
83
+ export { CaptureStatusOverlay } from './camera/CaptureStatusOverlay';
84
+ export type { CaptureStatusPhase } from './camera/CaptureStatusOverlay';
85
+ export { CaptureThumbnailStrip } from './camera/CaptureThumbnailStrip';
86
+ export type { CaptureThumbnailItem } from './camera/CaptureThumbnailStrip';
87
+ export { IncrementalPanGuide } from './camera/IncrementalPanGuide';
88
+ export { PanoramaBandOverlay } from './camera/PanoramaBandOverlay';
89
+ export { PanoramaGuidance } from './camera/PanoramaGuidance';
90
+ export {
91
+ PanoramaSettingsModal,
92
+ DEFAULT_PANORAMA_SETTINGS,
93
+ } from './camera/PanoramaSettingsModal';
94
+ export type { PanoramaSettings } from './camera/PanoramaSettingsModal';
95
+ export { ViewportCropOverlay } from './camera/ViewportCropOverlay';
96
+
97
+ // ── Capture hooks ─────────────────────────────────────────────────────
98
+ // vision-camera wrappers (useCapture / useVideoCapture) + a
99
+ // device-orientation reader that works under iOS portrait-lock.
100
+ export { useCapture } from './camera/useCapture';
101
+ export { useVideoCapture } from './camera/useVideoCapture';
102
+ export { useDeviceOrientation } from './camera/useDeviceOrientation';
103
+
104
+ // ── Incremental stitching engine ──────────────────────────────────────
105
+ // JS bindings around the native `IncrementalStitcher` module. Use
106
+ // these when you need finer control than <Camera>'s built-in
107
+ // hold-to-pan flow (e.g., feeding frames from a custom source, or
108
+ // reading the engine's running state to drive a custom UI).
109
+ export {
110
+ IncrementalOutcome,
111
+ incrementalStitcherIsAvailable,
112
+ subscribeIncrementalState,
113
+ getIncrementalNativeModule,
114
+ cleanupOldKeyframes,
115
+ } from './stitching/incremental';
116
+ export type { IncrementalState } from './stitching/incremental';
117
+ export { useIncrementalStitcher } from './stitching/useIncrementalStitcher';
118
+ export { useIncrementalJSDriver } from './stitching/useIncrementalJSDriver';
119
+
120
+ // ── Batch stitching ───────────────────────────────────────────────────
121
+ // Feed a video file straight to OpenCV's cv::Stitcher, bypassing the
122
+ // incremental pipeline. Useful when you have content captured
123
+ // outside the SDK and just want a panorama out.
124
+ export { stitchVideo } from './stitching/stitchVideo';