From 51105dde15bae94d42ed1f5e8270b1680b44adba Mon Sep 17 00:00:00 2001 From: CJ Pais Date: Mon, 28 Jul 2025 10:14:44 -0700 Subject: [PATCH] more wip but roughly is there --- bun.lockb | Bin 67590 -> 68001 bytes package-lock.json | 1273 +++++++++++++++++++++ package.json | 1 + public/icon/recording.png | Bin 0 -> 1461 bytes public/icon/transcribing.png | Bin 0 -> 1559 bytes src-tauri/Cargo.lock | 23 + src-tauri/Cargo.toml | 1 + src-tauri/capabilities/default.json | 4 +- src-tauri/gen/apple/PrivacyInfo.xcprivacy | 17 + src-tauri/src/actions.rs | 12 +- src-tauri/src/lib.rs | 4 + src-tauri/src/managers/audio.rs | 60 +- src-tauri/src/utils.rs | 84 +- src/assets/fonts/ShortStack-Regular.ttf | Bin 63712 -> 0 bytes src/assets/react.svg | 1 - src/overlay/RecordingOverlay.css | 39 +- src/overlay/RecordingOverlay.tsx | 75 +- 17 files changed, 1505 insertions(+), 89 deletions(-) create mode 100644 package-lock.json create mode 100644 public/icon/recording.png create mode 100644 public/icon/transcribing.png create mode 100644 src-tauri/gen/apple/PrivacyInfo.xcprivacy delete mode 100644 src/assets/fonts/ShortStack-Regular.ttf delete mode 100644 src/assets/react.svg diff --git a/bun.lockb b/bun.lockb index 53f8db28f90449d3e86b2890e7282cbb4d50f93f..fe07be327409b101d983eeea5f61cc245fc6ffa8 100755 GIT binary patch delta 10859 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 delta 10460 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.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.32.1", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.0", + "jiti": "^2.4.2", + "tailwindcss": "4.0.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.0.2", + "@tailwindcss/oxide-darwin-arm64": "4.0.2", + "@tailwindcss/oxide-darwin-x64": "4.0.2", + "@tailwindcss/oxide-freebsd-x64": "4.0.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.2", + "@tailwindcss/oxide-linux-x64-musl": "4.0.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.2" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.0.2", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "^4.0.2", + "@tailwindcss/oxide": "^4.0.2", + "lightningcss": "^1.29.1", + "tailwindcss": "4.0.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" + } + }, + "node_modules/@tauri-apps/api": { + "version": "2.6.0", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.2.7", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.2.7", + "@tauri-apps/cli-darwin-x64": "2.2.7", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.2.7", + "@tauri-apps/cli-linux-arm64-gnu": "2.2.7", + "@tauri-apps/cli-linux-arm64-musl": "2.2.7", + "@tauri-apps/cli-linux-x64-gnu": "2.2.7", + "@tauri-apps/cli-linux-x64-musl": "2.2.7", + "@tauri-apps/cli-win32-arm64-msvc": "2.2.7", + "@tauri-apps/cli-win32-ia32-msvc": "2.2.7", + "@tauri-apps/cli-win32-x64-msvc": "2.2.7" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.2.7", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/plugin-autostart": { + "version": "2.2.0", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@tauri-apps/plugin-autostart/node_modules/@tauri-apps/api": { + "version": "2.2.0", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/plugin-clipboard-manager": { + "version": "2.2.1", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@tauri-apps/plugin-clipboard-manager/node_modules/@tauri-apps/api": { + "version": "2.2.0", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/plugin-fs": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.4.1.tgz", + "integrity": "sha512-vJlKZVGF3UAFGoIEVT6Oq5L4HGDCD78WmA4uhzitToqYiBKWAvZR61M6zAyQzHqLs0ADemkE4RSy/5sCmZm6ZQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.6.0" + } + }, + "node_modules/@tauri-apps/plugin-global-shortcut": { + "version": "2.2.0", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@tauri-apps/plugin-global-shortcut/node_modules/@tauri-apps/api": { + "version": "2.2.0", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/plugin-opener": { + "version": "2.2.5", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@tauri-apps/plugin-opener/node_modules/@tauri-apps/api": { + "version": "2.2.0", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/plugin-os": { + "version": "2.2.1", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@tauri-apps/plugin-os/node_modules/@tauri-apps/api": { + "version": "2.2.0", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/plugin-process": { + "version": "2.3.0", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.6.0" + } + }, + "node_modules/@tauri-apps/plugin-store": { + "version": "2.2.0", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@tauri-apps/plugin-store/node_modules/@tauri-apps/api": { + "version": "2.2.0", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/plugin-stronghold": { + "version": "2.2.0", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@tauri-apps/plugin-stronghold/node_modules/@tauri-apps/api": { + "version": "2.2.0", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/plugin-updater": { + "version": "2.9.0", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.6.0" + } + }, + "node_modules/@tauri-apps/plugin-updater/node_modules/@tauri-apps/api": { + "version": "2.6.0", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/plugin-upload": { + "version": "2.2.1", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@tauri-apps/plugin-upload/node_modules/@tauri-apps/api": { + "version": "2.2.0", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.0.10", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.8.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.18", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.5", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001696", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.90", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.24.2", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.4.2", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.29.1", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.1", + "lightningcss-darwin-x64": "1.29.1", + "lightningcss-freebsd-x64": "1.29.1", + "lightningcss-linux-arm-gnueabihf": "1.29.1", + "lightningcss-linux-arm64-gnu": "1.29.1", + "lightningcss-linux-arm64-musl": "1.29.1", + "lightningcss-linux-x64-gnu": "1.29.1", + "lightningcss-linux-x64-musl": "1.29.1", + "lightningcss-win32-arm64-msvc": "1.29.1", + "lightningcss-win32-x64-msvc": "1.29.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.1", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.1", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.32.1", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.32.1", + "@rollup/rollup-android-arm64": "4.32.1", + "@rollup/rollup-darwin-arm64": "4.32.1", + "@rollup/rollup-darwin-x64": "4.32.1", + "@rollup/rollup-freebsd-arm64": "4.32.1", + "@rollup/rollup-freebsd-x64": "4.32.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.32.1", + "@rollup/rollup-linux-arm-musleabihf": "4.32.1", + "@rollup/rollup-linux-arm64-gnu": "4.32.1", + "@rollup/rollup-linux-arm64-musl": "4.32.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.32.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1", + "@rollup/rollup-linux-riscv64-gnu": "4.32.1", + "@rollup/rollup-linux-s390x-gnu": "4.32.1", + "@rollup/rollup-linux-x64-gnu": "4.32.1", + "@rollup/rollup-linux-x64-musl": "4.32.1", + "@rollup/rollup-win32-arm64-msvc": "4.32.1", + "@rollup/rollup-win32-ia32-msvc": "4.32.1", + "@rollup/rollup-win32-x64-msvc": "4.32.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.0.2", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tauri-plugin-macos-permissions-api": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "@tauri-apps/api": ">=2.0.0-beta.6" + } + }, + "node_modules/tauri-plugin-macos-permissions-api/node_modules/@tauri-apps/api": { + "version": "2.2.0", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.8.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "6.0.11", + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/zod": { + "version": "3.24.4", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json index 2c43f39..461d1c8 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@tauri-apps/api": "^2.6.0", "@tauri-apps/plugin-autostart": "~2", "@tauri-apps/plugin-clipboard-manager": "~2", + "@tauri-apps/plugin-fs": "~2", "@tauri-apps/plugin-global-shortcut": "~2", "@tauri-apps/plugin-opener": "^2", "@tauri-apps/plugin-os": "~2", diff --git a/public/icon/recording.png b/public/icon/recording.png new file mode 100644 index 0000000000000000000000000000000000000000..8839e844fea9cf30b70a0e8be6ef414d3e43e8dd GIT binary patch literal 1461 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 + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/src-tauri/src/actions.rs b/src-tauri/src/actions.rs index f8a657f..53b2a08 100644 --- a/src-tauri/src/actions.rs +++ b/src-tauri/src/actions.rs @@ -5,6 +5,8 @@ use crate::utils; use crate::utils::change_tray_icon; use crate::utils::play_recording_start_sound; use crate::utils::play_recording_stop_sound; +use crate::utils::show_recording_overlay; +use crate::utils::show_transcribing_overlay; use crate::utils::TrayIconState; use log::debug; use once_cell::sync::Lazy; @@ -30,6 +32,7 @@ impl ShortcutAction for TranscribeAction { let binding_id = binding_id.to_string(); change_tray_icon(app, TrayIconState::Recording); + show_recording_overlay(app); let rm = app.state::>(); @@ -78,6 +81,7 @@ impl ShortcutAction for TranscribeAction { let tm = Arc::clone(&app.state::>()); change_tray_icon(app, TrayIconState::Transcribing); + show_transcribing_overlay(app); // Play audio feedback for recording stop play_recording_stop_sound(app); @@ -119,23 +123,29 @@ impl ShortcutAction for TranscribeAction { ), Err(e) => eprintln!("Failed to paste transcription: {}", e), } + // Hide the overlay after transcription is complete + utils::hide_recording_overlay(&ah_clone); change_tray_icon(&ah_clone, TrayIconState::Idle); }) .unwrap_or_else(|e| { eprintln!("Failed to run paste on main thread: {:?}", e); + utils::hide_recording_overlay(&ah); change_tray_icon(&ah, TrayIconState::Idle); }); } else { + utils::hide_recording_overlay(&ah); change_tray_icon(&ah, TrayIconState::Idle); } } Err(err) => { debug!("Global Shortcut Transcription error: {}", err); + utils::hide_recording_overlay(&ah); change_tray_icon(&ah, TrayIconState::Idle); - }, + } } } else { debug!("No samples retrieved from recording stop"); + utils::hide_recording_overlay(&ah); change_tray_icon(&ah, TrayIconState::Idle); } }); diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 11e4d7e..682f112 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -60,6 +60,7 @@ pub fn run() { env_logger::init(); tauri::Builder::default() + .plugin(tauri_plugin_fs::init()) .plugin(tauri_plugin_process::init()) .plugin(tauri_plugin_updater::Builder::new().build()) .plugin(tauri_plugin_os::init()) @@ -154,6 +155,9 @@ pub fn run() { app.manage(model_manager.clone()); app.manage(transcription_manager.clone()); + // Create the recording overlay window (hidden by default) + utils::create_recording_overlay(&app.handle()); + shortcut::init_shortcuts(app); Ok(()) diff --git a/src-tauri/src/managers/audio.rs b/src-tauri/src/managers/audio.rs index 9476f72..e5c8994 100644 --- a/src-tauri/src/managers/audio.rs +++ b/src-tauri/src/managers/audio.rs @@ -3,7 +3,7 @@ use crate::settings::get_settings; use log::{debug, info}; use std::sync::{Arc, Mutex}; use std::time::Instant; -use tauri::{App, LogicalSize, Manager, WebviewWindowBuilder}; +use tauri::{App, Manager}; const WHISPER_SAMPLE_RATE: usize = 16000; @@ -195,7 +195,6 @@ impl AudioRecordingManager { binding_id: binding_id.to_string(), }; debug!("Recording started for binding {binding_id}"); - self.show_overlay(); return true; } } @@ -240,9 +239,6 @@ impl AudioRecordingManager { *self.is_recording.lock().unwrap() = false; - // Hide the overlay - self.hide_overlay(); - // In on-demand mode turn the mic off again if matches!(*self.mode.lock().unwrap(), MicrophoneMode::OnDemand) { self.stop_microphone_stream(); @@ -262,58 +258,4 @@ impl AudioRecordingManager { _ => None, } } - - /* ---------- overlay window -------------------------------------------- */ - - fn show_overlay(&self) { - if let Some(overlay_window) = self.app_handle.get_webview_window("recording_overlay") { - let _ = overlay_window.show(); - } else { - // Get screen dimensions for positioning - if let Ok(monitors) = self.app_handle.primary_monitor() { - if let Some(monitor) = monitors { - let size = monitor.size(); - let scale = monitor.scale_factor(); - let screen_width = (size.width as f64 / scale) as i32; - let screen_height = (size.height as f64 / scale) as i32; - - // Position at bottom center, 30px from bottom - let x = (screen_width - 150) / 2; - let y = screen_height - 30 - 30; - - match WebviewWindowBuilder::new( - &self.app_handle, - "recording_overlay", - tauri::WebviewUrl::App("src/overlay/index.html".into()), - ) - .title("Recording") - .position(x as f64, y as f64) - .resizable(false) - .maximizable(false) - .minimizable(false) - .closable(false) - .decorations(false) - .always_on_top(true) - .skip_taskbar(true) - .transparent(true) - .focused(false) - .build() - { - Ok(_window) => { - debug!("Recording overlay window created successfully"); - } - Err(e) => { - debug!("Failed to create recording overlay window: {}", e); - } - } - } - } - } - } - - fn hide_overlay(&self) { - if let Some(overlay_window) = self.app_handle.get_webview_window("recording_overlay") { - let _ = overlay_window.hide(); - } - } } diff --git a/src-tauri/src/utils.rs b/src-tauri/src/utils.rs index 54bf605..0d3d421 100644 --- a/src-tauri/src/utils.rs +++ b/src-tauri/src/utils.rs @@ -6,14 +6,14 @@ use enigo::Keyboard; use enigo::Settings; use cpal::traits::{DeviceTrait, HostTrait}; +use log::debug; use rodio::OutputStreamBuilder; use std::fs::File; use std::io::BufReader; use std::thread; use tauri::image::Image; use tauri::tray::TrayIcon; -use tauri::AppHandle; -use tauri::Manager; +use tauri::{AppHandle, Emitter, Manager, WebviewWindowBuilder}; use tauri_plugin_clipboard_manager::ClipboardExt; fn send_paste() -> Result<(), String> { @@ -194,3 +194,83 @@ fn play_audio_file( Ok(()) } + +/* ──────────────────────────────────────────────────────────────── */ +/* OVERLAY MANAGEMENT */ +/* ──────────────────────────────────────────────────────────────── */ + +/// Creates the recording overlay window and keeps it hidden by default +pub fn create_recording_overlay(app_handle: &AppHandle) { + // Get screen dimensions for positioning + if let Ok(monitors) = app_handle.primary_monitor() { + if let Some(monitor) = monitors { + let size = monitor.size(); + let scale = monitor.scale_factor(); + let screen_width = (size.width as f64 / scale) as i32; + let screen_height = (size.height as f64 / scale) as i32; + + // Position at bottom center, 30px from bottom + let x = (screen_width - 150) / 2; + let y = screen_height - 30 - 30; + + match WebviewWindowBuilder::new( + app_handle, + "recording_overlay", + tauri::WebviewUrl::App("src/overlay/index.html".into()), + ) + .title("Recording") + .position(x as f64, y as f64) + .resizable(false) + .maximizable(false) + .minimizable(false) + .closable(false) + .decorations(false) + .always_on_top(true) + .skip_taskbar(true) + .transparent(true) + .focused(false) + .visible(false) // Start hidden + .build() + { + Ok(_window) => { + debug!("Recording overlay window created successfully (hidden)"); + } + Err(e) => { + debug!("Failed to create recording overlay window: {}", e); + } + } + } + } +} + +/// Shows the recording overlay window with fade-in animation +pub fn show_recording_overlay(app_handle: &AppHandle) { + if let Some(overlay_window) = app_handle.get_webview_window("recording_overlay") { + let _ = overlay_window.show(); + // Emit event to trigger fade-in animation with recording state + let _ = overlay_window.emit("show-overlay", "recording"); + } +} + +/// Shows the transcribing overlay window +pub fn show_transcribing_overlay(app_handle: &AppHandle) { + if let Some(overlay_window) = app_handle.get_webview_window("recording_overlay") { + let _ = overlay_window.show(); + // Emit event to switch to transcribing state + let _ = overlay_window.emit("show-overlay", "transcribing"); + } +} + +/// Hides the recording overlay window with fade-out animation +pub fn hide_recording_overlay(app_handle: &AppHandle) { + if let Some(overlay_window) = app_handle.get_webview_window("recording_overlay") { + // Emit event to trigger fade-out animation + let _ = overlay_window.emit("hide-overlay", ()); + // Hide the window after a short delay to allow animation to complete + let window_clone = overlay_window.clone(); + std::thread::spawn(move || { + std::thread::sleep(std::time::Duration::from_millis(300)); + let _ = window_clone.hide(); + }); + } +} diff --git a/src/assets/fonts/ShortStack-Regular.ttf b/src/assets/fonts/ShortStack-Regular.ttf deleted file mode 100644 index 671a4d3428a0773a4a318d1c4efed13f3f9302e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63712 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 XnuMjmI$j#Bo!q&%J{J}vOIQ4VG%DMZ diff --git a/src/assets/react.svg b/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/overlay/RecordingOverlay.css b/src/overlay/RecordingOverlay.css index cf4382a..5265fc8 100644 --- a/src/overlay/RecordingOverlay.css +++ b/src/overlay/RecordingOverlay.css @@ -1,13 +1,15 @@ .recording-overlay { - width: 128px; - height: 32px; + height: 40px; + width: min-content; display: flex; + gap: 12px; align-items: center; - justify-content: center; - background: rgba(0, 0, 0, 0.7); - border-radius: 8px; - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); + padding-left: 4px; + padding-right: 24px; + background: rgba(0, 0, 0, 0.6); + border-radius: 24px; + opacity: 0; + transition: opacity 300ms ease-out; } .bars-container { @@ -37,3 +39,26 @@ opacity: 1; } } + +.recording-overlay.fade-in { + opacity: 1; +} + +.transcribing-text { + color: #faa2ca; + font-size: 14px; + font-weight: 600; + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + animation: transcribing-pulse 1.5s infinite ease-in-out; +} + +@keyframes transcribing-pulse { + 0%, + 100% { + opacity: 0.6; + } + 50% { + opacity: 1; + } +} diff --git a/src/overlay/RecordingOverlay.tsx b/src/overlay/RecordingOverlay.tsx index b4b3663..479977a 100644 --- a/src/overlay/RecordingOverlay.tsx +++ b/src/overlay/RecordingOverlay.tsx @@ -1,28 +1,67 @@ -import React, { useEffect } from "react"; +import React, { useEffect, useState } from "react"; import "./RecordingOverlay.css"; -import { resolveResource } from "@tauri-apps/api/path"; +import { listen } from "@tauri-apps/api/event"; + +type OverlayState = "recording" | "transcribing"; const RecordingOverlay: React.FC = () => { + const [isVisible, setIsVisible] = useState(false); + const [state, setState] = useState("recording"); + useEffect(() => { - resolveResource("tray_idle.png").then((r) => { - console.log("res", r); - }); + const setupEventListeners = async () => { + // Listen for show-overlay event from Rust + const unlistenShow = await listen("show-overlay", (event) => { + const overlayState = event.payload as OverlayState; + setState(overlayState); + setIsVisible(true); + }); + + // Listen for hide-overlay event from Rust + const unlistenHide = await listen("hide-overlay", () => { + setIsVisible(false); + }); + + // Cleanup function + return () => { + unlistenShow(); + unlistenHide(); + }; + }; + + setupEventListeners(); }, []); + const getIconPath = () => { + return state === "recording" + ? "/icon/recording.png" + : "/icon/transcribing.png"; + }; + + const getIconAlt = () => { + return state === "recording" ? "Recording Icon" : "Transcribing Icon"; + }; + return ( -

-
- {Array.from({ length: 8 }, (_, i) => ( -
- ))} -
+
+ {getIconAlt()} + {state === "recording" && ( +
+ {Array.from({ length: 8 }, (_, i) => ( +
+ ))} +
+ )} + {state === "transcribing" && ( +
Transcribing...
+ )}
); };