{"version":3,"file":"capacitor.cjs","names":["Haptics","registerPlugin"],"sources":["../../node_modules/@capacitor/haptics/dist/esm/index.js","../../src/capacitor.ts"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst Haptics = registerPlugin('Haptics', {\n    web: () => import('./web').then((m) => new m.HapticsWeb()),\n});\nexport * from './definitions';\nexport { Haptics };\n//# sourceMappingURL=index.js.map","/**\n * @deijose/nix-ionic / capacitor.ts\n *\n * Optional Capacitor integration for native mobile apps. This module is\n * isolated behind the `@deijose/nix-ionic/capacitor` subpath so the main\n * web bundle has ZERO Capacitor dependency cost.\n *\n * All `@capacitor/*` imports are dynamic — they are only loaded when the\n * app runs in a Capacitor native environment. On web, every wrapper is\n * a safe no-op or returns a sensible default.\n *\n * @example Bootstrap a mobile app\n * ```ts\n * // app.ts — only imported in native builds\n * import { createCapacitorApp } from \"@deijose/nix-ionic/capacitor\";\n *\n * const app = createCapacitorApp({\n *   statusBar: { style: \"dark\", backgroundColor: \"#1a1a2e\" },\n *   splashScreen: { fadeOutDuration: 200 },\n *   backButton: { defaultHref: \"/\" },\n * });\n * await app.ready();\n * ```\n *\n * @example Individual plugin usage\n * ```ts\n * import { Haptics, StatusBar } from \"@deijose/nix-ionic/capacitor\";\n *\n * // No-op on web, vibrates on native\n * Haptics.impact(\"medium\");\n *\n * // No-op on web, sets status bar on native\n * await StatusBar.setStyle({ style: \"dark\" });\n * ```\n */\n\n// --- Types (type-only imports — zero runtime cost) ---\n\nimport { Style as StatusBarStyle } from \"@capacitor/status-bar\";\nimport { ImpactStyle, NotificationType } from \"@capacitor/haptics\";\nimport type { KeyboardStyle, KeyboardResize } from \"@capacitor/keyboard\";\nimport type { URLOpenListenerEvent, AppState } from \"@capacitor/app\";\n\n// Re-export types for consumers\nexport type { StatusBarStyle, ImpactStyle, NotificationType, KeyboardStyle, KeyboardResize, URLOpenListenerEvent, AppState };\n\n// --- Platform detection ---\n\nlet _isNative: boolean | null = null;\n\n/**\n * Returns true if the app is running inside a Capacitor native platform\n * (iOS/Android). Returns false on web. The check is cached after the first\n * call.\n */\nexport function isNative(): boolean {\n    if (_isNative !== null) return _isNative;\n    if (typeof window === \"undefined\") {\n        _isNative = false;\n        return false;\n    }\n    // Capacitor injects a bridge on the window object in native environments\n    const cap = (window as any).Capacitor;\n    _isNative = !!cap?.isNativePlatform?.();\n    return _isNative;\n}\n\n/**\n * Returns true if running on web (not native). Convenience inverse of `isNative()`.\n */\nexport function isWeb(): boolean {\n    return !isNative();\n}\n\n// --- Lazy plugin loader cache ---\n\nconst _pluginCache = new Map<string, Promise<any>>();\n\nasync function loadPlugin(name: string): Promise<any> {\n    if (_pluginCache.has(name)) return _pluginCache.get(name)!;\n    const promise = import(/* @vite-ignore */ name);\n    _pluginCache.set(name, promise);\n    return promise;\n}\n\n// --- StatusBar ---\n\n/**\n * Status bar control wrapper. All methods are no-ops on web.\n */\nexport const StatusBar = {\n    async setStyle(options: { style: StatusBarStyle }): Promise<void> {\n        if (!isNative()) return;\n        const { StatusBar: sb } = await loadPlugin(\"@capacitor/status-bar\");\n        await sb.setStyle(options);\n    },\n\n    async setBackgroundColor(options: { color: string }): Promise<void> {\n        if (!isNative()) return;\n        const { StatusBar: sb } = await loadPlugin(\"@capacitor/status-bar\");\n        await sb.setBackgroundColor(options);\n    },\n\n    async show(): Promise<void> {\n        if (!isNative()) return;\n        const { StatusBar: sb } = await loadPlugin(\"@capacitor/status-bar\");\n        await sb.show();\n    },\n\n    async hide(): Promise<void> {\n        if (!isNative()) return;\n        const { StatusBar: sb } = await loadPlugin(\"@capacitor/status-bar\");\n        await sb.hide();\n    },\n\n    async setOverlaysWebView(options: { overlay: boolean }): Promise<void> {\n        if (!isNative()) return;\n        const { StatusBar: sb } = await loadPlugin(\"@capacitor/status-bar\");\n        await sb.setOverlaysWebView(options);\n    },\n};\n\n// --- SplashScreen ---\n\n/**\n * Splash screen control wrapper. All methods are no-ops on web.\n */\nexport const SplashScreen = {\n    async show(options?: { showDuration?: number; fadeOutDuration?: number; autoHide?: boolean }): Promise<void> {\n        if (!isNative()) return;\n        const { SplashScreen: ss } = await loadPlugin(\"@capacitor/splash-screen\");\n        await ss.show(options);\n    },\n\n    async hide(options?: { fadeOutDuration?: number }): Promise<void> {\n        if (!isNative()) return;\n        const { SplashScreen: ss } = await loadPlugin(\"@capacitor/splash-screen\");\n        await ss.hide(options);\n    },\n};\n\n// --- Keyboard ---\n\n/**\n * Keyboard events wrapper. On web, event listeners are no-ops.\n */\nexport const Keyboard = {\n    async setStyle(options: { style: KeyboardStyle }): Promise<void> {\n        if (!isNative()) return;\n        const { Keyboard: kb } = await loadPlugin(\"@capacitor/keyboard\");\n        await kb.setStyle(options);\n    },\n\n    async setResizeMode(options: { mode: KeyboardResize }): Promise<void> {\n        if (!isNative()) return;\n        const { Keyboard: kb } = await loadPlugin(\"@capacitor/keyboard\");\n        await kb.setResizeMode(options);\n    },\n\n    async show(): Promise<void> {\n        if (!isNative()) return;\n        const { Keyboard: kb } = await loadPlugin(\"@capacitor/keyboard\");\n        await kb.show();\n    },\n\n    async hide(): Promise<void> {\n        if (!isNative()) return;\n        const { Keyboard: kb } = await loadPlugin(\"@capacitor/keyboard\");\n        await kb.hide();\n    },\n\n    /**\n     * Register a keyboard event listener. Returns an unsubscribe function.\n     * On web, returns a no-op unsubscribe.\n     */\n    onWillShow(callback: (info: { keyboardHeight: number }) => void): () => void {\n        if (!isNative()) return () => { };\n        let removeFn: (() => void) | null = null;\n        loadPlugin(\"@capacitor/keyboard\").then(({ Keyboard: kb }) => {\n            kb.addListener(\"keyboardWillShow\", callback).then((h: any) => {\n                removeFn = () => h.remove();\n            });\n        });\n        return () => removeFn?.();\n    },\n\n    onDidShow(callback: (info: { keyboardHeight: number }) => void): () => void {\n        if (!isNative()) return () => { };\n        let removeFn: (() => void) | null = null;\n        loadPlugin(\"@capacitor/keyboard\").then(({ Keyboard: kb }) => {\n            kb.addListener(\"keyboardDidShow\", callback).then((h: any) => {\n                removeFn = () => h.remove();\n            });\n        });\n        return () => removeFn?.();\n    },\n\n    onWillHide(callback: () => void): () => void {\n        if (!isNative()) return () => { };\n        let removeFn: (() => void) | null = null;\n        loadPlugin(\"@capacitor/keyboard\").then(({ Keyboard: kb }) => {\n            kb.addListener(\"keyboardWillHide\", callback).then((h: any) => {\n                removeFn = () => h.remove();\n            });\n        });\n        return () => removeFn?.();\n    },\n\n    onDidHide(callback: () => void): () => void {\n        if (!isNative()) return () => { };\n        let removeFn: (() => void) | null = null;\n        loadPlugin(\"@capacitor/keyboard\").then(({ Keyboard: kb }) => {\n            kb.addListener(\"keyboardDidHide\", callback).then((h: any) => {\n                removeFn = () => h.remove();\n            });\n        });\n        return () => removeFn?.();\n    },\n};\n\n// --- Haptics ---\n\n/**\n * Haptic feedback wrapper. No-op on web.\n */\nexport const Haptics = {\n    async impact(style: ImpactStyle = ImpactStyle.Medium): Promise<void> {\n        if (!isNative()) return;\n        const { Haptics: h } = await loadPlugin(\"@capacitor/haptics\");\n        await h.impact({ style });\n    },\n\n    async notification(type: NotificationType = NotificationType.Success): Promise<void> {\n        if (!isNative()) return;\n        const { Haptics: h } = await loadPlugin(\"@capacitor/haptics\");\n        await h.notification({ type });\n    },\n\n    async vibrate(options: { duration?: number }): Promise<void> {\n        if (!isNative()) return;\n        const { Haptics: h } = await loadPlugin(\"@capacitor/haptics\");\n        await h.vibrate(options);\n    },\n\n    async selectionStart(): Promise<void> {\n        if (!isNative()) return;\n        const { Haptics: h } = await loadPlugin(\"@capacitor/haptics\");\n        await h.selectionStart();\n    },\n\n    async selectionChanged(): Promise<void> {\n        if (!isNative()) return;\n        const { Haptics: h } = await loadPlugin(\"@capacitor/haptics\");\n        await h.selectionChanged();\n    },\n\n    async selectionEnd(): Promise<void> {\n        if (!isNative()) return;\n        const { Haptics: h } = await loadPlugin(\"@capacitor/haptics\");\n        await h.selectionEnd();\n    },\n};\n\n// --- App ---\n\n/**\n * App lifecycle and back button wrapper. On web, listeners are no-ops.\n */\nexport const App = {\n    /**\n     * Get the current app state (\"active\" | \"background\").\n     * Returns \"active\" on web.\n     */\n    async getState(): Promise<AppState> {\n        if (!isNative()) return { isActive: true };\n        const { App: app } = await loadPlugin(\"@capacitor/app\");\n        return app.getState();\n    },\n\n    /**\n     * Get the app info (version, build, etc.).\n     * Returns empty info on web.\n     */\n    async getInfo(): Promise<{ version: string; build: string; id: string }> {\n        if (!isNative()) return { version: \"0.0.0\", build: \"0\", id: \"web\" };\n        const { App: app } = await loadPlugin(\"@capacitor/app\");\n        return app.getInfo();\n    },\n\n    /**\n     * Exit the app (Android only). No-op on web and iOS.\n     */\n    async exitApp(): Promise<void> {\n        if (!isNative()) return;\n        const { App: app } = await loadPlugin(\"@capacitor/app\");\n        await app.exitApp();\n    },\n\n    /**\n     * Register a back button listener. On web, returns a no-op unsubscribe.\n     * The callback receives the URL that would be navigated to.\n     */\n    onBackButton(callback: (info: { canGoBack: boolean; url: string }) => void): () => void {\n        if (!isNative()) return () => { };\n        let removeFn: (() => void) | null = null;\n        loadPlugin(\"@capacitor/app\").then(({ App: app }) => {\n            app.addListener(\"backButton\", callback).then((h: any) => {\n                removeFn = () => h.remove();\n            });\n        });\n        return () => removeFn?.();\n    },\n\n    /**\n     * Register an app state change listener (active/background transitions).\n     * On web, returns a no-op unsubscribe.\n     */\n    onAppStateChange(callback: (state: { isActive: boolean }) => void): () => void {\n        if (!isNative()) return () => { };\n        let removeFn: (() => void) | null = null;\n        loadPlugin(\"@capacitor/app\").then(({ App: app }) => {\n            app.addListener(\"appStateChange\", callback).then((h: any) => {\n                removeFn = () => h.remove();\n            });\n        });\n        return () => removeFn?.();\n    },\n\n    /**\n     * Register a URL open listener (for deep links / custom URL schemes).\n     * On web, returns a no-op unsubscribe.\n     */\n    onUrlOpen(callback: (event: URLOpenListenerEvent) => void): () => void {\n        if (!isNative()) return () => { };\n        let removeFn: (() => void) | null = null;\n        loadPlugin(\"@capacitor/app\").then(({ App: app }) => {\n            app.addListener(\"appUrlOpen\", callback).then((h: any) => {\n                removeFn = () => h.remove();\n            });\n        });\n        return () => removeFn?.();\n    },\n\n    /**\n     * Register a resume listener (app returns from background).\n     * On web, returns a no-op unsubscribe.\n     */\n    onResume(callback: () => void): () => void {\n        if (!isNative()) return () => { };\n        let removeFn: (() => void) | null = null;\n        loadPlugin(\"@capacitor/app\").then(({ App: app }) => {\n            app.addListener(\"resume\", callback).then((h: any) => {\n                removeFn = () => h.remove();\n            });\n        });\n        return () => removeFn?.();\n    },\n};\n\n// --- Bootstrap helper ---\n\nexport interface CapacitorAppOptions {\n    /** Status bar configuration. Skipped on web. */\n    statusBar?: {\n        style?: StatusBarStyle;\n        backgroundColor?: string;\n        overlaysWebView?: boolean;\n    };\n    /** Splash screen configuration. Skipped on web. */\n    splashScreen?: {\n        showDuration?: number;\n        fadeOutDuration?: number;\n    };\n    /** Hardware back button configuration (Android). Skipped on web. */\n    backButton?: {\n        defaultHref?: string;\n        /** Custom handler. If returns false, default navigation is prevented. */\n        handler?: (info: { canGoBack: boolean; url: string }) => boolean | void;\n    };\n    /** Haptic feedback on page transitions. Disabled by default. */\n    haptics?: {\n        pageTransition?: ImpactStyle;\n    };\n}\n\n/**\n * Bootstrap helper for Capacitor mobile apps. Configures the status bar,\n * hides the splash screen, and wires up the hardware back button.\n *\n * On web, this is a no-op that resolves immediately.\n *\n * @example\n * ```ts\n * import { createCapacitorApp } from \"@deijose/nix-ionic/capacitor\";\n * import { mount } from \"@deijose/nix-js\";\n * import { App as RootApp } from \"./App\";\n *\n * const app = createCapacitorApp({\n *   statusBar: { style: \"dark\", backgroundColor: \"#1a1a2e\" },\n *   splashScreen: { fadeOutDuration: 200 },\n *   backButton: { defaultHref: \"/home\" },\n * });\n *\n * await app.ready();\n * mount(RootApp(), \"#app\");\n * ```\n */\nexport function createCapacitorApp(options: CapacitorAppOptions = {}) {\n    let _backButtonUnsub: (() => void) | null = null;\n\n    async function ready(): Promise<void> {\n        if (!isNative()) return;\n\n        const tasks: Promise<unknown>[] = [];\n\n        // Status bar\n        if (options.statusBar) {\n            if (options.statusBar.style) {\n                tasks.push(StatusBar.setStyle({ style: options.statusBar.style }));\n            }\n            if (options.statusBar.backgroundColor) {\n                tasks.push(StatusBar.setBackgroundColor({ color: options.statusBar.backgroundColor }));\n            }\n            if (options.statusBar.overlaysWebView !== undefined) {\n                tasks.push(StatusBar.setOverlaysWebView({ overlay: options.statusBar.overlaysWebView }));\n            }\n        }\n\n        // Splash screen — hide after configuration\n        if (options.splashScreen) {\n            tasks.push(\n                SplashScreen.hide({\n                    fadeOutDuration: options.splashScreen.fadeOutDuration,\n                }),\n            );\n        } else {\n            // Always hide splash if not explicitly configured\n            tasks.push(SplashScreen.hide());\n        }\n\n        // Back button\n        if (options.backButton) {\n            _backButtonUnsub = App.onBackButton((info) => {\n                if (options.backButton?.handler) {\n                    const result = options.backButton.handler(info);\n                    if (result === false) return; // handler prevented default\n                }\n                // Default: navigate to defaultHref or let browser handle\n                if (!info.canGoBack && options.backButton?.defaultHref) {\n                    window.location.hash = options.backButton.defaultHref;\n                }\n            });\n        }\n\n        await Promise.all(tasks);\n    }\n\n    function dispose(): void {\n        _backButtonUnsub?.();\n        _backButtonUnsub = null;\n        // Reset the native platform cache (useful for testing)\n        _isNative = null;\n    }\n\n    return { ready, dispose };\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}