@capgo/camera-preview 7.4.0-alpha.1 → 7.4.0-alpha.11

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.
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["esm/definitions.js","esm/index.js","esm/web.js"],"sourcesContent":["export var DeviceType;\n(function (DeviceType) {\n DeviceType[\"ULTRA_WIDE\"] = \"ultraWide\";\n DeviceType[\"WIDE_ANGLE\"] = \"wideAngle\";\n DeviceType[\"TELEPHOTO\"] = \"telephoto\";\n DeviceType[\"TRUE_DEPTH\"] = \"trueDepth\";\n DeviceType[\"DUAL\"] = \"dual\";\n DeviceType[\"DUAL_WIDE\"] = \"dualWide\";\n DeviceType[\"TRIPLE\"] = \"triple\";\n})(DeviceType || (DeviceType = {}));\n//# sourceMappingURL=definitions.js.map","import { registerPlugin } from \"@capacitor/core\";\nconst CameraPreview = registerPlugin(\"CameraPreview\", {\n web: () => import(\"./web\").then((m) => new m.CameraPreviewWeb()),\n});\nexport * from \"./definitions\";\nexport { CameraPreview };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nimport { DeviceType } from \"./definitions\";\nconst DEFAULT_VIDEO_ID = \"capgo_video\";\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super();\n /**\n * track which camera is used based on start options\n * used in capture\n */\n this.isBackCamera = false;\n this.currentDeviceId = null;\n this.videoElement = null;\n this.isStarted = false;\n }\n async getSupportedPictureSizes() {\n throw new Error(\"getSupportedPictureSizes not supported under the web platform\");\n }\n async start(options) {\n if (options.aspectRatio && (options.width || options.height)) {\n throw new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\");\n }\n if (this.isStarted) {\n throw new Error(\"camera already started\");\n }\n this.isBackCamera = true;\n this.isStarted = false;\n const parent = document.getElementById((options === null || options === void 0 ? void 0 : options.parent) || \"\");\n const gridMode = (options === null || options === void 0 ? void 0 : options.gridMode) || \"none\";\n const positioning = (options === null || options === void 0 ? void 0 : options.positioning) || \"top\";\n if (options.position) {\n this.isBackCamera = options.position === \"rear\";\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.remove();\n }\n const container = options.parent\n ? document.getElementById(options.parent)\n : document.body;\n if (!container) {\n throw new Error(\"container not found\");\n }\n this.videoElement = document.createElement(\"video\");\n this.videoElement.id = DEFAULT_VIDEO_ID;\n this.videoElement.className = options.className || \"\";\n this.videoElement.playsInline = true;\n this.videoElement.muted = true;\n this.videoElement.autoplay = true;\n // Remove objectFit as we'll match camera's native aspect ratio\n this.videoElement.style.backgroundColor = \"transparent\";\n // Reset any default margins that might interfere\n this.videoElement.style.margin = \"0\";\n this.videoElement.style.padding = \"0\";\n container.appendChild(this.videoElement);\n if (options.toBack) {\n this.videoElement.style.zIndex = \"-1\";\n }\n // Default to 16:9 vertical (9:16 for portrait) if no aspect ratio or size specified\n const useDefaultAspectRatio = !options.aspectRatio && !options.width && !options.height;\n const effectiveAspectRatio = options.aspectRatio || (useDefaultAspectRatio ? \"16:9\" : null);\n if (options.width) {\n this.videoElement.width = options.width;\n this.videoElement.style.width = `${options.width}px`;\n }\n if (options.height) {\n this.videoElement.height = options.height;\n this.videoElement.style.height = `${options.height}px`;\n }\n // Handle positioning - center if x or y not provided\n const centerX = options.x === undefined;\n const centerY = options.y === undefined;\n // Always set position to absolute for proper positioning\n this.videoElement.style.position = \"absolute\";\n console.log(\"Initial positioning flags:\", {\n centerX,\n centerY,\n x: options.x,\n y: options.y,\n });\n if (options.x !== undefined) {\n this.videoElement.style.left = `${options.x}px`;\n }\n if (options.y !== undefined) {\n this.videoElement.style.top = `${options.y}px`;\n }\n // Create and add grid overlay if needed\n if (gridMode !== \"none\") {\n const gridOverlay = this.createGridOverlay(gridMode);\n gridOverlay.id = \"camera-grid-overlay\";\n parent === null || parent === void 0 ? void 0 : parent.appendChild(gridOverlay);\n }\n // Aspect ratio handling is now done after getting camera stream\n // Store centering flags for later use\n const needsCenterX = centerX;\n const needsCenterY = centerY;\n console.log(\"Centering flags stored:\", { needsCenterX, needsCenterY });\n // First get the camera stream with basic constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n },\n };\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n if (!stream) {\n throw new Error(\"could not acquire stream\");\n }\n if (!this.videoElement) {\n throw new Error(\"video element not found\");\n }\n // Get the actual camera dimensions from the video track\n const videoTrack = stream.getVideoTracks()[0];\n const settings = videoTrack.getSettings();\n const cameraWidth = settings.width || 640;\n const cameraHeight = settings.height || 480;\n const cameraAspectRatio = cameraWidth / cameraHeight;\n console.log(\"Camera native dimensions:\", {\n width: cameraWidth,\n height: cameraHeight,\n aspectRatio: cameraAspectRatio,\n });\n console.log(\"Container dimensions:\", {\n width: container.offsetWidth,\n height: container.offsetHeight,\n id: container.id,\n });\n // Now adjust video element size based on camera's native aspect ratio\n if (!options.width && !options.height && !options.aspectRatio) {\n // No size specified, fit camera view within container bounds\n const containerWidth = container.offsetWidth || window.innerWidth;\n const containerHeight = container.offsetHeight || window.innerHeight;\n // Calculate dimensions that fit within container while maintaining camera aspect ratio\n let targetWidth, targetHeight;\n // Try fitting to container width first\n targetWidth = containerWidth;\n targetHeight = targetWidth / cameraAspectRatio;\n // If height exceeds container, fit to height instead\n if (targetHeight > containerHeight) {\n targetHeight = containerHeight;\n targetWidth = targetHeight * cameraAspectRatio;\n }\n console.log(\"Video element dimensions:\", {\n width: targetWidth,\n height: targetHeight,\n container: { width: containerWidth, height: containerHeight },\n });\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const x = Math.round((containerWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = window.innerHeight - targetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((window.innerHeight - targetHeight) / 2);\n break;\n }\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n // Force a style recalculation\n this.videoElement.offsetHeight;\n console.log(\"Positioning video:\", {\n positioning,\n viewportHeight: window.innerHeight,\n targetHeight,\n calculatedY: y,\n actualTop: this.videoElement.style.top,\n position: this.videoElement.style.position,\n });\n }\n }\n else if (effectiveAspectRatio && !options.width && !options.height) {\n // Aspect ratio specified but no size\n const [widthRatio, heightRatio] = effectiveAspectRatio\n .split(\":\")\n .map(Number);\n const targetRatio = widthRatio / heightRatio;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n let targetWidth, targetHeight;\n // Try fitting to viewport width first\n targetWidth = viewportWidth;\n targetHeight = targetWidth / targetRatio;\n // If height exceeds viewport, fit to height instead\n if (targetHeight > viewportHeight) {\n targetHeight = viewportHeight;\n targetWidth = targetHeight * targetRatio;\n }\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const parentWidth = container.offsetWidth || viewportWidth;\n const x = Math.round((parentWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n const parentHeight = container.offsetHeight || viewportHeight;\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = parentHeight - targetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((parentHeight - targetHeight) / 2);\n break;\n }\n this.videoElement.style.top = `${y}px`;\n }\n }\n this.videoElement.srcObject = stream;\n if (!this.isBackCamera) {\n this.videoElement.style.transform = \"scaleX(-1)\";\n }\n // Set initial zoom level if specified and supported\n if (options.initialZoomLevel && options.initialZoomLevel !== 1.0) {\n // videoTrack already declared above\n if (videoTrack) {\n const capabilities = videoTrack.getCapabilities();\n if (capabilities.zoom) {\n const zoomLevel = options.initialZoomLevel;\n const minZoom = capabilities.zoom.min || 1;\n const maxZoom = capabilities.zoom.max || 1;\n if (zoomLevel < minZoom || zoomLevel > maxZoom) {\n stream.getTracks().forEach((track) => track.stop());\n throw new Error(`Initial zoom level ${zoomLevel} is not available. Valid range is ${minZoom} to ${maxZoom}`);\n }\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n console.warn(`Failed to set initial zoom level: ${error}`);\n // Don't throw, just continue without zoom\n }\n }\n }\n }\n this.isStarted = true;\n // Wait for video to be ready and get actual dimensions\n await new Promise((resolve) => {\n if (this.videoElement.readyState >= 2) {\n resolve();\n }\n else {\n this.videoElement.addEventListener(\"loadeddata\", () => resolve(), {\n once: true,\n });\n }\n });\n // Ensure centering is applied after DOM updates\n await new Promise((resolve) => requestAnimationFrame(resolve));\n console.log(\"About to re-center, flags:\", { needsCenterX, needsCenterY });\n // Re-apply centering with correct parent dimensions\n if (needsCenterX) {\n const parentWidth = container.offsetWidth;\n const x = Math.round((parentWidth - this.videoElement.offsetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n console.log(\"Re-centering X:\", {\n parentWidth,\n videoWidth: this.videoElement.offsetWidth,\n x,\n });\n }\n if (needsCenterY) {\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = window.innerHeight - this.videoElement.offsetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((window.innerHeight - this.videoElement.offsetHeight) / 2);\n break;\n }\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n console.log(\"Re-positioning Y:\", {\n positioning,\n viewportHeight: window.innerHeight,\n videoHeight: this.videoElement.offsetHeight,\n y,\n position: this.videoElement.style.position,\n top: this.videoElement.style.top,\n });\n }\n // Get the actual rendered dimensions after video is loaded\n const rect = this.videoElement.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(this.videoElement);\n console.log(\"Final video element state:\", {\n rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },\n style: {\n position: computedStyle.position,\n left: computedStyle.left,\n top: computedStyle.top,\n width: computedStyle.width,\n height: computedStyle.height,\n },\n });\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n };\n }\n stopStream(stream) {\n if (stream) {\n const tracks = stream.getTracks();\n for (const track of tracks)\n track.stop();\n }\n }\n async stop() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.pause();\n this.stopStream(video.srcObject);\n video.remove();\n this.isStarted = false;\n }\n // Remove grid overlay if it exists\n const gridOverlay = document.getElementById(\"camera-grid-overlay\");\n gridOverlay === null || gridOverlay === void 0 ? void 0 : gridOverlay.remove();\n }\n async capture(options) {\n return new Promise((resolve, reject) => {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n reject(new Error(\"camera is not running\"));\n return;\n }\n // video.width = video.offsetWidth;\n let base64EncodedImage;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n // Calculate capture dimensions\n let captureWidth = video.videoWidth;\n let captureHeight = video.videoHeight;\n let sourceX = 0;\n let sourceY = 0;\n // Check for conflicting parameters\n if (options.aspectRatio && (options.width || options.height)) {\n reject(new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\"));\n return;\n }\n // Handle aspect ratio if no width/height specified\n if (!options.width && !options.height && options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio\n .split(\":\")\n .map(Number);\n if (widthRatio && heightRatio) {\n // For capture in portrait orientation, swap the aspect ratio (16:9 becomes 9:16)\n const isPortrait = video.videoHeight > video.videoWidth;\n const targetAspectRatio = isPortrait\n ? heightRatio / widthRatio\n : widthRatio / heightRatio;\n const videoAspectRatio = video.videoWidth / video.videoHeight;\n if (videoAspectRatio > targetAspectRatio) {\n // Video is wider than target - crop sides\n captureWidth = video.videoHeight * targetAspectRatio;\n captureHeight = video.videoHeight;\n sourceX = (video.videoWidth - captureWidth) / 2;\n }\n else {\n // Video is taller than target - crop top/bottom\n captureWidth = video.videoWidth;\n captureHeight = video.videoWidth / targetAspectRatio;\n sourceY = (video.videoHeight - captureHeight) / 2;\n }\n }\n }\n else if (options.width || options.height) {\n // If width or height is specified, use them\n if (options.width)\n captureWidth = options.width;\n if (options.height)\n captureHeight = options.height;\n }\n canvas.width = captureWidth;\n canvas.height = captureHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context === null || context === void 0 ? void 0 : context.translate(captureWidth, 0);\n context === null || context === void 0 ? void 0 : context.scale(-1, 1);\n }\n context === null || context === void 0 ? void 0 : context.drawImage(video, sourceX, sourceY, captureWidth, captureHeight, 0, 0, captureWidth, captureHeight);\n if (options.saveToGallery) {\n // saveToGallery is not supported on web\n }\n if (options.withExifLocation) {\n // withExifLocation is not supported on web\n }\n if ((options.format || \"jpeg\") === \"jpeg\") {\n base64EncodedImage = canvas\n .toDataURL(\"image/jpeg\", (options.quality || 85) / 100.0)\n .replace(\"data:image/jpeg;base64,\", \"\");\n }\n else {\n base64EncodedImage = canvas\n .toDataURL(\"image/png\")\n .replace(\"data:image/png;base64,\", \"\");\n }\n }\n resolve({\n value: base64EncodedImage,\n exif: {},\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async stopRecordVideo() {\n throw new Error(\"stopRecordVideo not supported under the web platform\");\n }\n async startRecordVideo(_options) {\n console.log(\"startRecordVideo\", _options);\n throw new Error(\"startRecordVideo not supported under the web platform\");\n }\n async getSupportedFlashModes() {\n throw new Error(\"getSupportedFlashModes not supported under the web platform\");\n }\n async getHorizontalFov() {\n throw new Error(\"getHorizontalFov not supported under the web platform\");\n }\n async setFlashMode(_options) {\n throw new Error(`setFlashMode not supported under the web platform${_options}`);\n }\n async flip() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Toggle camera position\n this.isBackCamera = !this.isBackCamera;\n // Get new constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update current device ID from the new stream\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n this.currentDeviceId = videoTrack.getSettings().deviceId || null;\n }\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to flip camera: ${error}`);\n }\n }\n async setOpacity(_options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!!video && !!_options.opacity)\n video.style.setProperty(\"opacity\", _options.opacity.toString());\n }\n async isRunning() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n return { isRunning: !!video && !!video.srcObject };\n }\n async getAvailableDevices() {\n var _a;\n if (!((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.enumerateDevices)) {\n throw new Error(\"getAvailableDevices not supported under the web platform\");\n }\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === \"videoinput\");\n // Group devices by position (front/back)\n const frontDevices = [];\n const backDevices = [];\n videoDevices.forEach((device, index) => {\n const label = device.label || `Camera ${index + 1}`;\n const labelLower = label.toLowerCase();\n // Determine device type based on label\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n const lensInfo = {\n deviceId: device.deviceId,\n label,\n deviceType,\n focalLength: 4.25,\n baseZoomRatio,\n minZoom: 1.0,\n maxZoom: 1.0,\n };\n // Determine position and add to appropriate array\n if (labelLower.includes(\"back\") || labelLower.includes(\"rear\")) {\n backDevices.push(lensInfo);\n }\n else {\n frontDevices.push(lensInfo);\n }\n });\n const result = [];\n if (frontDevices.length > 0) {\n result.push({\n deviceId: frontDevices[0].deviceId,\n label: \"Front Camera\",\n position: \"front\",\n lenses: frontDevices,\n isLogical: false,\n minZoom: Math.min(...frontDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...frontDevices.map((d) => d.maxZoom)),\n });\n }\n if (backDevices.length > 0) {\n result.push({\n deviceId: backDevices[0].deviceId,\n label: \"Back Camera\",\n position: \"rear\",\n lenses: backDevices,\n isLogical: false,\n minZoom: Math.min(...backDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...backDevices.map((d) => d.maxZoom)),\n });\n }\n return { devices: result };\n }\n async getZoom() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n const settings = videoTrack.getSettings();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n // Get current device info to determine lens type\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (this.currentDeviceId) {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === this.currentDeviceId);\n if (device) {\n const labelLower = device.label.toLowerCase();\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n }\n }\n const currentZoom = settings.zoom || 1;\n const lensInfo = {\n focalLength: 4.25,\n deviceType,\n baseZoomRatio,\n digitalZoom: currentZoom / baseZoomRatio,\n };\n return {\n min: capabilities.zoom.min || 1,\n max: capabilities.zoom.max || 1,\n current: currentZoom,\n lens: lensInfo,\n };\n }\n async setZoom(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n const zoomLevel = Math.max(capabilities.zoom.min || 1, Math.min(capabilities.zoom.max || 1, options.level));\n // Note: autoFocus is not supported on web platform\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n throw new Error(`Failed to set zoom: ${error}`);\n }\n }\n async getFlashMode() {\n throw new Error(\"getFlashMode not supported under the web platform\");\n }\n async getDeviceId() {\n return { deviceId: this.currentDeviceId || \"\" };\n }\n async setDeviceId(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Update current device ID\n this.currentDeviceId = options.deviceId;\n // Get new constraints with specific device ID\n const constraints = {\n video: {\n deviceId: { exact: options.deviceId },\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n // Try to determine camera position from device\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === options.deviceId);\n this.isBackCamera =\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"back\")) ||\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"rear\")) ||\n false;\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to swap to device ${options.deviceId}: ${error}`);\n }\n }\n async getAspectRatio() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const width = video.offsetWidth;\n const height = video.offsetHeight;\n if (width && height) {\n const ratio = width / height;\n // Check for portrait camera ratios: 4:3 -> 3:4, 16:9 -> 9:16\n if (Math.abs(ratio - 3 / 4) < 0.01) {\n return { aspectRatio: \"4:3\" };\n }\n if (Math.abs(ratio - 9 / 16) < 0.01) {\n return { aspectRatio: \"16:9\" };\n }\n }\n // Default to 4:3 if no specific aspect ratio is matched\n return { aspectRatio: \"4:3\" };\n }\n async setAspectRatio(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n if (options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio\n .split(\":\")\n .map(Number);\n // For camera, use portrait orientation: 4:3 becomes 3:4, 16:9 becomes 9:16\n const ratio = heightRatio / widthRatio;\n // Get current position and size\n const rect = video.getBoundingClientRect();\n const currentWidth = rect.width;\n const currentHeight = rect.height;\n const currentRatio = currentWidth / currentHeight;\n let newWidth;\n let newHeight;\n if (currentRatio > ratio) {\n // Width is larger, fit by height and center horizontally\n newWidth = currentHeight * ratio;\n newHeight = currentHeight;\n }\n else {\n // Height is larger, fit by width and center vertically\n newWidth = currentWidth;\n newHeight = currentWidth / ratio;\n }\n // Calculate position\n let x, y;\n if (options.x !== undefined && options.y !== undefined) {\n // Use provided coordinates, ensuring they stay within screen boundaries\n x = Math.max(0, Math.min(options.x, window.innerWidth - newWidth));\n y = Math.max(0, Math.min(options.y, window.innerHeight - newHeight));\n }\n else {\n // Auto-center the view\n x = (window.innerWidth - newWidth) / 2;\n y = (window.innerHeight - newHeight) / 2;\n }\n video.style.width = `${newWidth}px`;\n video.style.height = `${newHeight}px`;\n video.style.left = `${x}px`;\n video.style.top = `${y}px`;\n video.style.position = \"absolute\";\n const offsetX = newWidth / 8;\n const offsetY = newHeight / 8;\n return {\n width: Math.round(newWidth),\n height: Math.round(newHeight),\n x: Math.round(x + offsetX),\n y: Math.round(y + offsetY),\n };\n }\n else {\n video.style.objectFit = \"cover\";\n const rect = video.getBoundingClientRect();\n const offsetX = rect.width / 8;\n const offsetY = rect.height / 8;\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.left + offsetX),\n y: Math.round(rect.top + offsetY),\n };\n }\n }\n createGridOverlay(gridMode) {\n const overlay = document.createElement(\"div\");\n overlay.style.position = \"absolute\";\n overlay.style.top = \"0\";\n overlay.style.left = \"0\";\n overlay.style.width = \"100%\";\n overlay.style.height = \"100%\";\n overlay.style.pointerEvents = \"none\";\n overlay.style.zIndex = \"10\";\n const divisions = gridMode === \"3x3\" ? 3 : 4;\n // Create SVG for grid lines\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.style.width = \"100%\";\n svg.style.height = \"100%\";\n svg.style.position = \"absolute\";\n svg.style.top = \"0\";\n svg.style.left = \"0\";\n // Create grid lines\n for (let i = 1; i < divisions; i++) {\n // Vertical lines\n const verticalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n verticalLine.setAttribute(\"x1\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y1\", \"0%\");\n verticalLine.setAttribute(\"x2\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y2\", \"100%\");\n verticalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n verticalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(verticalLine);\n // Horizontal lines\n const horizontalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n horizontalLine.setAttribute(\"x1\", \"0%\");\n horizontalLine.setAttribute(\"y1\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"x2\", \"100%\");\n horizontalLine.setAttribute(\"y2\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n horizontalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(horizontalLine);\n }\n overlay.appendChild(svg);\n return overlay;\n }\n async setGridMode(options) {\n // Web implementation of grid mode would need to be implemented\n // For now, just resolve as a no-op\n console.warn(`Grid mode '${options.gridMode}' is not yet implemented for web platform`);\n }\n async getGridMode() {\n // Web implementation - default to none\n return { gridMode: \"none\" };\n }\n async getPreviewSize() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const offsetX = video.width / 8;\n const offsetY = video.height / 8;\n return {\n x: video.offsetLeft + offsetX,\n y: video.offsetTop + offsetY,\n width: video.width,\n height: video.height,\n };\n }\n async setPreviewSize(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n video.style.left = `${options.x}px`;\n video.style.top = `${options.y}px`;\n video.width = options.width;\n video.height = options.height;\n const offsetX = options.width / 8;\n const offsetY = options.height / 8;\n return {\n width: options.width,\n height: options.height,\n x: options.x + offsetX,\n y: options.y + offsetY,\n };\n }\n async setFocus(options) {\n // Reject if values are outside 0-1 range\n if (options.x < 0 || options.x > 1 || options.y < 0 || options.y > 1) {\n throw new Error(\"Focus coordinates must be between 0 and 1\");\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n // Check if focusing is supported\n if (capabilities.focusMode) {\n try {\n // Web API supports focus mode settings but not coordinate-based focus\n // Setting to manual mode allows for coordinate focus if supported\n await videoTrack.applyConstraints({\n advanced: [\n {\n focusMode: \"manual\",\n focusDistance: 0.5, // Mid-range focus as fallback\n },\n ],\n });\n }\n catch (error) {\n console.warn(`setFocus is not fully supported on this device: ${error}. Focus coordinates (${options.x}, ${options.y}) were provided but cannot be applied.`);\n }\n }\n else {\n console.warn(\"Focus control is not supported on this device. Focus coordinates were provided but cannot be applied.\");\n }\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["DeviceType","registerPlugin","WebPlugin"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sources":["esm/definitions.js","esm/index.js","esm/web.js"],"sourcesContent":["export var DeviceType;\n(function (DeviceType) {\n DeviceType[\"ULTRA_WIDE\"] = \"ultraWide\";\n DeviceType[\"WIDE_ANGLE\"] = \"wideAngle\";\n DeviceType[\"TELEPHOTO\"] = \"telephoto\";\n DeviceType[\"TRUE_DEPTH\"] = \"trueDepth\";\n DeviceType[\"DUAL\"] = \"dual\";\n DeviceType[\"DUAL_WIDE\"] = \"dualWide\";\n DeviceType[\"TRIPLE\"] = \"triple\";\n})(DeviceType || (DeviceType = {}));\n//# sourceMappingURL=definitions.js.map","import { Capacitor, registerPlugin } from \"@capacitor/core\";\nconst CameraPreview = registerPlugin(\"CameraPreview\", {\n web: () => import(\"./web\").then((m) => new m.CameraPreviewWeb()),\n});\nexport * from \"./definitions\";\nexport { CameraPreview };\nexport async function getBase64FromFilePath(filePath) {\n const url = Capacitor.convertFileSrc(filePath);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to read file at path: ${filePath} (status ${response.status})`);\n }\n const blob = await response.blob();\n return await new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const dataUrl = reader.result;\n const commaIndex = dataUrl.indexOf(\",\");\n resolve(commaIndex >= 0 ? dataUrl.substring(commaIndex + 1) : dataUrl);\n };\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(blob);\n });\n}\nexport async function deleteFile(path) {\n // Use native bridge to delete file to handle platform-specific permissions/URIs\n const { success } = await CameraPreview.deleteFile({ path });\n return !!success;\n}\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nimport { DeviceType } from \"./definitions\";\nconst DEFAULT_VIDEO_ID = \"capgo_video\";\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super();\n /**\n * track which camera is used based on start options\n * used in capture\n */\n this.isBackCamera = false;\n this.currentDeviceId = null;\n this.videoElement = null;\n this.isStarted = false;\n }\n async getZoomButtonValues() {\n throw new Error(\"getZoomButtonValues not supported under the web platform\");\n }\n async getSupportedPictureSizes() {\n throw new Error(\"getSupportedPictureSizes not supported under the web platform\");\n }\n async start(options) {\n if (options.aspectRatio && (options.width || options.height)) {\n throw new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\");\n }\n if (this.isStarted) {\n throw new Error(\"camera already started\");\n }\n this.isBackCamera = true;\n this.isStarted = false;\n const parent = document.getElementById((options === null || options === void 0 ? void 0 : options.parent) || \"\");\n const gridMode = (options === null || options === void 0 ? void 0 : options.gridMode) || \"none\";\n const positioning = (options === null || options === void 0 ? void 0 : options.positioning) || \"top\";\n if (options.position) {\n this.isBackCamera = options.position === \"rear\";\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.remove();\n }\n const container = options.parent\n ? document.getElementById(options.parent)\n : document.body;\n if (!container) {\n throw new Error(\"container not found\");\n }\n this.videoElement = document.createElement(\"video\");\n this.videoElement.id = DEFAULT_VIDEO_ID;\n this.videoElement.className = options.className || \"\";\n this.videoElement.playsInline = true;\n this.videoElement.muted = true;\n this.videoElement.autoplay = true;\n // Remove objectFit as we'll match camera's native aspect ratio\n this.videoElement.style.backgroundColor = \"transparent\";\n // Reset any default margins that might interfere\n this.videoElement.style.margin = \"0\";\n this.videoElement.style.padding = \"0\";\n container.appendChild(this.videoElement);\n if (options.toBack) {\n this.videoElement.style.zIndex = \"-1\";\n }\n // Default to 4:3 if no aspect ratio or size specified\n const useDefaultAspectRatio = !options.aspectRatio && !options.width && !options.height;\n const effectiveAspectRatio = options.aspectRatio || (useDefaultAspectRatio ? \"4:3\" : null);\n if (options.width) {\n this.videoElement.width = options.width;\n this.videoElement.style.width = `${options.width}px`;\n }\n if (options.height) {\n this.videoElement.height = options.height;\n this.videoElement.style.height = `${options.height}px`;\n }\n // Handle positioning - center if x or y not provided\n const centerX = options.x === undefined;\n const centerY = options.y === undefined;\n // Always set position to absolute for proper positioning\n this.videoElement.style.position = \"absolute\";\n console.log(\"Initial positioning flags:\", {\n centerX,\n centerY,\n x: options.x,\n y: options.y,\n });\n if (options.x !== undefined) {\n this.videoElement.style.left = `${options.x}px`;\n }\n if (options.y !== undefined) {\n this.videoElement.style.top = `${options.y}px`;\n }\n // Create and add grid overlay if needed\n if (gridMode !== \"none\") {\n const gridOverlay = this.createGridOverlay(gridMode);\n gridOverlay.id = \"camera-grid-overlay\";\n parent === null || parent === void 0 ? void 0 : parent.appendChild(gridOverlay);\n }\n // Aspect ratio handling is now done after getting camera stream\n // Store centering flags for later use\n const needsCenterX = centerX;\n const needsCenterY = centerY;\n console.log(\"Centering flags stored:\", { needsCenterX, needsCenterY });\n // First get the camera stream with basic constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n },\n };\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n if (!stream) {\n throw new Error(\"could not acquire stream\");\n }\n if (!this.videoElement) {\n throw new Error(\"video element not found\");\n }\n // Get the actual camera dimensions from the video track\n const videoTrack = stream.getVideoTracks()[0];\n const settings = videoTrack.getSettings();\n const cameraWidth = settings.width || 640;\n const cameraHeight = settings.height || 480;\n const cameraAspectRatio = cameraWidth / cameraHeight;\n console.log(\"Camera native dimensions:\", {\n width: cameraWidth,\n height: cameraHeight,\n aspectRatio: cameraAspectRatio,\n });\n console.log(\"Container dimensions:\", {\n width: container.offsetWidth,\n height: container.offsetHeight,\n id: container.id,\n });\n // Now adjust video element size based on camera's native aspect ratio\n if (!options.width && !options.height && !options.aspectRatio) {\n // No size specified, fit camera view within container bounds\n const containerWidth = container.offsetWidth || window.innerWidth;\n const containerHeight = container.offsetHeight || window.innerHeight;\n // Calculate dimensions that fit within container while maintaining camera aspect ratio\n let targetWidth, targetHeight;\n // Try fitting to container width first\n targetWidth = containerWidth;\n targetHeight = targetWidth / cameraAspectRatio;\n // If height exceeds container, fit to height instead\n if (targetHeight > containerHeight) {\n targetHeight = containerHeight;\n targetWidth = targetHeight * cameraAspectRatio;\n }\n console.log(\"Video element dimensions:\", {\n width: targetWidth,\n height: targetHeight,\n container: { width: containerWidth, height: containerHeight },\n });\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const x = Math.round((containerWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = window.innerHeight - targetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((window.innerHeight - targetHeight) / 2);\n break;\n }\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n // Force a style recalculation\n this.videoElement.offsetHeight;\n console.log(\"Positioning video:\", {\n positioning,\n viewportHeight: window.innerHeight,\n targetHeight,\n calculatedY: y,\n actualTop: this.videoElement.style.top,\n position: this.videoElement.style.position,\n });\n }\n }\n else if (effectiveAspectRatio && !options.width && !options.height) {\n // Aspect ratio specified but no size\n const [widthRatio, heightRatio] = effectiveAspectRatio\n .split(\":\")\n .map(Number);\n const targetRatio = widthRatio / heightRatio;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n let targetWidth, targetHeight;\n // Try fitting to viewport width first\n targetWidth = viewportWidth;\n targetHeight = targetWidth / targetRatio;\n // If height exceeds viewport, fit to height instead\n if (targetHeight > viewportHeight) {\n targetHeight = viewportHeight;\n targetWidth = targetHeight * targetRatio;\n }\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const parentWidth = container.offsetWidth || viewportWidth;\n const x = Math.round((parentWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n const parentHeight = container.offsetHeight || viewportHeight;\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = parentHeight - targetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((parentHeight - targetHeight) / 2);\n break;\n }\n this.videoElement.style.top = `${y}px`;\n }\n }\n this.videoElement.srcObject = stream;\n if (!this.isBackCamera) {\n this.videoElement.style.transform = \"scaleX(-1)\";\n }\n // Set initial zoom level if specified and supported\n if (options.initialZoomLevel !== undefined &&\n options.initialZoomLevel !== 1.0) {\n // videoTrack already declared above\n if (videoTrack) {\n const capabilities = videoTrack.getCapabilities();\n if (capabilities.zoom) {\n const zoomLevel = options.initialZoomLevel;\n const minZoom = capabilities.zoom.min || 1;\n const maxZoom = capabilities.zoom.max || 1;\n if (zoomLevel < minZoom || zoomLevel > maxZoom) {\n stream.getTracks().forEach((track) => track.stop());\n throw new Error(`Initial zoom level ${zoomLevel} is not available. Valid range is ${minZoom} to ${maxZoom}`);\n }\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n console.warn(`Failed to set initial zoom level: ${error}`);\n // Don't throw, just continue without zoom\n }\n }\n }\n }\n this.isStarted = true;\n // Wait for video to be ready and get actual dimensions\n await new Promise((resolve) => {\n const videoEl = this.videoElement;\n if (!videoEl) {\n throw new Error(\"video element not found\");\n }\n if (videoEl.readyState >= 2) {\n resolve();\n }\n else {\n videoEl.addEventListener(\"loadeddata\", () => resolve(), {\n once: true,\n });\n }\n });\n // Ensure centering is applied after DOM updates\n await new Promise((resolve) => requestAnimationFrame(resolve));\n console.log(\"About to re-center, flags:\", { needsCenterX, needsCenterY });\n // Re-apply centering with correct parent dimensions\n if (needsCenterX) {\n const parentWidth = container.offsetWidth;\n const x = Math.round((parentWidth - this.videoElement.offsetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n console.log(\"Re-centering X:\", {\n parentWidth,\n videoWidth: this.videoElement.offsetWidth,\n x,\n });\n }\n if (needsCenterY) {\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = window.innerHeight - this.videoElement.offsetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((window.innerHeight - this.videoElement.offsetHeight) / 2);\n break;\n }\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n console.log(\"Re-positioning Y:\", {\n positioning,\n viewportHeight: window.innerHeight,\n videoHeight: this.videoElement.offsetHeight,\n y,\n position: this.videoElement.style.position,\n top: this.videoElement.style.top,\n });\n }\n // Get the actual rendered dimensions after video is loaded\n const rect = this.videoElement.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(this.videoElement);\n console.log(\"Final video element state:\", {\n rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },\n style: {\n position: computedStyle.position,\n left: computedStyle.left,\n top: computedStyle.top,\n width: computedStyle.width,\n height: computedStyle.height,\n },\n });\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n };\n }\n stopStream(stream) {\n if (stream) {\n const tracks = stream.getTracks();\n for (const track of tracks)\n track.stop();\n }\n }\n async stop() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.pause();\n this.stopStream(video.srcObject);\n video.remove();\n this.isStarted = false;\n }\n // Remove grid overlay if it exists\n const gridOverlay = document.getElementById(\"camera-grid-overlay\");\n gridOverlay === null || gridOverlay === void 0 ? void 0 : gridOverlay.remove();\n }\n async capture(options) {\n return new Promise((resolve, reject) => {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n reject(new Error(\"camera is not running\"));\n return;\n }\n // video.width = video.offsetWidth;\n let base64EncodedImage;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n // Calculate capture dimensions\n let captureWidth = video.videoWidth;\n let captureHeight = video.videoHeight;\n let sourceX = 0;\n let sourceY = 0;\n // Check for conflicting parameters\n if (options.aspectRatio && (options.width || options.height)) {\n reject(new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\"));\n return;\n }\n // Handle aspect ratio if no width/height specified\n if (!options.width && !options.height && options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio\n .split(\":\")\n .map(Number);\n if (widthRatio && heightRatio) {\n // For capture in portrait orientation, swap the aspect ratio (16:9 becomes 9:16)\n const isPortrait = video.videoHeight > video.videoWidth;\n const targetAspectRatio = isPortrait\n ? heightRatio / widthRatio\n : widthRatio / heightRatio;\n const videoAspectRatio = video.videoWidth / video.videoHeight;\n if (videoAspectRatio > targetAspectRatio) {\n // Video is wider than target - crop sides\n captureWidth = video.videoHeight * targetAspectRatio;\n captureHeight = video.videoHeight;\n sourceX = (video.videoWidth - captureWidth) / 2;\n }\n else {\n // Video is taller than target - crop top/bottom\n captureWidth = video.videoWidth;\n captureHeight = video.videoWidth / targetAspectRatio;\n sourceY = (video.videoHeight - captureHeight) / 2;\n }\n }\n }\n else if (options.width || options.height) {\n // If width or height is specified, use them\n if (options.width)\n captureWidth = options.width;\n if (options.height)\n captureHeight = options.height;\n }\n canvas.width = captureWidth;\n canvas.height = captureHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context === null || context === void 0 ? void 0 : context.translate(captureWidth, 0);\n context === null || context === void 0 ? void 0 : context.scale(-1, 1);\n }\n context === null || context === void 0 ? void 0 : context.drawImage(video, sourceX, sourceY, captureWidth, captureHeight, 0, 0, captureWidth, captureHeight);\n if (options.saveToGallery) {\n // saveToGallery is not supported on web\n }\n if (options.withExifLocation) {\n // withExifLocation is not supported on web\n }\n if ((options.format || \"jpeg\") === \"jpeg\") {\n base64EncodedImage = canvas\n .toDataURL(\"image/jpeg\", (options.quality || 85) / 100.0)\n .replace(\"data:image/jpeg;base64,\", \"\");\n }\n else {\n base64EncodedImage = canvas\n .toDataURL(\"image/png\")\n .replace(\"data:image/png;base64,\", \"\");\n }\n }\n resolve({\n value: base64EncodedImage,\n exif: {},\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async stopRecordVideo() {\n throw new Error(\"stopRecordVideo not supported under the web platform\");\n }\n async startRecordVideo(_options) {\n console.log(\"startRecordVideo\", _options);\n throw new Error(\"startRecordVideo not supported under the web platform\");\n }\n async getSupportedFlashModes() {\n throw new Error(\"getSupportedFlashModes not supported under the web platform\");\n }\n async getHorizontalFov() {\n throw new Error(\"getHorizontalFov not supported under the web platform\");\n }\n async setFlashMode(_options) {\n throw new Error(`setFlashMode not supported under the web platform${_options}`);\n }\n async flip() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Toggle camera position\n this.isBackCamera = !this.isBackCamera;\n // Get new constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update current device ID from the new stream\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n this.currentDeviceId = videoTrack.getSettings().deviceId || null;\n }\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to flip camera: ${error}`);\n }\n }\n async setOpacity(_options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!!video && !!_options.opacity)\n video.style.setProperty(\"opacity\", _options.opacity.toString());\n }\n async isRunning() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n return { isRunning: !!video && !!video.srcObject };\n }\n async getAvailableDevices() {\n var _a;\n if (!((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.enumerateDevices)) {\n throw new Error(\"getAvailableDevices not supported under the web platform\");\n }\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === \"videoinput\");\n // Group devices by position (front/back)\n const frontDevices = [];\n const backDevices = [];\n videoDevices.forEach((device, index) => {\n const label = device.label || `Camera ${index + 1}`;\n const labelLower = label.toLowerCase();\n // Determine device type based on label\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n const lensInfo = {\n deviceId: device.deviceId,\n label,\n deviceType,\n focalLength: 4.25,\n baseZoomRatio,\n minZoom: 1.0,\n maxZoom: 1.0,\n };\n // Determine position and add to appropriate array\n if (labelLower.includes(\"back\") || labelLower.includes(\"rear\")) {\n backDevices.push(lensInfo);\n }\n else {\n frontDevices.push(lensInfo);\n }\n });\n const result = [];\n if (frontDevices.length > 0) {\n result.push({\n deviceId: frontDevices[0].deviceId,\n label: \"Front Camera\",\n position: \"front\",\n lenses: frontDevices,\n isLogical: false,\n minZoom: Math.min(...frontDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...frontDevices.map((d) => d.maxZoom)),\n });\n }\n if (backDevices.length > 0) {\n result.push({\n deviceId: backDevices[0].deviceId,\n label: \"Back Camera\",\n position: \"rear\",\n lenses: backDevices,\n isLogical: false,\n minZoom: Math.min(...backDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...backDevices.map((d) => d.maxZoom)),\n });\n }\n return { devices: result };\n }\n async getZoom() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n const settings = videoTrack.getSettings();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n // Get current device info to determine lens type\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (this.currentDeviceId) {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === this.currentDeviceId);\n if (device) {\n const labelLower = device.label.toLowerCase();\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n }\n }\n const currentZoom = settings.zoom || 1;\n const lensInfo = {\n focalLength: 4.25,\n deviceType,\n baseZoomRatio,\n digitalZoom: currentZoom / baseZoomRatio,\n };\n return {\n min: capabilities.zoom.min || 1,\n max: capabilities.zoom.max || 1,\n current: currentZoom,\n lens: lensInfo,\n };\n }\n async setZoom(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n const zoomLevel = Math.max(capabilities.zoom.min || 1, Math.min(capabilities.zoom.max || 1, options.level));\n // Note: autoFocus is not supported on web platform\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n throw new Error(`Failed to set zoom: ${error}`);\n }\n }\n async getFlashMode() {\n throw new Error(\"getFlashMode not supported under the web platform\");\n }\n async getDeviceId() {\n return { deviceId: this.currentDeviceId || \"\" };\n }\n async setDeviceId(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Update current device ID\n this.currentDeviceId = options.deviceId;\n // Get new constraints with specific device ID\n const constraints = {\n video: {\n deviceId: { exact: options.deviceId },\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n // Try to determine camera position from device\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === options.deviceId);\n this.isBackCamera =\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"back\")) ||\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"rear\")) ||\n false;\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to swap to device ${options.deviceId}: ${error}`);\n }\n }\n async getAspectRatio() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const width = video.offsetWidth;\n const height = video.offsetHeight;\n if (width && height) {\n const ratio = width / height;\n // Check for portrait camera ratios: 4:3 -> 3:4, 16:9 -> 9:16\n if (Math.abs(ratio - 3 / 4) < 0.01) {\n return { aspectRatio: \"4:3\" };\n }\n if (Math.abs(ratio - 9 / 16) < 0.01) {\n return { aspectRatio: \"16:9\" };\n }\n }\n // Default to 4:3 if no specific aspect ratio is matched\n return { aspectRatio: \"4:3\" };\n }\n async setAspectRatio(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n if (options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio\n .split(\":\")\n .map(Number);\n // For camera, use portrait orientation: 4:3 becomes 3:4, 16:9 becomes 9:16\n const ratio = heightRatio / widthRatio;\n // Get current position and size\n const rect = video.getBoundingClientRect();\n const currentWidth = rect.width;\n const currentHeight = rect.height;\n const currentRatio = currentWidth / currentHeight;\n let newWidth;\n let newHeight;\n if (currentRatio > ratio) {\n // Width is larger, fit by height and center horizontally\n newWidth = currentHeight * ratio;\n newHeight = currentHeight;\n }\n else {\n // Height is larger, fit by width and center vertically\n newWidth = currentWidth;\n newHeight = currentWidth / ratio;\n }\n // Calculate position\n let x, y;\n if (options.x !== undefined && options.y !== undefined) {\n // Use provided coordinates, ensuring they stay within screen boundaries\n x = Math.max(0, Math.min(options.x, window.innerWidth - newWidth));\n y = Math.max(0, Math.min(options.y, window.innerHeight - newHeight));\n }\n else {\n // Auto-center the view\n x = (window.innerWidth - newWidth) / 2;\n y = (window.innerHeight - newHeight) / 2;\n }\n video.style.width = `${newWidth}px`;\n video.style.height = `${newHeight}px`;\n video.style.left = `${x}px`;\n video.style.top = `${y}px`;\n video.style.position = \"absolute\";\n const offsetX = newWidth / 8;\n const offsetY = newHeight / 8;\n return {\n width: Math.round(newWidth),\n height: Math.round(newHeight),\n x: Math.round(x + offsetX),\n y: Math.round(y + offsetY),\n };\n }\n else {\n video.style.objectFit = \"cover\";\n const rect = video.getBoundingClientRect();\n const offsetX = rect.width / 8;\n const offsetY = rect.height / 8;\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.left + offsetX),\n y: Math.round(rect.top + offsetY),\n };\n }\n }\n createGridOverlay(gridMode) {\n const overlay = document.createElement(\"div\");\n overlay.style.position = \"absolute\";\n overlay.style.top = \"0\";\n overlay.style.left = \"0\";\n overlay.style.width = \"100%\";\n overlay.style.height = \"100%\";\n overlay.style.pointerEvents = \"none\";\n overlay.style.zIndex = \"10\";\n const divisions = gridMode === \"3x3\" ? 3 : 4;\n // Create SVG for grid lines\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.style.width = \"100%\";\n svg.style.height = \"100%\";\n svg.style.position = \"absolute\";\n svg.style.top = \"0\";\n svg.style.left = \"0\";\n // Create grid lines\n for (let i = 1; i < divisions; i++) {\n // Vertical lines\n const verticalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n verticalLine.setAttribute(\"x1\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y1\", \"0%\");\n verticalLine.setAttribute(\"x2\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y2\", \"100%\");\n verticalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n verticalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(verticalLine);\n // Horizontal lines\n const horizontalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n horizontalLine.setAttribute(\"x1\", \"0%\");\n horizontalLine.setAttribute(\"y1\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"x2\", \"100%\");\n horizontalLine.setAttribute(\"y2\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n horizontalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(horizontalLine);\n }\n overlay.appendChild(svg);\n return overlay;\n }\n async setGridMode(options) {\n // Web implementation of grid mode would need to be implemented\n // For now, just resolve as a no-op\n console.warn(`Grid mode '${options.gridMode}' is not yet implemented for web platform`);\n }\n async getGridMode() {\n // Web implementation - default to none\n return { gridMode: \"none\" };\n }\n async getPreviewSize() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const offsetX = video.width / 8;\n const offsetY = video.height / 8;\n return {\n x: video.offsetLeft + offsetX,\n y: video.offsetTop + offsetY,\n width: video.width,\n height: video.height,\n };\n }\n async setPreviewSize(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n video.style.left = `${options.x}px`;\n video.style.top = `${options.y}px`;\n video.width = options.width;\n video.height = options.height;\n const offsetX = options.width / 8;\n const offsetY = options.height / 8;\n return {\n width: options.width,\n height: options.height,\n x: options.x + offsetX,\n y: options.y + offsetY,\n };\n }\n async setFocus(options) {\n // Reject if values are outside 0-1 range\n if (options.x < 0 || options.x > 1 || options.y < 0 || options.y > 1) {\n throw new Error(\"Focus coordinates must be between 0 and 1\");\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n // Check if focusing is supported\n if (capabilities.focusMode) {\n try {\n // Web API supports focus mode settings but not coordinate-based focus\n // Setting to manual mode allows for coordinate focus if supported\n await videoTrack.applyConstraints({\n advanced: [\n {\n focusMode: \"manual\",\n focusDistance: 0.5, // Mid-range focus as fallback\n },\n ],\n });\n }\n catch (error) {\n console.warn(`setFocus is not fully supported on this device: ${error}. Focus coordinates (${options.x}, ${options.y}) were provided but cannot be applied.`);\n }\n }\n else {\n console.warn(\"Focus control is not supported on this device. Focus coordinates were provided but cannot be applied.\");\n }\n }\n async deleteFile(_options) {\n // Mark parameter as intentionally unused to satisfy linter\n void _options;\n throw new Error(\"deleteFile not supported under the web platform\");\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["DeviceType","registerPlugin","Capacitor","WebPlugin"],"mappings":"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"}
@@ -25,7 +25,7 @@ class CameraController: NSObject {
25
25
  var focusIndicatorView: UIView?
26
26
 
27
27
  var flashMode = AVCaptureDevice.FlashMode.off
28
- var photoCaptureCompletionBlock: ((UIImage?, Error?) -> Void)?
28
+ var photoCaptureCompletionBlock: ((UIImage?, Data?, [AnyHashable: Any]?, Error?) -> Void)?
29
29
 
30
30
  var sampleBufferCaptureCompletionBlock: ((UIImage?, Error?) -> Void)?
31
31
 
@@ -51,6 +51,25 @@ class CameraController: NSObject {
51
51
  // A rear multi-lens virtual camera will have a min zoom of 1.0 but support wider angles
52
52
  return device.position == .back && device.isVirtualDevice && device.constituentDevices.count > 1
53
53
  }
54
+
55
+ // Returns the display zoom multiplier introduced in iOS 18 to map between
56
+ // native zoom factor and the UI-displayed zoom factor. Falls back to 1.0 on
57
+ // older systems or if the property is unavailable.
58
+ func getDisplayZoomMultiplier() -> Float {
59
+ var multiplier: Float = 1.0
60
+ // Use KVC to avoid compile-time dependency on the iOS 18 SDK symbol
61
+ let device = (currentCameraPosition == .rear) ? rearCamera : frontCamera
62
+ if #available(iOS 18.0, *), let device = device {
63
+ if let value = device.value(forKey: "displayVideoZoomFactorMultiplier") as? NSNumber {
64
+ let m = value.floatValue
65
+ if m > 0 { multiplier = m }
66
+ }
67
+ }
68
+ return multiplier
69
+ }
70
+
71
+ // Track whether an aspect ratio was explicitly requested
72
+ var requestedAspectRatio: String?
54
73
  }
55
74
 
56
75
  extension CameraController {
@@ -169,7 +188,7 @@ extension CameraController {
169
188
  self.outputsPrepared = true
170
189
  }
171
190
 
172
- func prepare(cameraPosition: String, deviceId: String? = nil, disableAudio: Bool, cameraMode: Bool, aspectRatio: String? = nil, initialZoomLevel: Float = 1.0, completionHandler: @escaping (Error?) -> Void) {
191
+ func prepare(cameraPosition: String, deviceId: String? = nil, disableAudio: Bool, cameraMode: Bool, aspectRatio: String? = nil, initialZoomLevel: Float?, completionHandler: @escaping (Error?) -> Void) {
173
192
  print("[CameraPreview] 🎬 Starting prepare - position: \(cameraPosition), deviceId: \(deviceId ?? "nil"), disableAudio: \(disableAudio), cameraMode: \(cameraMode), aspectRatio: \(aspectRatio ?? "nil"), zoom: \(initialZoomLevel)")
174
193
 
175
194
  DispatchQueue.global(qos: .userInitiated).async { [weak self] in
@@ -196,7 +215,8 @@ extension CameraController {
196
215
  // Configure the session
197
216
  captureSession.beginConfiguration()
198
217
 
199
- // Set aspect ratio preset
218
+ // Set aspect ratio preset and remember requested ratio
219
+ self.requestedAspectRatio = aspectRatio
200
220
  self.configureSessionPreset(for: aspectRatio)
201
221
 
202
222
  // Configure device inputs
@@ -253,15 +273,18 @@ extension CameraController {
253
273
  guard let captureSession = self.captureSession else { return }
254
274
 
255
275
  var targetPreset: AVCaptureSession.Preset = .high
256
-
257
276
  if let aspectRatio = aspectRatio {
258
277
  switch aspectRatio {
259
278
  case "16:9":
260
- targetPreset = captureSession.canSetSessionPreset(.hd1920x1080) ? .hd1920x1080 : .high
279
+ if captureSession.canSetSessionPreset(.hd4K3840x2160) {
280
+ targetPreset = .hd4K3840x2160
281
+ } else if captureSession.canSetSessionPreset(.hd1920x1080) {
282
+ targetPreset = .hd1920x1080
283
+ }
261
284
  case "4:3":
262
- targetPreset = captureSession.canSetSessionPreset(.photo) ? .photo : .high
285
+ targetPreset = captureSession.canSetSessionPreset(.high) ? .high : captureSession.sessionPreset
263
286
  default:
264
- targetPreset = .high
287
+ targetPreset = captureSession.canSetSessionPreset(.high) ? .high : captureSession.sessionPreset
265
288
  }
266
289
  }
267
290
 
@@ -270,7 +293,7 @@ extension CameraController {
270
293
  }
271
294
  }
272
295
 
273
- private func setInitialZoom(level: Float) {
296
+ private func setInitialZoom(level: Float?) {
274
297
  let device = (currentCameraPosition == .rear) ? rearCamera : frontCamera
275
298
  guard let device = device else {
276
299
  print("[CameraPreview] No device available for initial zoom")
@@ -280,7 +303,12 @@ extension CameraController {
280
303
  let minZoom = device.minAvailableVideoZoomFactor
281
304
  let maxZoom = min(device.maxAvailableVideoZoomFactor, saneMaxZoomFactor)
282
305
 
283
- let adjustedLevel = level
306
+ // Compute UI-level default = 1 * multiplier when not provided
307
+ let multiplier = self.getDisplayZoomMultiplier()
308
+ // if level is nil, it's the initial zoom
309
+ let uiLevel: Float = level ?? (2.0 * multiplier)
310
+ // Map UI/display zoom to native zoom using iOS 18+ multiplier
311
+ let adjustedLevel = multiplier != 1.0 ? (uiLevel / multiplier) : uiLevel
284
312
 
285
313
  guard CGFloat(adjustedLevel) >= minZoom && CGFloat(adjustedLevel) <= maxZoom else {
286
314
  print("[CameraPreview] Initial zoom level \(adjustedLevel) out of range (\(minZoom)-\(maxZoom))")
@@ -376,7 +404,8 @@ extension CameraController {
376
404
  }
377
405
 
378
406
  // Fast configuration without CATransaction overhead
379
- previewLayer.videoGravity = .resizeAspectFill
407
+ // Use resizeAspect to avoid crop when no aspect ratio is requested; otherwise fill
408
+ previewLayer.videoGravity = (requestedAspectRatio == nil) ? .resizeAspect : .resizeAspectFill
380
409
  previewLayer.frame = view.bounds
381
410
 
382
411
  // Insert layer immediately (only if new)
@@ -555,15 +584,22 @@ extension CameraController {
555
584
  self.updateVideoOrientation()
556
585
  }
557
586
 
558
- func captureImage(width: Int?, height: Int?, aspectRatio: String?, quality: Float, gpsLocation: CLLocation?, completion: @escaping (UIImage?, Error?) -> Void) {
587
+ func captureImage(width: Int?, height: Int?, aspectRatio: String?, quality: Float, gpsLocation: CLLocation?, completion: @escaping (UIImage?, Data?, [AnyHashable: Any]?, Error?) -> Void) {
559
588
  print("[CameraPreview] captureImage called - width: \(width ?? -1), height: \(height ?? -1), aspectRatio: \(aspectRatio ?? "nil")")
560
589
 
561
590
  guard let photoOutput = self.photoOutput else {
562
- completion(nil, NSError(domain: "Camera", code: 0, userInfo: [NSLocalizedDescriptionKey: "Photo output is not available"]))
591
+ completion(nil, nil, nil, NSError(domain: "Camera", code: 0, userInfo: [NSLocalizedDescriptionKey: "Photo output is not available"]))
563
592
  return
564
593
  }
565
594
 
566
595
  let settings = AVCapturePhotoSettings()
596
+ // Request highest quality photo capture
597
+ if #available(iOS 13.0, *) {
598
+ settings.isHighResolutionPhotoEnabled = true
599
+ }
600
+ if #available(iOS 15.0, *) {
601
+ settings.photoQualityPrioritization = .balanced
602
+ }
567
603
 
568
604
  // Apply the current flash mode to the photo settings
569
605
  // Check if the current device supports flash
@@ -585,14 +621,14 @@ extension CameraController {
585
621
  }
586
622
  }
587
623
 
588
- self.photoCaptureCompletionBlock = { (image, error) in
624
+ self.photoCaptureCompletionBlock = { (image, photoData, metadata, error) in
589
625
  if let error = error {
590
- completion(nil, error)
626
+ completion(nil, nil, nil, error)
591
627
  return
592
628
  }
593
629
 
594
630
  guard let image = image else {
595
- completion(nil, NSError(domain: "Camera", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to capture image"]))
631
+ completion(nil, nil, nil, NSError(domain: "Camera", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to capture image"]))
596
632
  return
597
633
  }
598
634
 
@@ -646,7 +682,7 @@ extension CameraController {
646
682
  }
647
683
  }
648
684
 
649
- completion(finalImage, nil)
685
+ completion(finalImage, photoData, metadata, nil)
650
686
  }
651
687
 
652
688
  photoOutput.capturePhoto(with: settings, delegate: self)
@@ -804,6 +840,7 @@ extension CameraController {
804
840
  return supportedFlashModesAsStrings
805
841
 
806
842
  }
843
+
807
844
  func getHorizontalFov() throws -> Float {
808
845
  var currentCamera: AVCaptureDevice?
809
846
  switch currentCameraPosition {
@@ -830,6 +867,7 @@ extension CameraController {
830
867
 
831
868
  return adjustedFov
832
869
  }
870
+
833
871
  func setFlashMode(flashMode: AVCaptureDevice.FlashMode) throws {
834
872
  var currentCamera: AVCaptureDevice?
835
873
  switch currentCameraPosition {
@@ -903,6 +941,7 @@ extension CameraController {
903
941
 
904
942
  func getZoom() throws -> (min: Float, max: Float, current: Float) {
905
943
  var currentCamera: AVCaptureDevice?
944
+
906
945
  switch currentCameraPosition {
907
946
  case .front:
908
947
  currentCamera = self.frontCamera
@@ -957,9 +996,9 @@ extension CameraController {
957
996
  self.zoomFactor = zoomLevel
958
997
 
959
998
  // Trigger autofocus after zoom if requested
960
- // if autoFocus {
961
- // self.triggerAutoFocus()
962
- // }
999
+ if autoFocus {
1000
+ self.triggerAutoFocus()
1001
+ }
963
1002
  } catch {
964
1003
  throw CameraControllerError.invalidOperation
965
1004
  }
@@ -1460,22 +1499,23 @@ extension CameraController: UIGestureRecognizerDelegate {
1460
1499
  extension CameraController: AVCapturePhotoCaptureDelegate {
1461
1500
  public func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
1462
1501
  if let error = error {
1463
- self.photoCaptureCompletionBlock?(nil, error)
1502
+ self.photoCaptureCompletionBlock?(nil, nil, nil, error)
1464
1503
  return
1465
1504
  }
1466
1505
 
1467
1506
  // Get the photo data using the modern API
1468
1507
  guard let imageData = photo.fileDataRepresentation() else {
1469
- self.photoCaptureCompletionBlock?(nil, CameraControllerError.unknown)
1508
+ self.photoCaptureCompletionBlock?(nil, nil, nil, CameraControllerError.unknown)
1470
1509
  return
1471
1510
  }
1472
1511
 
1473
1512
  guard let image = UIImage(data: imageData) else {
1474
- self.photoCaptureCompletionBlock?(nil, CameraControllerError.unknown)
1513
+ self.photoCaptureCompletionBlock?(nil, nil, nil, CameraControllerError.unknown)
1475
1514
  return
1476
1515
  }
1477
1516
 
1478
- self.photoCaptureCompletionBlock?(image.fixedOrientation(), nil)
1517
+ // Pass through original file data and metadata so callers can preserve EXIF
1518
+ self.photoCaptureCompletionBlock?(image.fixedOrientation(), imageData, photo.metadata, nil)
1479
1519
  }
1480
1520
  }
1481
1521