├── .browserslistrc ├── android ├── app │ ├── .gitignore │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── drawable │ │ │ │ │ ├── splash.png │ │ │ │ │ └── ic_launcher_background.xml │ │ │ │ ├── drawable-land-hdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── drawable-land-mdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── drawable-port-hdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── drawable-port-mdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-land-xhdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── drawable-land-xxhdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── drawable-port-xhdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── drawable-port-xxhdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-land-xxxhdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── drawable-port-xxxhdpi │ │ │ │ │ └── splash.png │ │ │ │ ├── values │ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ │ ├── strings.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── xml │ │ │ │ │ ├── config.xml │ │ │ │ │ └── file_paths.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ │ ├── ic_launcher.xml │ │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── layout │ │ │ │ │ └── activity_main.xml │ │ │ │ └── drawable-v24 │ │ │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── aparajita │ │ │ │ │ └── capacitor │ │ │ │ │ └── biometricauthdemo │ │ │ │ │ └── MainActivity.java │ │ │ ├── assets │ │ │ │ ├── capacitor.config.json │ │ │ │ └── capacitor.plugins.json │ │ │ └── AndroidManifest.xml │ │ ├── test │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── getcapacitor │ │ │ │ └── myapp │ │ │ │ └── ExampleUnitTest.java │ │ └── androidTest │ │ │ └── java │ │ │ └── com │ │ │ └── getcapacitor │ │ │ └── myapp │ │ │ └── ExampleInstrumentedTest.java │ ├── capacitor.build.gradle │ ├── proguard-rules.pro │ └── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── settings.gradle ├── variables.gradle ├── build.gradle ├── gradle.properties ├── capacitor.settings.gradle ├── .gitignore ├── gradlew.bat └── gradlew ├── src ├── env.d.ts ├── shims-vue.d.ts ├── App.vue ├── router │ └── index.ts ├── assets │ └── css │ │ └── styles.pcss ├── main.ts ├── theme │ └── variables.css └── components │ └── BiometryView.vue ├── .npmrc ├── .prettierignore ├── .eslintignore ├── commitlint.config.js ├── prettier.config.js ├── ios ├── App │ ├── App │ │ ├── Assets.xcassets │ │ │ ├── Contents.json │ │ │ ├── Splash.imageset │ │ │ │ ├── splash-2732x2732.png │ │ │ │ ├── splash-2732x2732-1.png │ │ │ │ ├── splash-2732x2732-2.png │ │ │ │ └── Contents.json │ │ │ └── AppIcon.appiconset │ │ │ │ ├── AppIcon-512@2x.png │ │ │ │ └── Contents.json │ │ ├── config.xml │ │ ├── capacitor.config.json │ │ ├── Base.lproj │ │ │ ├── Main.storyboard │ │ │ └── LaunchScreen.storyboard │ │ ├── Info.plist │ │ └── AppDelegate.swift │ ├── App.xcodeproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── project.pbxproj │ ├── App.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ ├── Podfile │ └── Podfile.lock └── .gitignore ├── postcss.config.js ├── public ├── assets │ ├── icon │ │ ├── icon.png │ │ └── favicon.png │ └── shapes.svg └── manifest.json ├── ionic.config.json ├── tailwind.config.js ├── tsconfig.config.json ├── simple-git-hooks.js ├── .eslintrc.js ├── .depcheckrc ├── README.md ├── .versionrc.js ├── .pnpmfile.cjs ├── capacitor.config.ts ├── vite.config.mts ├── tsconfig.json ├── LICENSE ├── .gitignore ├── index.html ├── package.json ├── CHANGELOG.md └── github-markdown-dark.css /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /android/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build/* 2 | !/build/.npmkeep 3 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | enable-pre-post-scripts=true 2 | shell-emulator=true 3 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | CHANGELOG.md 2 | pnpm-lock.yaml 3 | ios 4 | android 5 | dist 6 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .idea 2 | android 3 | dist 4 | ios 5 | node_modules 6 | !.versionrc.js 7 | -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { extends: ['@commitlint/config-conventional'] } 2 | -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | ...require('@aparajita/prettier-config'), 3 | } 4 | -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/assets/icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/public/assets/icon/icon.png -------------------------------------------------------------------------------- /public/assets/icon/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/public/assets/icon/favicon.png -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /ionic.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "capacitor-biometric-auth-demo", 3 | "integrations": { 4 | "capacitor": {} 5 | }, 6 | "type": "custom" 7 | } 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/drawable/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/drawable-land-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/drawable-land-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/drawable-port-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/drawable-port-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/drawable-land-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/drawable-land-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/drawable-port-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/drawable-port-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/drawable-land-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/drawable-port-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | App/build 2 | App/Pods 3 | App/output 4 | App/App/public 5 | DerivedData 6 | xcuserdata 7 | 8 | # Cordova plugins for Capacitor 9 | capacitor-cordova-ios-plugins 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparajita/capacitor-biometric-auth-demo/HEAD/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: ['./src/**/*.{html,vue,ts}'], 3 | theme: { 4 | extend: {}, 5 | }, 6 | variants: { 7 | extend: {}, 8 | }, 9 | plugins: [], 10 | } 11 | -------------------------------------------------------------------------------- /ios/App/App/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import type { DefineComponent } from 'vue' 3 | 4 | // eslint-disable-next-line 5 | const component: DefineComponent<{}, {}, any> 6 | export default component 7 | } 8 | -------------------------------------------------------------------------------- /ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/xml/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | include ':capacitor-cordova-android-plugins' 3 | project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') 4 | 5 | apply from: 'capacitor.settings.gradle' -------------------------------------------------------------------------------- /android/app/src/main/java/com/aparajita/capacitor/biometricauthdemo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.aparajita.capacitor.biometricauthdemo; 2 | 3 | import com.getcapacitor.BridgeActivity; 4 | 5 | public class MainActivity extends BridgeActivity {} 6 | -------------------------------------------------------------------------------- /tsconfig.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.json", 3 | "include": ["vite.config.*"], 4 | "compilerOptions": { 5 | "composite": true, 6 | "moduleResolution": "node", 7 | "types": ["node"] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /simple-git-hooks.js: -------------------------------------------------------------------------------- 1 | /* 2 | IMPORTANT! 3 | 4 | Be sure to run `simple-git-hooks` after modifying this file. 5 | */ 6 | module.exports = { 7 | 'commit-msg': 'cat "$@" | "$PWD"/node_modules/.bin/commitlint', 8 | 'pre-commit': 'pnpm lint', 9 | } 10 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@aparajita/vue'], 3 | rules: { 4 | '@typescript-eslint/consistent-type-assertions': 'off', 5 | '@typescript-eslint/naming-convention': 'off', 6 | '@typescript-eslint/no-magic-numbers': 'off', 7 | }, 8 | } 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/xml/file_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /.depcheckrc: -------------------------------------------------------------------------------- 1 | ignores: ["@capacitor/android", "@capacitor/ios"] 2 | 3 | ignore-patterns: ["node_modules", "dist", "ios", "android"] 4 | 5 | parsers: 6 | '**/*.js': ['es7'] 7 | '**/*.json': 8 | - json1 9 | - json2 10 | '**/*.ts': ['typescript'] 11 | '**/*.vue': ['vue'] 12 | -------------------------------------------------------------------------------- /ios/App/App.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "AppIcon-512@2x.png", 5 | "idiom" : "universal", 6 | "platform" : "ios", 7 | "size" : "1024x1024" 8 | } 9 | ], 10 | "info" : { 11 | "author" : "xcode", 12 | "version" : 1 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /android/app/src/main/assets/capacitor.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "appId": "com.aparajita.capacitor.biometricauthdemo", 3 | "appName": "Biometry", 4 | "loggingBehavior": "debug", 5 | "server": { 6 | "androidScheme": "http" 7 | }, 8 | "webDir": "dist", 9 | "plugins": { 10 | "SplashScreen": { 11 | "launchAutoHide": false 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Biometry 4 | Biometry 5 | com.aparajita.capacitor.biometricauth 6 | com.aparajita.capacitor.biometricauth 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # capacitor-biometric-auth-demo  [![GitHub version](https://badge.fury.io/gh/aparajita%2Fcapacitor-biometric-auth-demo.svg)](https://badge.fury.io/gh/aparajita%2Fcapacitor-biometric-auth-demo) 4 | 5 | This demo has been integrated with the [capacitor-biometric-auth](https://github.com/aparajita/capacitor-biometric-auth/blob/main/demo/README.md) plugin. 6 | 7 |
8 | -------------------------------------------------------------------------------- /.versionrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | types: [ 3 | { type: 'feat', section: 'Features' }, 4 | { type: 'fix', section: 'Bug Fixes' }, 5 | { type: 'chore', section: 'Maintenance' }, 6 | { type: 'docs', section: 'Docs' }, 7 | { type: 'style', section: 'Style' }, 8 | { type: 'refactor', section: 'Refactoring' }, 9 | { type: 'perf', section: 'Performance' }, 10 | { type: 'test', hidden: true }, 11 | ], 12 | } 13 | -------------------------------------------------------------------------------- /.pnpmfile.cjs: -------------------------------------------------------------------------------- 1 | function readPackage(pkg, context) { 2 | if (pkg.name === 'jsdom' && pkg.version.startsWith('23.2')) { 3 | // Replace tough-cookie v4 with v5 4 | pkg.dependencies = { 5 | ...pkg.dependencies, 6 | 'tough-cookie': '^5.0.0-rc.3', 7 | } 8 | context.log('tough-cookie@4 => tough-cookie@5 in dependencies of jsdom') 9 | } 10 | 11 | return pkg 12 | } 13 | 14 | module.exports = { 15 | hooks: { 16 | readPackage, 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from '@ionic/vue-router' 2 | import type { RouteRecordRaw } from 'vue-router' 3 | import BiometryView from '../components/BiometryView.vue' 4 | 5 | const routes: RouteRecordRaw[] = [ 6 | { 7 | path: '/', 8 | component: BiometryView, 9 | }, 10 | ] 11 | 12 | const router = createRouter({ 13 | history: createWebHistory(import.meta.env.BASE_URL), 14 | routes, 15 | }) 16 | 17 | export default router 18 | -------------------------------------------------------------------------------- /ios/App/App/capacitor.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "appId": "com.aparajita.capacitor.biometricauthdemo", 3 | "appName": "Biometry", 4 | "loggingBehavior": "debug", 5 | "server": { 6 | "androidScheme": "http" 7 | }, 8 | "webDir": "dist", 9 | "plugins": { 10 | "SplashScreen": { 11 | "launchAutoHide": false 12 | } 13 | }, 14 | "packageClassList": [ 15 | "BiometricAuthNative", 16 | "AppPlugin", 17 | "HapticsPlugin", 18 | "KeyboardPlugin", 19 | "SplashScreenPlugin", 20 | "StatusBarPlugin" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.getcapacitor.myapp; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import org.junit.Test; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | 14 | @Test 15 | public void addition_isCorrect() throws Exception { 16 | assertEquals(4, 2 + 2); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Biometry", 3 | "name": "Biometry Demo", 4 | "icons": [ 5 | { 6 | "src": "assets/icon/favicon.png", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "assets/icon/icon.png", 12 | "type": "image/png", 13 | "sizes": "512x512", 14 | "purpose": "maskable" 15 | } 16 | ], 17 | "start_url": ".", 18 | "display": "standalone", 19 | "theme_color": "#ffffff", 20 | "background_color": "#ffffff" 21 | } 22 | -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Splash.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "splash-2732x2732-2.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "splash-2732x2732-1.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "splash-2732x2732.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /capacitor.config.ts: -------------------------------------------------------------------------------- 1 | // / 2 | 3 | import type { CapacitorConfig } from '@capacitor/cli' 4 | 5 | /* eslint-disable @typescript-eslint/naming-convention */ 6 | const config: CapacitorConfig = { 7 | appId: 'com.aparajita.capacitor.biometricauthdemo', 8 | appName: 'Biometry', 9 | loggingBehavior: 'debug', 10 | server: { 11 | androidScheme: 'http', 12 | }, 13 | webDir: 'dist', 14 | plugins: { 15 | SplashScreen: { 16 | launchAutoHide: false, 17 | }, 18 | }, 19 | } 20 | 21 | export default config 22 | -------------------------------------------------------------------------------- /android/variables.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | minSdkVersion = 22 3 | compileSdkVersion = 34 4 | targetSdkVersion = 34 5 | androidxActivityVersion = '1.8.0' 6 | androidxAppCompatVersion = '1.6.1' 7 | androidxCoordinatorLayoutVersion = '1.2.0' 8 | androidxCoreVersion = '1.12.0' 9 | androidxFragmentVersion = '1.6.2' 10 | coreSplashScreenVersion = '1.0.1' 11 | androidxWebkitVersion = '1.9.0' 12 | junitVersion = '4.13.2' 13 | androidxJunitVersion = '1.2.1' 14 | androidxEspressoCoreVersion = '3.6.1' 15 | cordovaAndroidVersion = '10.1.1' 16 | } 17 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | 5 | repositories { 6 | google() 7 | mavenCentral() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:8.5.1' 11 | classpath 'com.google.gms:google-services:4.4.2' 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | apply from: "variables.gradle" 19 | 20 | allprojects { 21 | repositories { 22 | google() 23 | mavenCentral() 24 | } 25 | } 26 | 27 | tasks.register('clean', Delete) { 28 | delete rootProject.buildDir 29 | } 30 | 31 | -------------------------------------------------------------------------------- /android/app/src/main/assets/capacitor.plugins.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "pkg": "@aparajita/capacitor-biometric-auth", 4 | "classpath": "com.aparajita.capacitor.biometricauth.BiometricAuthNative" 5 | }, 6 | { 7 | "pkg": "@capacitor/app", 8 | "classpath": "com.capacitorjs.plugins.app.AppPlugin" 9 | }, 10 | { 11 | "pkg": "@capacitor/haptics", 12 | "classpath": "com.capacitorjs.plugins.haptics.HapticsPlugin" 13 | }, 14 | { 15 | "pkg": "@capacitor/keyboard", 16 | "classpath": "com.capacitorjs.plugins.keyboard.KeyboardPlugin" 17 | }, 18 | { 19 | "pkg": "@capacitor/splash-screen", 20 | "classpath": "com.capacitorjs.plugins.splashscreen.SplashScreenPlugin" 21 | }, 22 | { 23 | "pkg": "@capacitor/status-bar", 24 | "classpath": "com.capacitorjs.plugins.statusbar.StatusBarPlugin" 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /android/app/capacitor.build.gradle: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN 2 | 3 | android { 4 | compileOptions { 5 | sourceCompatibility JavaVersion.VERSION_17 6 | targetCompatibility JavaVersion.VERSION_17 7 | } 8 | } 9 | 10 | apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" 11 | dependencies { 12 | implementation project(':aparajita-capacitor-biometric-auth') 13 | implementation project(':capacitor-app') 14 | implementation project(':capacitor-haptics') 15 | implementation project(':capacitor-keyboard') 16 | implementation project(':capacitor-splash-screen') 17 | implementation project(':capacitor-status-bar') 18 | 19 | } 20 | 21 | 22 | if (hasProperty('postBuildExtras')) { 23 | postBuildExtras() 24 | } 25 | -------------------------------------------------------------------------------- /vite.config.mts: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'url' 2 | import vue from '@vitejs/plugin-vue' 3 | import { defineConfig } from 'vite' 4 | 5 | export default defineConfig(() => { 6 | return { 7 | build: { 8 | chunkSizeWarningLimit: 1000, 9 | rollupOptions: { 10 | // This is for the code generated by decorators. If we don't specify this, 11 | // it defaults to globalThis, which older android phones won't understand. 12 | context: 'window', 13 | }, 14 | sourcemap: process.env.NODE_ENV !== 'production', 15 | target: 'es2017', 16 | }, 17 | plugins: [vue()], 18 | resolve: { 19 | alias: { 20 | // eslint-disable-next-line @typescript-eslint/naming-convention 21 | '@': fileURLToPath(new URL('./src', import.meta.url)), 22 | }, 23 | }, 24 | } 25 | }) 26 | -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /src/assets/css/styles.pcss: -------------------------------------------------------------------------------- 1 | /* @tailwind base conflicts with Ionic styles */ 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | html { 6 | /* 7 | Make sure we set the rem value to the base size, 8 | since Tailwind units are rem-based. 9 | */ 10 | font-size: 17px; 11 | } 12 | 13 | ion-button { 14 | /* Standard Ionic tracking on buttons is too tight for my taste */ 15 | @apply tracking-wide; 16 | } 17 | 18 | /* ion-item has a hardcoded font-size, use the base size */ 19 | ion-item { 20 | font-size: 1rem; 21 | } 22 | 23 | /* 24 | On some Android devices, the native checkbox is displayed instead 25 | of the svg checkbox, and it has no right margin. So we have to add 26 | some margin between it and a label. 27 | */ 28 | ion-checkbox.md + ion-label { 29 | @apply ml-1; 30 | } 31 | 32 | #app { 33 | @apply w-full h-full; 34 | } 35 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "compilerOptions": { 4 | "allowSyntheticDefaultImports": true, 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "importHelpers": true, 8 | 9 | // Required in Vite 10 | "isolatedModules": true, 11 | 12 | // Required in Vue projects 13 | "jsx": "preserve", 14 | 15 | "module": "esnext", 16 | "moduleResolution": "node", 17 | 18 | "resolveJsonModule": true, 19 | "skipLibCheck": true, 20 | "sourceMap": true, 21 | "strict": true, 22 | "target": "es2017", 23 | "useDefineForClassFields": true, 24 | "types": ["node"], 25 | "lib": ["es2017", "dom", "dom.iterable", "scripthost"], 26 | "baseUrl": "./", 27 | "paths": { 28 | "@/*": ["src/*"] 29 | } 30 | }, 31 | "include": ["**/*.js", "**/*.ts", "**/*.vue"], 32 | "exclude": ["node_modules"] 33 | } 34 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 11 | 12 | 17 | 18 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.getcapacitor.myapp; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import android.content.Context; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | import androidx.test.platform.app.InstrumentationRegistry; 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * @see Testing documentation 15 | */ 16 | @RunWith(AndroidJUnit4.class) 17 | public class ExampleInstrumentedTest { 18 | 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 23 | 24 | assertEquals("com.getcapacitor.app", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { Capacitor } from '@capacitor/core' 2 | import { IonicVue } from '@ionic/vue' 3 | import { createApp } from 'vue' 4 | import App from './App.vue' 5 | import router from './router' 6 | 7 | // Core CSS required for Ionic components to work properly 8 | import '@ionic/vue/css/core.css' 9 | 10 | // Basic CSS for apps built with Ionic 11 | import '@ionic/vue/css/normalize.css' 12 | import '@ionic/vue/css/structure.css' 13 | import '@ionic/vue/css/padding.css' 14 | 15 | // Dark mode support 16 | import '@ionic/vue/css/palettes/dark.system.css' 17 | import './assets/css/styles.pcss' 18 | 19 | const config: Record = {} 20 | 21 | if (Capacitor.getPlatform() === 'web') { 22 | config.mode = 'ios' 23 | } 24 | 25 | const app = createApp(App).use(IonicVue, config).use(router) 26 | 27 | router 28 | .isReady() 29 | .then(() => { 30 | app.mount('#app') 31 | }) 32 | .catch((error) => { 33 | console.error((error as Error).message) 34 | }) 35 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | 19 | # AndroidX package structure to make it clearer which packages are bundled with the 20 | # Android operating system, and which are packaged with your app's APK 21 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 22 | android.useAndroidX=true 23 | -------------------------------------------------------------------------------- /ios/App/App/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2020-present Aparajita Fishman 2 | 3 | MIT License 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | "Software"), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /public/assets/shapes.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # NPM renames .gitignore to .npmignore 2 | # In order to prevent that, we remove the initial "." 3 | # And the CLI then renames it 4 | 5 | # node files 6 | dist/ 7 | node_modules/ 8 | 9 | # iOS files 10 | #Pods 11 | #Build 12 | #xcuserdata 13 | 14 | # macOS files 15 | .DS_Store 16 | 17 | 18 | 19 | # Based on Android gitignore template: https://github.com/github/gitignore/blob/master/Android.gitignore 20 | 21 | # Built application files 22 | *.apk 23 | *.ap_ 24 | 25 | # Files for the ART/Dalvik VM 26 | *.dex 27 | 28 | # Java class files 29 | *.class 30 | 31 | # Generated files 32 | bin/ 33 | gen/ 34 | out/ 35 | 36 | # Gradle files 37 | .gradle/ 38 | build/ 39 | 40 | # Local configuration file (sdk path, etc) 41 | local.properties 42 | 43 | # Proguard folder generated by Eclipse 44 | proguard/ 45 | 46 | # Log Files 47 | *.log 48 | 49 | # Android Studio Navigation editor temp files 50 | .navigation/ 51 | 52 | # Android Studio captures folder 53 | captures/ 54 | 55 | # IntelliJ 56 | *.iml 57 | .idea 58 | 59 | # Keystore files 60 | # Uncomment the following line if you do not want to check your keystore files in. 61 | #*.jks 62 | 63 | # External native build folder generated in Android Studio 2.2 and later 64 | .externalNativeBuild 65 | 66 | .eslintcache 67 | xcshareddata 68 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Biometry Demo 6 | 7 | 8 | 9 | 13 | 17 | 21 | 25 | 26 | 31 | 32 | 33 | 37 | 41 | 45 | 46 | 47 | 48 |
49 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /android/capacitor.settings.gradle: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN 2 | include ':capacitor-android' 3 | project(':capacitor-android').projectDir = new File('../node_modules/.pnpm/@capacitor+android@6.1.0_@capacitor+core@6.1.0/node_modules/@capacitor/android/capacitor') 4 | 5 | include ':aparajita-capacitor-biometric-auth' 6 | project(':aparajita-capacitor-biometric-auth').projectDir = new File('../node_modules/.pnpm/@aparajita+capacitor-biometric-auth@9.0.0_@capacitor+core@6.1.0/node_modules/@aparajita/capacitor-biometric-auth/android') 7 | 8 | include ':capacitor-app' 9 | project(':capacitor-app').projectDir = new File('../node_modules/.pnpm/@capacitor+app@6.0.0_@capacitor+core@6.1.0/node_modules/@capacitor/app/android') 10 | 11 | include ':capacitor-haptics' 12 | project(':capacitor-haptics').projectDir = new File('../node_modules/.pnpm/@capacitor+haptics@6.0.0_@capacitor+core@6.1.0/node_modules/@capacitor/haptics/android') 13 | 14 | include ':capacitor-keyboard' 15 | project(':capacitor-keyboard').projectDir = new File('../node_modules/.pnpm/@capacitor+keyboard@6.0.1_@capacitor+core@6.1.0/node_modules/@capacitor/keyboard/android') 16 | 17 | include ':capacitor-splash-screen' 18 | project(':capacitor-splash-screen').projectDir = new File('../node_modules/.pnpm/@capacitor+splash-screen@6.0.1_@capacitor+core@6.1.0/node_modules/@capacitor/splash-screen/android') 19 | 20 | include ':capacitor-status-bar' 21 | project(':capacitor-status-bar').projectDir = new File('../node_modules/.pnpm/@capacitor+status-bar@6.0.0_@capacitor+core@6.1.0/node_modules/@capacitor/status-bar/android') 22 | -------------------------------------------------------------------------------- /ios/App/Podfile: -------------------------------------------------------------------------------- 1 | require_relative '../../node_modules/.pnpm/@capacitor+ios@7.2.0_@capacitor+core@7.2.0/node_modules/@capacitor/ios/scripts/pods_helpers' 2 | 3 | platform :ios, '14.0' 4 | use_frameworks! 5 | 6 | # workaround to avoid Xcode caching of Pods that requires 7 | # Product -> Clean Build Folder after new Cordova plugins installed 8 | # Requires CocoaPods 1.6 or newer 9 | install! 'cocoapods', :disable_input_output_paths => true 10 | 11 | def capacitor_pods 12 | pod 'Capacitor', :path => '../../node_modules/.pnpm/@capacitor+ios@7.2.0_@capacitor+core@7.2.0/node_modules/@capacitor/ios' 13 | pod 'CapacitorCordova', :path => '../../node_modules/.pnpm/@capacitor+ios@7.2.0_@capacitor+core@7.2.0/node_modules/@capacitor/ios' 14 | pod 'AparajitaCapacitorBiometricAuth', :path => '../../node_modules/.pnpm/@aparajita+capacitor-biometric-auth@9.0.0_@capacitor+core@7.2.0/node_modules/@aparajita/capacitor-biometric-auth' 15 | pod 'CapacitorApp', :path => '../../node_modules/.pnpm/@capacitor+app@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/app' 16 | pod 'CapacitorHaptics', :path => '../../node_modules/.pnpm/@capacitor+haptics@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/haptics' 17 | pod 'CapacitorKeyboard', :path => '../../node_modules/.pnpm/@capacitor+keyboard@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/keyboard' 18 | pod 'CapacitorSplashScreen', :path => '../../node_modules/.pnpm/@capacitor+splash-screen@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/splash-screen' 19 | pod 'CapacitorStatusBar', :path => '../../node_modules/.pnpm/@capacitor+status-bar@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/status-bar' 20 | end 21 | 22 | target 'App' do 23 | capacitor_pods 24 | # Add your Pods here 25 | end 26 | 27 | 28 | post_install do |installer| 29 | assertDeploymentTarget(installer) 30 | end 31 | -------------------------------------------------------------------------------- /ios/App/App/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Biometry 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | UIViewControllerBasedStatusBarAppearance 47 | 48 | NSFaceIDUsageDescription 49 | Allow the app ot use FaceID? 50 | 51 | 52 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | # Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore 2 | 3 | # Built application files 4 | *.apk 5 | *.aar 6 | *.ap_ 7 | *.aab 8 | 9 | # Files for the ART/Dalvik VM 10 | *.dex 11 | 12 | # Java class files 13 | *.class 14 | 15 | # Generated files 16 | bin/ 17 | gen/ 18 | out/ 19 | # Uncomment the following line in case you need and you don't have the release build type files in your app 20 | # release/ 21 | 22 | # Gradle files 23 | .gradle/ 24 | build/ 25 | 26 | # Local configuration file (sdk path, etc) 27 | local.properties 28 | 29 | # Proguard folder generated by Eclipse 30 | proguard/ 31 | 32 | # Log Files 33 | *.log 34 | 35 | # Android Studio Navigation editor temp files 36 | .navigation/ 37 | 38 | # Android Studio captures folder 39 | captures/ 40 | 41 | # IntelliJ 42 | *.iml 43 | .idea/workspace.xml 44 | .idea/tasks.xml 45 | .idea/gradle.xml 46 | .idea/assetWizardSettings.xml 47 | .idea/dictionaries 48 | .idea/libraries 49 | # Android Studio 3 in .gitignore file. 50 | .idea/caches 51 | .idea/modules.xml 52 | # Comment next line if keeping position of elements in Navigation Editor is relevant for you 53 | .idea/navEditor.xml 54 | 55 | # Keystore files 56 | # Uncomment the following lines if you do not want to check your keystore files in. 57 | #*.jks 58 | #*.keystore 59 | 60 | # External native build folder generated in Android Studio 2.2 and later 61 | .externalNativeBuild 62 | .cxx/ 63 | 64 | # Google Services (e.g. APIs or Firebase) 65 | # google-services.json 66 | 67 | # Freeline 68 | freeline.py 69 | freeline/ 70 | freeline_project_description.json 71 | 72 | # fastlane 73 | fastlane/report.xml 74 | fastlane/Preview.html 75 | fastlane/screenshots 76 | fastlane/test_output 77 | fastlane/readme.md 78 | 79 | # Version control 80 | vcs.xml 81 | 82 | # lint 83 | lint/intermediates/ 84 | lint/generated/ 85 | lint/outputs/ 86 | lint/tmp/ 87 | # lint/reports/ 88 | 89 | # Android Profiling 90 | *.hprof 91 | 92 | # Cordova plugins for Capacitor 93 | capacitor-cordova-android-plugins 94 | 95 | # Copied web assets 96 | app/src/main/assets/public 97 | -------------------------------------------------------------------------------- /ios/App/App/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | namespace="com.aparajita.capacitor.biometricauthdemo" 5 | compileSdk rootProject.ext.compileSdkVersion 6 | defaultConfig { 7 | applicationId "com.aparajita.capacitor.biometricauthdemo" 8 | minSdkVersion rootProject.ext.minSdkVersion 9 | targetSdkVersion rootProject.ext.targetSdkVersion 10 | versionCode 4 11 | versionName "3.0.0" 12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 13 | aaptOptions { 14 | // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. 15 | // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 16 | ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' 17 | } 18 | } 19 | buildTypes { 20 | release { 21 | minifyEnabled false 22 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 23 | } 24 | } 25 | } 26 | 27 | repositories { 28 | flatDir{ 29 | dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' 30 | } 31 | } 32 | 33 | dependencies { 34 | implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" 35 | implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" 36 | implementation fileTree(include: ['*.jar'], dir: 'libs') 37 | implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" 38 | implementation project(':capacitor-android') 39 | testImplementation "junit:junit:$junitVersion" 40 | androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" 41 | androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" 42 | implementation project(':capacitor-cordova-android-plugins') 43 | } 44 | 45 | apply from: 'capacitor.build.gradle' 46 | 47 | try { 48 | def servicesJSON = file('google-services.json') 49 | if (servicesJSON.text) { 50 | apply plugin: 'com.google.gms.google-services' 51 | } 52 | } catch(Exception e) { 53 | logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") 54 | } 55 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@aparajita/capacitor-biometric-auth-demo", 3 | "version": "8.0.0", 4 | "description": "An Ionic/Vue demo of the @aparajita/capacitor-biometric-auth plugin", 5 | "private": true, 6 | "author": "Aparajita Fishman", 7 | "homepage": "https://github.com/aparajita/capacitor-biometric-auth-demo", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/aparajita/capacitor-biometric-auth-demo.git" 11 | }, 12 | "scripts": { 13 | "dev": "vite", 14 | "prebuild": "pnpm lint", 15 | "build": "vite build", 16 | "preview": "vite preview --port 1327", 17 | "lint.eslint": "eslint --cache --fix --ext js,mjs,ts,vue .", 18 | "lint.prettier": "prettier --cache --write --list-different .", 19 | "lint.tsc": "vue-tsc --noEmit", 20 | "lint": "pnpm lint.eslint && pnpm lint.prettier && pnpm lint.tsc", 21 | "ios.dev": "ionic cap run ios --open --livereload --external", 22 | "ios.prod": "ionic cap run ios --open", 23 | "android.dev": "ionic cap run android --open --livereload --external", 24 | "android.prod": "ionic cap run android --open", 25 | "ionic:build": "vite build", 26 | "ionic:serve": "vite", 27 | "prerelease": "pnpm build", 28 | "release": "commit-and-tag-version && git push --follow-tags" 29 | }, 30 | "dependencies": { 31 | "@aparajita/capacitor-biometric-auth": "^9.0.0", 32 | "@capacitor/android": "^7.2.0", 33 | "@capacitor/app": "^7.0.1", 34 | "@capacitor/core": "^7.2.0", 35 | "@capacitor/haptics": "^7.0.1", 36 | "@capacitor/ios": "^7.2.0", 37 | "@capacitor/keyboard": "^7.0.1", 38 | "@capacitor/splash-screen": "^7.0.1", 39 | "@capacitor/status-bar": "^7.0.1", 40 | "@ionic/core": "^8.2.5", 41 | "@ionic/vue": "^8.2.5", 42 | "@ionic/vue-router": "^8.2.5", 43 | "ionicons": "^7.4.0", 44 | "vue": "^3.4.31", 45 | "vue-router": "^4.4.0" 46 | }, 47 | "devDependencies": { 48 | "@aparajita/eslint-config-vue": "^1.0.7", 49 | "@aparajita/prettier-config": "^2.0.0", 50 | "@aparajita/tailwind-ionic": "^2.3.0", 51 | "@capacitor/cli": "^7.2.0", 52 | "@commitlint/cli": "^19.3.0", 53 | "@commitlint/config-conventional": "^19.2.2", 54 | "@ionic/cli": "^7.2.0", 55 | "@types/node": "^20.14.10", 56 | "@typescript-eslint/eslint-plugin": "^7.16.1", 57 | "@typescript-eslint/parser": "^7.16.1", 58 | "@vitejs/plugin-vue": "^5.0.5", 59 | "@vue/compiler-sfc": "^3.4.31", 60 | "@vue/tsconfig": "^0.5.1", 61 | "autoprefixer": "^10.4.19", 62 | "commit-and-tag-version": "^12.4.1", 63 | "eslint": "^8.57.0", 64 | "eslint-config-prettier": "^9.1.0", 65 | "eslint-config-standard": "^17.1.0", 66 | "eslint-import-resolver-typescript": "^3.6.1", 67 | "eslint-plugin-import": "^2.29.1", 68 | "eslint-plugin-n": "^16.6.2", 69 | "eslint-plugin-promise": "^6.4.0", 70 | "eslint-plugin-vue": "^9.27.0", 71 | "postcss": "^8.4.39", 72 | "prettier": "^3.3.3", 73 | "simple-git-hooks": "^2.11.1", 74 | "tailwindcss": "^3.4.6", 75 | "terser": "^5.31.3", 76 | "typescript": "~5.5.3", 77 | "vite": "^5.3.4", 78 | "vue-eslint-parser": "^9.4.3", 79 | "vue-tsc": "~2.0.26" 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /ios/App/App/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Capacitor 3 | 4 | @UIApplicationMain 5 | class AppDelegate: UIResponder, UIApplicationDelegate { 6 | 7 | var window: UIWindow? 8 | 9 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 10 | // Override point for customization after application launch. 11 | return true 12 | } 13 | 14 | func applicationWillResignActive(_ application: UIApplication) { 15 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 16 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 17 | } 18 | 19 | func applicationDidEnterBackground(_ application: UIApplication) { 20 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 21 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 22 | } 23 | 24 | func applicationWillEnterForeground(_ application: UIApplication) { 25 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 26 | } 27 | 28 | func applicationDidBecomeActive(_ application: UIApplication) { 29 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 30 | } 31 | 32 | func applicationWillTerminate(_ application: UIApplication) { 33 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 34 | } 35 | 36 | func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { 37 | // Called when the app was launched with a url. Feel free to add additional processing here, 38 | // but if you want the App API to support tracking app url opens, make sure to keep this call 39 | return ApplicationDelegateProxy.shared.application(app, open: url, options: options) 40 | } 41 | 42 | func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { 43 | // Called when the app was launched with an activity, including Universal Links. 44 | // Feel free to add additional processing here, but if you want the App API to support 45 | // tracking app url opens, make sure to keep this call 46 | return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) 47 | } 48 | 49 | 50 | } 51 | 52 | -------------------------------------------------------------------------------- /ios/App/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AparajitaCapacitorBiometricAuth (9.0.0): 3 | - Capacitor 4 | - Capacitor (7.2.0): 5 | - CapacitorCordova 6 | - CapacitorApp (7.0.1): 7 | - Capacitor 8 | - CapacitorCordova (7.2.0) 9 | - CapacitorHaptics (7.0.1): 10 | - Capacitor 11 | - CapacitorKeyboard (7.0.1): 12 | - Capacitor 13 | - CapacitorSplashScreen (7.0.1): 14 | - Capacitor 15 | - CapacitorStatusBar (7.0.1): 16 | - Capacitor 17 | 18 | DEPENDENCIES: 19 | - "AparajitaCapacitorBiometricAuth (from `../../node_modules/.pnpm/@aparajita+capacitor-biometric-auth@9.0.0_@capacitor+core@7.2.0/node_modules/@aparajita/capacitor-biometric-auth`)" 20 | - "Capacitor (from `../../node_modules/.pnpm/@capacitor+ios@7.2.0_@capacitor+core@7.2.0/node_modules/@capacitor/ios`)" 21 | - "CapacitorApp (from `../../node_modules/.pnpm/@capacitor+app@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/app`)" 22 | - "CapacitorCordova (from `../../node_modules/.pnpm/@capacitor+ios@7.2.0_@capacitor+core@7.2.0/node_modules/@capacitor/ios`)" 23 | - "CapacitorHaptics (from `../../node_modules/.pnpm/@capacitor+haptics@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/haptics`)" 24 | - "CapacitorKeyboard (from `../../node_modules/.pnpm/@capacitor+keyboard@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/keyboard`)" 25 | - "CapacitorSplashScreen (from `../../node_modules/.pnpm/@capacitor+splash-screen@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/splash-screen`)" 26 | - "CapacitorStatusBar (from `../../node_modules/.pnpm/@capacitor+status-bar@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/status-bar`)" 27 | 28 | EXTERNAL SOURCES: 29 | AparajitaCapacitorBiometricAuth: 30 | :path: "../../node_modules/.pnpm/@aparajita+capacitor-biometric-auth@9.0.0_@capacitor+core@7.2.0/node_modules/@aparajita/capacitor-biometric-auth" 31 | Capacitor: 32 | :path: "../../node_modules/.pnpm/@capacitor+ios@7.2.0_@capacitor+core@7.2.0/node_modules/@capacitor/ios" 33 | CapacitorApp: 34 | :path: "../../node_modules/.pnpm/@capacitor+app@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/app" 35 | CapacitorCordova: 36 | :path: "../../node_modules/.pnpm/@capacitor+ios@7.2.0_@capacitor+core@7.2.0/node_modules/@capacitor/ios" 37 | CapacitorHaptics: 38 | :path: "../../node_modules/.pnpm/@capacitor+haptics@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/haptics" 39 | CapacitorKeyboard: 40 | :path: "../../node_modules/.pnpm/@capacitor+keyboard@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/keyboard" 41 | CapacitorSplashScreen: 42 | :path: "../../node_modules/.pnpm/@capacitor+splash-screen@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/splash-screen" 43 | CapacitorStatusBar: 44 | :path: "../../node_modules/.pnpm/@capacitor+status-bar@7.0.1_@capacitor+core@7.2.0/node_modules/@capacitor/status-bar" 45 | 46 | SPEC CHECKSUMS: 47 | AparajitaCapacitorBiometricAuth: 77be369942778adf29e20893caa5c0a75e5936fa 48 | Capacitor: 03bc7cbdde6a629a8b910a9d7d78c3cc7ed09ea7 49 | CapacitorApp: febecbb9582cb353aed037e18ec765141f880fe9 50 | CapacitorCordova: 5967b9ba03915ef1d585469d6e31f31dc49be96f 51 | CapacitorHaptics: 1f1e17041f435d8ead9ff2a34edd592c6aa6a8d6 52 | CapacitorKeyboard: 09fd91dcde4f8a37313e7f11bde553ad1ed52036 53 | CapacitorSplashScreen: 1d67815a422a9b61539c94f283c08ed56667c0fc 54 | CapacitorStatusBar: 6e7af040d8fc4dd655999819625cae9c2d74c36f 55 | 56 | PODFILE CHECKSUM: a36db34329d0f85e09fe88da6f9ce123aaac26f9 57 | 58 | COCOAPODS: 1.16.2 59 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /src/theme/variables.css: -------------------------------------------------------------------------------- 1 | /* Ionic Variables and Theming. For more info, please see: 2 | http://ionicframework.com/docs/theming/ */ 3 | 4 | /** Ionic CSS Variables **/ 5 | :root { 6 | /** primary **/ 7 | --ion-color-primary: #3880ff; 8 | --ion-color-primary-rgb: 56, 128, 255; 9 | --ion-color-primary-contrast: #ffffff; 10 | --ion-color-primary-contrast-rgb: 255, 255, 255; 11 | --ion-color-primary-shade: #3171e0; 12 | --ion-color-primary-tint: #4c8dff; 13 | 14 | /** secondary **/ 15 | --ion-color-secondary: #3dc2ff; 16 | --ion-color-secondary-rgb: 61, 194, 255; 17 | --ion-color-secondary-contrast: #ffffff; 18 | --ion-color-secondary-contrast-rgb: 255, 255, 255; 19 | --ion-color-secondary-shade: #36abe0; 20 | --ion-color-secondary-tint: #50c8ff; 21 | 22 | /** tertiary **/ 23 | --ion-color-tertiary: #5260ff; 24 | --ion-color-tertiary-rgb: 82, 96, 255; 25 | --ion-color-tertiary-contrast: #ffffff; 26 | --ion-color-tertiary-contrast-rgb: 255, 255, 255; 27 | --ion-color-tertiary-shade: #4854e0; 28 | --ion-color-tertiary-tint: #6370ff; 29 | 30 | /** success **/ 31 | --ion-color-success: #2dd36f; 32 | --ion-color-success-rgb: 45, 211, 111; 33 | --ion-color-success-contrast: #ffffff; 34 | --ion-color-success-contrast-rgb: 255, 255, 255; 35 | --ion-color-success-shade: #28ba62; 36 | --ion-color-success-tint: #42d77d; 37 | 38 | /** warning **/ 39 | --ion-color-warning: #ffc409; 40 | --ion-color-warning-rgb: 255, 196, 9; 41 | --ion-color-warning-contrast: #000000; 42 | --ion-color-warning-contrast-rgb: 0, 0, 0; 43 | --ion-color-warning-shade: #e0ac08; 44 | --ion-color-warning-tint: #ffca22; 45 | 46 | /** danger **/ 47 | --ion-color-danger: #eb445a; 48 | --ion-color-danger-rgb: 235, 68, 90; 49 | --ion-color-danger-contrast: #ffffff; 50 | --ion-color-danger-contrast-rgb: 255, 255, 255; 51 | --ion-color-danger-shade: #cf3c4f; 52 | --ion-color-danger-tint: #ed576b; 53 | 54 | /** dark **/ 55 | --ion-color-dark: #222428; 56 | --ion-color-dark-rgb: 34, 36, 40; 57 | --ion-color-dark-contrast: #ffffff; 58 | --ion-color-dark-contrast-rgb: 255, 255, 255; 59 | --ion-color-dark-shade: #1e2023; 60 | --ion-color-dark-tint: #383a3e; 61 | 62 | /** medium **/ 63 | --ion-color-medium: #92949c; 64 | --ion-color-medium-rgb: 146, 148, 156; 65 | --ion-color-medium-contrast: #ffffff; 66 | --ion-color-medium-contrast-rgb: 255, 255, 255; 67 | --ion-color-medium-shade: #808289; 68 | --ion-color-medium-tint: #9d9fa6; 69 | 70 | /** light **/ 71 | --ion-color-light: #f4f5f8; 72 | --ion-color-light-rgb: 244, 245, 248; 73 | --ion-color-light-contrast: #000000; 74 | --ion-color-light-contrast-rgb: 0, 0, 0; 75 | --ion-color-light-shade: #d7d8da; 76 | --ion-color-light-tint: #f5f6f9; 77 | } 78 | 79 | @media (prefers-color-scheme: dark) { 80 | /* 81 | * Dark Colors 82 | * ------------------------------------------- 83 | */ 84 | 85 | body { 86 | --ion-color-primary: #428cff; 87 | --ion-color-primary-rgb: 66, 140, 255; 88 | --ion-color-primary-contrast: #ffffff; 89 | --ion-color-primary-contrast-rgb: 255, 255, 255; 90 | --ion-color-primary-shade: #3a7be0; 91 | --ion-color-primary-tint: #5598ff; 92 | 93 | --ion-color-secondary: #50c8ff; 94 | --ion-color-secondary-rgb: 80, 200, 255; 95 | --ion-color-secondary-contrast: #ffffff; 96 | --ion-color-secondary-contrast-rgb: 255, 255, 255; 97 | --ion-color-secondary-shade: #46b0e0; 98 | --ion-color-secondary-tint: #62ceff; 99 | 100 | --ion-color-tertiary: #6a64ff; 101 | --ion-color-tertiary-rgb: 106, 100, 255; 102 | --ion-color-tertiary-contrast: #ffffff; 103 | --ion-color-tertiary-contrast-rgb: 255, 255, 255; 104 | --ion-color-tertiary-shade: #5d58e0; 105 | --ion-color-tertiary-tint: #7974ff; 106 | 107 | --ion-color-success: #2fdf75; 108 | --ion-color-success-rgb: 47, 223, 117; 109 | --ion-color-success-contrast: #000000; 110 | --ion-color-success-contrast-rgb: 0, 0, 0; 111 | --ion-color-success-shade: #29c467; 112 | --ion-color-success-tint: #44e283; 113 | 114 | --ion-color-warning: #ffd534; 115 | --ion-color-warning-rgb: 255, 213, 52; 116 | --ion-color-warning-contrast: #000000; 117 | --ion-color-warning-contrast-rgb: 0, 0, 0; 118 | --ion-color-warning-shade: #e0bb2e; 119 | --ion-color-warning-tint: #ffd948; 120 | 121 | --ion-color-danger: #ff4961; 122 | --ion-color-danger-rgb: 255, 73, 97; 123 | --ion-color-danger-contrast: #ffffff; 124 | --ion-color-danger-contrast-rgb: 255, 255, 255; 125 | --ion-color-danger-shade: #e04055; 126 | --ion-color-danger-tint: #ff5b71; 127 | 128 | --ion-color-dark: #f4f5f8; 129 | --ion-color-dark-rgb: 244, 245, 248; 130 | --ion-color-dark-contrast: #000000; 131 | --ion-color-dark-contrast-rgb: 0, 0, 0; 132 | --ion-color-dark-shade: #d7d8da; 133 | --ion-color-dark-tint: #f5f6f9; 134 | 135 | --ion-color-medium: #989aa2; 136 | --ion-color-medium-rgb: 152, 154, 162; 137 | --ion-color-medium-contrast: #000000; 138 | --ion-color-medium-contrast-rgb: 0, 0, 0; 139 | --ion-color-medium-shade: #86888f; 140 | --ion-color-medium-tint: #a2a4ab; 141 | 142 | --ion-color-light: #222428; 143 | --ion-color-light-rgb: 34, 36, 40; 144 | --ion-color-light-contrast: #ffffff; 145 | --ion-color-light-contrast-rgb: 255, 255, 255; 146 | --ion-color-light-shade: #1e2023; 147 | --ion-color-light-tint: #383a3e; 148 | } 149 | 150 | /* 151 | * iOS Dark Theme 152 | * ------------------------------------------- 153 | */ 154 | 155 | .ios body { 156 | --ion-background-color: #000000; 157 | --ion-background-color-rgb: 0, 0, 0; 158 | 159 | --ion-text-color: #ffffff; 160 | --ion-text-color-rgb: 255, 255, 255; 161 | 162 | --ion-color-step-50: #0d0d0d; 163 | --ion-color-step-100: #1a1a1a; 164 | --ion-color-step-150: #262626; 165 | --ion-color-step-200: #333333; 166 | --ion-color-step-250: #404040; 167 | --ion-color-step-300: #4d4d4d; 168 | --ion-color-step-350: #595959; 169 | --ion-color-step-400: #666666; 170 | --ion-color-step-450: #737373; 171 | --ion-color-step-500: #808080; 172 | --ion-color-step-550: #8c8c8c; 173 | --ion-color-step-600: #999999; 174 | --ion-color-step-650: #a6a6a6; 175 | --ion-color-step-700: #b3b3b3; 176 | --ion-color-step-750: #bfbfbf; 177 | --ion-color-step-800: #cccccc; 178 | --ion-color-step-850: #d9d9d9; 179 | --ion-color-step-900: #e6e6e6; 180 | --ion-color-step-950: #f2f2f2; 181 | 182 | --ion-toolbar-background: #0d0d0d; 183 | 184 | --ion-item-background: #000000; 185 | 186 | --ion-card-background: #1c1c1d; 187 | } 188 | 189 | /* 190 | * Material Design Dark Theme 191 | * ------------------------------------------- 192 | */ 193 | 194 | .md body { 195 | --ion-background-color: #121212; 196 | --ion-background-color-rgb: 18, 18, 18; 197 | 198 | --ion-text-color: #ffffff; 199 | --ion-text-color-rgb: 255, 255, 255; 200 | 201 | --ion-border-color: #222222; 202 | 203 | --ion-color-step-50: #1e1e1e; 204 | --ion-color-step-100: #2a2a2a; 205 | --ion-color-step-150: #363636; 206 | --ion-color-step-200: #414141; 207 | --ion-color-step-250: #4d4d4d; 208 | --ion-color-step-300: #595959; 209 | --ion-color-step-350: #656565; 210 | --ion-color-step-400: #717171; 211 | --ion-color-step-450: #7d7d7d; 212 | --ion-color-step-500: #898989; 213 | --ion-color-step-550: #949494; 214 | --ion-color-step-600: #a0a0a0; 215 | --ion-color-step-650: #acacac; 216 | --ion-color-step-700: #b8b8b8; 217 | --ion-color-step-750: #c4c4c4; 218 | --ion-color-step-800: #d0d0d0; 219 | --ion-color-step-850: #dbdbdb; 220 | --ion-color-step-900: #e7e7e7; 221 | --ion-color-step-950: #f3f3f3; 222 | 223 | --ion-item-background: #1e1e1e; 224 | 225 | --ion-toolbar-background: #1f1f1f; 226 | 227 | --ion-tab-bar-background: #1f1f1f; 228 | 229 | --ion-card-background: #1e1e1e; 230 | } 231 | } 232 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines. 4 | 5 | ## [8.0.0](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v7.0.2...v8.0.0) (2025-04-24) 6 | 7 | 8 | ### ⚠ BREAKING CHANGES 9 | 10 | * support for Capacitor 7 11 | 12 | ### Features 13 | 14 | * support for Capacitor 7 ([a14571f](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/a14571f1d365d2f07c5d5938651082d6e5fc0de6)) 15 | 16 | 17 | ### Maintenance 18 | 19 | * prettier ([c02b62b](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/c02b62b05e4117df4a5146cc657dd45ac10c07c5)) 20 | 21 | ## [7.0.2](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v7.0.1...v7.0.2) (2024-07-17) 22 | 23 | 24 | ### Bug Fixes 25 | 26 | * work around deprecation warning ([4966f13](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/4966f1388a73eb8afe827dba6bed76329866c721)) 27 | 28 | 29 | ### Maintenance 30 | 31 | * update deps ([7716734](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/77167344e6faeadd5c92824e1391e180583953cb)) 32 | 33 | ## [7.0.1](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v7.0.0...v7.0.1) (2024-07-16) 34 | 35 | 36 | ### Maintenance 37 | 38 | * update deps ([9be7598](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/9be75985c08f0d9b869e6e5cbf79e47b88bdf6ad)) 39 | 40 | ## [7.0.0](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v6.1.2...v7.0.0) (2024-04-22) 41 | 42 | 43 | ### ⚠ BREAKING CHANGES 44 | 45 | * upgrade to Capacitor 6 and Ionic 8 46 | 47 | ### Features 48 | 49 | * upgrade to Capacitor 6 and Ionic 8 ([5ebdde6](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/5ebdde6a188d030a4987900f4d99eaf244f57b0b)) 50 | 51 | ## [6.1.2](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v6.1.1...v6.1.2) (2024-04-04) 52 | 53 | 54 | ### Maintenance 55 | 56 | * update deps ([48e5b93](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/48e5b9388d25e98ee4709c855a38a3f5d47eea3c)) 57 | 58 | ## [6.1.1](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v6.1.0...v6.1.1) (2024-01-24) 59 | 60 | 61 | ### Maintenance 62 | 63 | * update deps ([f520fa1](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/f520fa10a334b1a895e8e0aab95e4fd06205a093)) 64 | 65 | ## [6.1.0](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v6.0.1...v6.1.0) (2024-01-10) 66 | 67 | 68 | ### Features 69 | 70 | * support separate reason & code ([d7730c4](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/d7730c45428f630267d29a9e026cd5fad0c4ccea)) 71 | 72 | 73 | ### Maintenance 74 | 75 | * update deps ([9d03544](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/9d035440ccb888737952085638dff6f9b0a41c13)) 76 | 77 | ## [6.0.1](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v6.0.0...v6.0.1) (2024-01-02) 78 | 79 | 80 | ### Maintenance 81 | 82 | * update plugin dep ([520d37e](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/520d37ee4861e4c562e4c52840aaa9ccdf7c1ea0)) 83 | * upgrade gradle ([c835dc8](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/c835dc88bcb9b0c8822fed3ee1f1663ae3082158)) 84 | 85 | ## [6.0.0](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v5.0.0...v6.0.0) (2024-01-01) 86 | 87 | 88 | ### ⚠ BREAKING CHANGES 89 | 90 | * support for new plugin features 91 | 92 | ### Features 93 | 94 | * support for new plugin features ([626b93b](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/626b93b0379614f5d5a01dad9d5a28f2ff14b2cf)) 95 | 96 | ## [5.0.0](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v4.2.1...v5.0.0) (2023-11-13) 97 | 98 | 99 | ### ⚠ BREAKING CHANGES 100 | 101 | * authenticate() now throws a BiometryError instance. 102 | 103 | ### Features 104 | 105 | * upgrade to plugin v6 ([74d5e88](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/74d5e88d092dca031f5167c2e6c2d7d53e6494c4)) 106 | 107 | ## [4.2.1](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v4.2.0...v4.2.1) (2023-10-11) 108 | 109 | 110 | ### Maintenance 111 | 112 | * update deps ([5bd11ac](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/5bd11ac20b868dab3984dd440a002e834f87415d)) 113 | 114 | ## [4.2.0](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v4.1.0...v4.2.0) (2023-10-05) 115 | 116 | 117 | ### Features 118 | 119 | * add “Require confirmation” option, fix web ([1859ad4](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/1859ad49ff72bb1655af374fdbc605f4a1084026)) 120 | 121 | ## [4.1.0](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v4.0.1...v4.1.0) (2023-09-30) 122 | 123 | 124 | ### Features 125 | 126 | * support multiple biometry types ([64d4248](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/64d4248763c597c54a90dd308d7dacbc1ab03c97)) 127 | 128 | 129 | ### Maintenance 130 | 131 | * update deps ([0262462](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/0262462d4505b8d6a3364399c74f52ec5e0427cb)) 132 | 133 | ## [4.0.1](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v4.0.0...v4.0.1) (2023-06-21) 134 | 135 | 136 | ### Maintenance 137 | 138 | * update deps ([29677f3](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/29677f3f058edcd2ea642ce30de554dce42e8469)) 139 | 140 | ## [4.0.0](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v3.1.0...v4.0.0) (2023-06-15) 141 | 142 | 143 | ### ⚠ BREAKING CHANGES 144 | 145 | * upgrade to Ionic 7 + Capacitor 5 146 | 147 | ### Features 148 | 149 | * upgrade to Ionic 7 + Capacitor 5 ([374d100](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/374d10095cb96fe0c3d939020fafd74383fb4b21)) 150 | 151 | ## [3.1.0](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v3.0.5...v3.1.0) (2023-03-31) 152 | 153 | 154 | ### Features 155 | 156 | * show error code ([8cf5bdc](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/8cf5bdcb6787b7fb24b6b33f6f627fae27147c3c)) 157 | 158 | 159 | ### Maintenance 160 | 161 | * update deps ([506935c](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/506935ca19d655818e7923162565624940eb25d4)) 162 | 163 | ### [3.0.5](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v3.0.4...v3.0.5) (2022-10-24) 164 | 165 | 166 | ### Bug Fixes 167 | 168 | * can’t share package name with plugin ([ad56e24](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/ad56e245c6365e0c26376c3cfb0639c64e28b749)) 169 | * empty display on Android ([b297683](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/b297683f93e45319c94e04598f9655e3adb8bdd5)) 170 | 171 | 172 | ### Maintenance 173 | 174 | * update deps ([89910fb](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/89910fbcf0b9cc4eb5c137fd593f7b14a5b5e521)) 175 | 176 | ### [3.0.4](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v3.0.3...v3.0.4) (2022-08-12) 177 | 178 | 179 | ### Bug Fixes 180 | 181 | * typo in script name ([d6a37d2](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/d6a37d25eaff80c15663371be35f0c18c366170b)) 182 | 183 | 184 | ### Maintenance 185 | 186 | * remove all traces of ultra-runner ([db177c5](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/db177c537a17a99c5f643c8475ce68e1799e0e06)) 187 | * remove legacy for now ([851e011](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/851e0119fcf7f5262f791c18f3453c02624d8161)) 188 | * update to latest plugin ([890c32c](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/890c32cdc486a7994c44a2416cfed9844cdfc76e)) 189 | 190 | ### [3.0.3](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v3.0.2...v3.0.3) (2022-08-10) 191 | 192 | ### [3.0.2](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v3.0.1...v3.0.2) (2022-08-10) 193 | 194 | ### [3.0.1](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v3.0.0...v3.0.1) (2022-08-06) 195 | 196 | 197 | ### Bug Fixes 198 | 199 | * point to registry package ([7062394](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/7062394568cf1e9702e53988fd8aaa5a21f570f5)) 200 | 201 | 202 | ### Maintenance 203 | 204 | * change appId ([163c5b3](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/163c5b3c6b3cda3a40000f391c9d31af958aac32)) 205 | * might as well push ([cf1f327](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/cf1f327d1a3e6578e80067c3404efb781ac6040c)) 206 | * update deps ([9739d4d](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/9739d4dc8e51008af3afdc8caf482ba47cb5625a)) 207 | 208 | ## [3.0.0](https://github.com/aparajita/capacitor-biometric-auth-demo/compare/v2.0.5...v3.0.0) (2022-08-04) 209 | 210 | 211 | ### ⚠ BREAKING CHANGES 212 | 213 | * Capacitor 4 is now required. 214 | 215 | ### Features 216 | 217 | * upgrade to Capacitor 4 ([d35c5ac](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/d35c5acea82aeba61b72b7da3c50f40dfeb93185)) 218 | 219 | 220 | ### Refactoring 221 | 222 | * new build system ([cf95c45](https://github.com/aparajita/capacitor-biometric-auth-demo/commit/cf95c45d3a0d9971fe608b31ca05a3b00d369ec5)) 223 | -------------------------------------------------------------------------------- /src/components/BiometryView.vue: -------------------------------------------------------------------------------- 1 | 171 | 172 | 405 | -------------------------------------------------------------------------------- /ios/App/App.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; }; 11 | 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; }; 12 | 504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; }; 13 | 504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; }; 14 | 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; 15 | 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; 16 | A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; 17 | E1B29A4C285FC85C006BF241 /* public in Resources */ = {isa = PBXBuildFile; fileRef = E1B29A4B285FC85C006BF241 /* public */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; 22 | 50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; 23 | 504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; 24 | 504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 25 | 504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 26 | 504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 27 | 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 28 | 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 29 | AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; 31 | E1B29A4B285FC85C006BF241 /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; 32 | FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; }; 33 | /* End PBXFileReference section */ 34 | 35 | /* Begin PBXFrameworksBuildPhase section */ 36 | 504EC3011FED79650016851F /* Frameworks */ = { 37 | isa = PBXFrameworksBuildPhase; 38 | buildActionMask = 2147483647; 39 | files = ( 40 | A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */, 41 | ); 42 | runOnlyForDeploymentPostprocessing = 0; 43 | }; 44 | /* End PBXFrameworksBuildPhase section */ 45 | 46 | /* Begin PBXGroup section */ 47 | 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = { 48 | isa = PBXGroup; 49 | children = ( 50 | AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */, 51 | ); 52 | name = Frameworks; 53 | sourceTree = ""; 54 | }; 55 | 504EC2FB1FED79650016851F = { 56 | isa = PBXGroup; 57 | children = ( 58 | 504EC3061FED79650016851F /* App */, 59 | 504EC3051FED79650016851F /* Products */, 60 | 7F8756D8B27F46E3366F6CEA /* Pods */, 61 | 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */, 62 | ); 63 | sourceTree = ""; 64 | }; 65 | 504EC3051FED79650016851F /* Products */ = { 66 | isa = PBXGroup; 67 | children = ( 68 | 504EC3041FED79650016851F /* App.app */, 69 | ); 70 | name = Products; 71 | sourceTree = ""; 72 | }; 73 | 504EC3061FED79650016851F /* App */ = { 74 | isa = PBXGroup; 75 | children = ( 76 | 50379B222058CBB4000EE86E /* capacitor.config.json */, 77 | 504EC3071FED79650016851F /* AppDelegate.swift */, 78 | 504EC30B1FED79650016851F /* Main.storyboard */, 79 | 504EC30E1FED79650016851F /* Assets.xcassets */, 80 | 504EC3101FED79650016851F /* LaunchScreen.storyboard */, 81 | 504EC3131FED79650016851F /* Info.plist */, 82 | 2FAD9762203C412B000D30F8 /* config.xml */, 83 | E1B29A4B285FC85C006BF241 /* public */, 84 | ); 85 | path = App; 86 | sourceTree = ""; 87 | }; 88 | 7F8756D8B27F46E3366F6CEA /* Pods */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */, 92 | AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */, 93 | ); 94 | name = Pods; 95 | sourceTree = ""; 96 | }; 97 | /* End PBXGroup section */ 98 | 99 | /* Begin PBXNativeTarget section */ 100 | 504EC3031FED79650016851F /* App */ = { 101 | isa = PBXNativeTarget; 102 | buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */; 103 | buildPhases = ( 104 | 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */, 105 | 504EC3001FED79650016851F /* Sources */, 106 | 504EC3011FED79650016851F /* Frameworks */, 107 | 504EC3021FED79650016851F /* Resources */, 108 | 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, 109 | ); 110 | buildRules = ( 111 | ); 112 | dependencies = ( 113 | ); 114 | name = App; 115 | productName = App; 116 | productReference = 504EC3041FED79650016851F /* App.app */; 117 | productType = "com.apple.product-type.application"; 118 | }; 119 | /* End PBXNativeTarget section */ 120 | 121 | /* Begin PBXProject section */ 122 | 504EC2FC1FED79650016851F /* Project object */ = { 123 | isa = PBXProject; 124 | attributes = { 125 | LastSwiftUpdateCheck = 0920; 126 | LastUpgradeCheck = 1340; 127 | TargetAttributes = { 128 | 504EC3031FED79650016851F = { 129 | CreatedOnToolsVersion = 9.2; 130 | LastSwiftMigration = 1100; 131 | ProvisioningStyle = Automatic; 132 | }; 133 | }; 134 | }; 135 | buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */; 136 | compatibilityVersion = "Xcode 8.0"; 137 | developmentRegion = en; 138 | hasScannedForEncodings = 0; 139 | knownRegions = ( 140 | en, 141 | Base, 142 | ); 143 | mainGroup = 504EC2FB1FED79650016851F; 144 | productRefGroup = 504EC3051FED79650016851F /* Products */; 145 | projectDirPath = ""; 146 | projectRoot = ""; 147 | targets = ( 148 | 504EC3031FED79650016851F /* App */, 149 | ); 150 | }; 151 | /* End PBXProject section */ 152 | 153 | /* Begin PBXResourcesBuildPhase section */ 154 | 504EC3021FED79650016851F /* Resources */ = { 155 | isa = PBXResourcesBuildPhase; 156 | buildActionMask = 2147483647; 157 | files = ( 158 | 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */, 159 | 504EC30F1FED79650016851F /* Assets.xcassets in Resources */, 160 | 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */, 161 | E1B29A4C285FC85C006BF241 /* public in Resources */, 162 | 504EC30D1FED79650016851F /* Main.storyboard in Resources */, 163 | 2FAD9763203C412B000D30F8 /* config.xml in Resources */, 164 | ); 165 | runOnlyForDeploymentPostprocessing = 0; 166 | }; 167 | /* End PBXResourcesBuildPhase section */ 168 | 169 | /* Begin PBXShellScriptBuildPhase section */ 170 | 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = { 171 | isa = PBXShellScriptBuildPhase; 172 | buildActionMask = 2147483647; 173 | files = ( 174 | ); 175 | inputPaths = ( 176 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 177 | "${PODS_ROOT}/Manifest.lock", 178 | ); 179 | name = "[CP] Check Pods Manifest.lock"; 180 | outputPaths = ( 181 | "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt", 182 | ); 183 | runOnlyForDeploymentPostprocessing = 0; 184 | shellPath = /bin/sh; 185 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 186 | showEnvVarsInLog = 0; 187 | }; 188 | 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = { 189 | isa = PBXShellScriptBuildPhase; 190 | buildActionMask = 2147483647; 191 | files = ( 192 | ); 193 | inputPaths = ( 194 | ); 195 | name = "[CP] Embed Pods Frameworks"; 196 | outputPaths = ( 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | shellPath = /bin/sh; 200 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n"; 201 | showEnvVarsInLog = 0; 202 | }; 203 | /* End PBXShellScriptBuildPhase section */ 204 | 205 | /* Begin PBXSourcesBuildPhase section */ 206 | 504EC3001FED79650016851F /* Sources */ = { 207 | isa = PBXSourcesBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | 504EC3081FED79650016851F /* AppDelegate.swift in Sources */, 211 | ); 212 | runOnlyForDeploymentPostprocessing = 0; 213 | }; 214 | /* End PBXSourcesBuildPhase section */ 215 | 216 | /* Begin PBXVariantGroup section */ 217 | 504EC30B1FED79650016851F /* Main.storyboard */ = { 218 | isa = PBXVariantGroup; 219 | children = ( 220 | 504EC30C1FED79650016851F /* Base */, 221 | ); 222 | name = Main.storyboard; 223 | sourceTree = ""; 224 | }; 225 | 504EC3101FED79650016851F /* LaunchScreen.storyboard */ = { 226 | isa = PBXVariantGroup; 227 | children = ( 228 | 504EC3111FED79650016851F /* Base */, 229 | ); 230 | name = LaunchScreen.storyboard; 231 | sourceTree = ""; 232 | }; 233 | /* End PBXVariantGroup section */ 234 | 235 | /* Begin XCBuildConfiguration section */ 236 | 504EC3141FED79650016851F /* Debug */ = { 237 | isa = XCBuildConfiguration; 238 | buildSettings = { 239 | ALWAYS_SEARCH_USER_PATHS = NO; 240 | CLANG_ANALYZER_NONNULL = YES; 241 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 242 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 243 | CLANG_CXX_LIBRARY = "libc++"; 244 | CLANG_ENABLE_MODULES = YES; 245 | CLANG_ENABLE_OBJC_ARC = YES; 246 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 247 | CLANG_WARN_BOOL_CONVERSION = YES; 248 | CLANG_WARN_COMMA = YES; 249 | CLANG_WARN_CONSTANT_CONVERSION = YES; 250 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 251 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 252 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 253 | CLANG_WARN_EMPTY_BODY = YES; 254 | CLANG_WARN_ENUM_CONVERSION = YES; 255 | CLANG_WARN_INFINITE_RECURSION = YES; 256 | CLANG_WARN_INT_CONVERSION = YES; 257 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 258 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 259 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 260 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 261 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 262 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 263 | CLANG_WARN_STRICT_PROTOTYPES = YES; 264 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 265 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 266 | CLANG_WARN_UNREACHABLE_CODE = YES; 267 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 268 | CODE_SIGN_IDENTITY = "iPhone Developer"; 269 | COPY_PHASE_STRIP = NO; 270 | DEBUG_INFORMATION_FORMAT = dwarf; 271 | ENABLE_STRICT_OBJC_MSGSEND = YES; 272 | ENABLE_TESTABILITY = YES; 273 | GCC_C_LANGUAGE_STANDARD = gnu11; 274 | GCC_DYNAMIC_NO_PIC = NO; 275 | GCC_NO_COMMON_BLOCKS = YES; 276 | GCC_OPTIMIZATION_LEVEL = 0; 277 | GCC_PREPROCESSOR_DEFINITIONS = ( 278 | "DEBUG=1", 279 | "$(inherited)", 280 | ); 281 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 282 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 283 | GCC_WARN_UNDECLARED_SELECTOR = YES; 284 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 285 | GCC_WARN_UNUSED_FUNCTION = YES; 286 | GCC_WARN_UNUSED_VARIABLE = YES; 287 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 288 | MTL_ENABLE_DEBUG_INFO = YES; 289 | ONLY_ACTIVE_ARCH = YES; 290 | SDKROOT = iphoneos; 291 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 292 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 293 | }; 294 | name = Debug; 295 | }; 296 | 504EC3151FED79650016851F /* Release */ = { 297 | isa = XCBuildConfiguration; 298 | buildSettings = { 299 | ALWAYS_SEARCH_USER_PATHS = NO; 300 | CLANG_ANALYZER_NONNULL = YES; 301 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 302 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 303 | CLANG_CXX_LIBRARY = "libc++"; 304 | CLANG_ENABLE_MODULES = YES; 305 | CLANG_ENABLE_OBJC_ARC = YES; 306 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 307 | CLANG_WARN_BOOL_CONVERSION = YES; 308 | CLANG_WARN_COMMA = YES; 309 | CLANG_WARN_CONSTANT_CONVERSION = YES; 310 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 311 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 312 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 313 | CLANG_WARN_EMPTY_BODY = YES; 314 | CLANG_WARN_ENUM_CONVERSION = YES; 315 | CLANG_WARN_INFINITE_RECURSION = YES; 316 | CLANG_WARN_INT_CONVERSION = YES; 317 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 318 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 319 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 320 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 321 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 322 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 323 | CLANG_WARN_STRICT_PROTOTYPES = YES; 324 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 325 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 326 | CLANG_WARN_UNREACHABLE_CODE = YES; 327 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 328 | CODE_SIGN_IDENTITY = "iPhone Developer"; 329 | COPY_PHASE_STRIP = NO; 330 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 331 | ENABLE_NS_ASSERTIONS = NO; 332 | ENABLE_STRICT_OBJC_MSGSEND = YES; 333 | GCC_C_LANGUAGE_STANDARD = gnu11; 334 | GCC_NO_COMMON_BLOCKS = YES; 335 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 336 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 337 | GCC_WARN_UNDECLARED_SELECTOR = YES; 338 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 339 | GCC_WARN_UNUSED_FUNCTION = YES; 340 | GCC_WARN_UNUSED_VARIABLE = YES; 341 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 342 | MTL_ENABLE_DEBUG_INFO = NO; 343 | SDKROOT = iphoneos; 344 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 345 | VALIDATE_PRODUCT = YES; 346 | }; 347 | name = Release; 348 | }; 349 | 504EC3171FED79650016851F /* Debug */ = { 350 | isa = XCBuildConfiguration; 351 | baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */; 352 | buildSettings = { 353 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 354 | CODE_SIGN_STYLE = Automatic; 355 | DEVELOPMENT_TEAM = 4T36YYHY4V; 356 | INFOPLIST_FILE = App/Info.plist; 357 | IPHONEOS_DEPLOYMENT_TARGET = 14; 358 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 359 | OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; 360 | PRODUCT_BUNDLE_IDENTIFIER = com.aparajita.capacitor.biometricauth; 361 | PRODUCT_NAME = "$(TARGET_NAME)"; 362 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 363 | SWIFT_VERSION = 5.0; 364 | TARGETED_DEVICE_FAMILY = "1,2"; 365 | }; 366 | name = Debug; 367 | }; 368 | 504EC3181FED79650016851F /* Release */ = { 369 | isa = XCBuildConfiguration; 370 | baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */; 371 | buildSettings = { 372 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 373 | CODE_SIGN_STYLE = Automatic; 374 | DEVELOPMENT_TEAM = 4T36YYHY4V; 375 | INFOPLIST_FILE = App/Info.plist; 376 | IPHONEOS_DEPLOYMENT_TARGET = 14; 377 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 378 | PRODUCT_BUNDLE_IDENTIFIER = com.aparajita.capacitor.biometricauth; 379 | PRODUCT_NAME = "$(TARGET_NAME)"; 380 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; 381 | SWIFT_VERSION = 5.0; 382 | TARGETED_DEVICE_FAMILY = "1,2"; 383 | }; 384 | name = Release; 385 | }; 386 | /* End XCBuildConfiguration section */ 387 | 388 | /* Begin XCConfigurationList section */ 389 | 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = { 390 | isa = XCConfigurationList; 391 | buildConfigurations = ( 392 | 504EC3141FED79650016851F /* Debug */, 393 | 504EC3151FED79650016851F /* Release */, 394 | ); 395 | defaultConfigurationIsVisible = 0; 396 | defaultConfigurationName = Release; 397 | }; 398 | 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = { 399 | isa = XCConfigurationList; 400 | buildConfigurations = ( 401 | 504EC3171FED79650016851F /* Debug */, 402 | 504EC3181FED79650016851F /* Release */, 403 | ); 404 | defaultConfigurationIsVisible = 0; 405 | defaultConfigurationName = Release; 406 | }; 407 | /* End XCConfigurationList section */ 408 | }; 409 | rootObject = 504EC2FC1FED79650016851F /* Project object */; 410 | } 411 | -------------------------------------------------------------------------------- /github-markdown-dark.css: -------------------------------------------------------------------------------- 1 | .markdown-body { 2 | color-scheme: dark; 3 | -ms-text-size-adjust: 100%; 4 | -webkit-text-size-adjust: 100%; 5 | margin: 0; 6 | color: #c9d1d9; 7 | background-color: #0d1117; 8 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, 9 | sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji'; 10 | font-size: 16px; 11 | line-height: 1.5; 12 | word-wrap: break-word; 13 | } 14 | 15 | .markdown-body .octicon { 16 | display: inline-block; 17 | fill: currentColor; 18 | vertical-align: text-bottom; 19 | } 20 | 21 | .markdown-body h1:hover .anchor .octicon-link:before, 22 | .markdown-body h2:hover .anchor .octicon-link:before, 23 | .markdown-body h3:hover .anchor .octicon-link:before, 24 | .markdown-body h4:hover .anchor .octicon-link:before, 25 | .markdown-body h5:hover .anchor .octicon-link:before, 26 | .markdown-body h6:hover .anchor .octicon-link:before { 27 | width: 16px; 28 | height: 16px; 29 | content: ' '; 30 | display: inline-block; 31 | background-color: currentColor; 32 | -webkit-mask-image: url("data:image/svg+xml,"); 33 | mask-image: url("data:image/svg+xml,"); 34 | } 35 | 36 | .markdown-body details, 37 | .markdown-body figcaption, 38 | .markdown-body figure { 39 | display: block; 40 | } 41 | 42 | .markdown-body summary { 43 | display: list-item; 44 | } 45 | 46 | .markdown-body [hidden] { 47 | display: none !important; 48 | } 49 | 50 | .markdown-body a { 51 | background-color: transparent; 52 | color: #58a6ff; 53 | text-decoration: none; 54 | } 55 | 56 | .markdown-body a:active, 57 | .markdown-body a:hover { 58 | outline-width: 0; 59 | } 60 | 61 | .markdown-body abbr[title] { 62 | border-bottom: none; 63 | text-decoration: underline dotted; 64 | } 65 | 66 | .markdown-body b, 67 | .markdown-body strong { 68 | font-weight: 600; 69 | } 70 | 71 | .markdown-body dfn { 72 | font-style: italic; 73 | } 74 | 75 | .markdown-body h1 { 76 | margin: 0.67em 0; 77 | font-weight: 600; 78 | padding-bottom: 0.3em; 79 | font-size: 2em; 80 | border-bottom: 1px solid #21262d; 81 | } 82 | 83 | .markdown-body mark { 84 | background-color: rgba(187, 128, 9, 0.15); 85 | color: #c9d1d9; 86 | } 87 | 88 | .markdown-body small { 89 | font-size: 90%; 90 | } 91 | 92 | .markdown-body sub, 93 | .markdown-body sup { 94 | font-size: 75%; 95 | line-height: 0; 96 | position: relative; 97 | vertical-align: baseline; 98 | } 99 | 100 | .markdown-body sub { 101 | bottom: -0.25em; 102 | } 103 | 104 | .markdown-body sup { 105 | top: -0.5em; 106 | } 107 | 108 | .markdown-body img { 109 | border-style: none; 110 | max-width: 100%; 111 | box-sizing: content-box; 112 | background-color: #0d1117; 113 | } 114 | 115 | .markdown-body code, 116 | .markdown-body kbd, 117 | .markdown-body pre, 118 | .markdown-body samp { 119 | font-family: monospace, monospace; 120 | font-size: 1em; 121 | } 122 | 123 | .markdown-body figure { 124 | margin: 1em 40px; 125 | } 126 | 127 | .markdown-body hr { 128 | box-sizing: content-box; 129 | overflow: hidden; 130 | background: transparent; 131 | border-bottom: 1px solid #21262d; 132 | height: 0.25em; 133 | padding: 0; 134 | margin: 24px 0; 135 | background-color: #30363d; 136 | border: 0; 137 | } 138 | 139 | .markdown-body input { 140 | font: inherit; 141 | margin: 0; 142 | overflow: visible; 143 | font-family: inherit; 144 | font-size: inherit; 145 | line-height: inherit; 146 | } 147 | 148 | .markdown-body [type='button'], 149 | .markdown-body [type='reset'], 150 | .markdown-body [type='submit'] { 151 | -webkit-appearance: button; 152 | } 153 | 154 | .markdown-body [type='button']::-moz-focus-inner, 155 | .markdown-body [type='reset']::-moz-focus-inner, 156 | .markdown-body [type='submit']::-moz-focus-inner { 157 | border-style: none; 158 | padding: 0; 159 | } 160 | 161 | .markdown-body [type='button']:-moz-focusring, 162 | .markdown-body [type='reset']:-moz-focusring, 163 | .markdown-body [type='submit']:-moz-focusring { 164 | outline: 1px dotted ButtonText; 165 | } 166 | 167 | .markdown-body [type='checkbox'], 168 | .markdown-body [type='radio'] { 169 | box-sizing: border-box; 170 | padding: 0; 171 | } 172 | 173 | .markdown-body [type='number']::-webkit-inner-spin-button, 174 | .markdown-body [type='number']::-webkit-outer-spin-button { 175 | height: auto; 176 | } 177 | 178 | .markdown-body [type='search'] { 179 | -webkit-appearance: textfield; 180 | outline-offset: -2px; 181 | } 182 | 183 | .markdown-body [type='search']::-webkit-search-cancel-button, 184 | .markdown-body [type='search']::-webkit-search-decoration { 185 | -webkit-appearance: none; 186 | } 187 | 188 | .markdown-body ::-webkit-input-placeholder { 189 | color: inherit; 190 | opacity: 0.54; 191 | } 192 | 193 | .markdown-body ::-webkit-file-upload-button { 194 | -webkit-appearance: button; 195 | font: inherit; 196 | } 197 | 198 | .markdown-body a:hover { 199 | text-decoration: underline; 200 | } 201 | 202 | .markdown-body hr::before { 203 | display: table; 204 | content: ''; 205 | } 206 | 207 | .markdown-body hr::after { 208 | display: table; 209 | clear: both; 210 | content: ''; 211 | } 212 | 213 | .markdown-body table { 214 | border-spacing: 0; 215 | border-collapse: collapse; 216 | display: block; 217 | width: max-content; 218 | max-width: 100%; 219 | overflow: auto; 220 | } 221 | 222 | .markdown-body td, 223 | .markdown-body th { 224 | padding: 0; 225 | } 226 | 227 | .markdown-body details summary { 228 | cursor: pointer; 229 | } 230 | 231 | .markdown-body details:not([open]) > *:not(summary) { 232 | display: none !important; 233 | } 234 | 235 | .markdown-body kbd { 236 | display: inline-block; 237 | padding: 3px 5px; 238 | font: 239 | 11px ui-monospace, 240 | SFMono-Regular, 241 | SF Mono, 242 | Menlo, 243 | Consolas, 244 | Liberation Mono, 245 | monospace; 246 | line-height: 10px; 247 | color: #c9d1d9; 248 | vertical-align: middle; 249 | background-color: #161b22; 250 | border: solid 1px rgba(110, 118, 129, 0.4); 251 | border-bottom-color: rgba(110, 118, 129, 0.4); 252 | border-radius: 6px; 253 | box-shadow: inset 0 -1px 0 rgba(110, 118, 129, 0.4); 254 | } 255 | 256 | .markdown-body h1, 257 | .markdown-body h2, 258 | .markdown-body h3, 259 | .markdown-body h4, 260 | .markdown-body h5, 261 | .markdown-body h6 { 262 | margin-top: 24px; 263 | margin-bottom: 16px; 264 | font-weight: 600; 265 | line-height: 1.25; 266 | } 267 | 268 | .markdown-body h2 { 269 | font-weight: 600; 270 | padding-bottom: 0.3em; 271 | font-size: 1.5em; 272 | border-bottom: 1px solid #21262d; 273 | } 274 | 275 | .markdown-body h3 { 276 | font-weight: 600; 277 | font-size: 1.25em; 278 | } 279 | 280 | .markdown-body h4 { 281 | font-weight: 600; 282 | font-size: 1em; 283 | } 284 | 285 | .markdown-body h5 { 286 | font-weight: 600; 287 | font-size: 0.875em; 288 | } 289 | 290 | .markdown-body h6 { 291 | font-weight: 600; 292 | font-size: 0.85em; 293 | color: #8b949e; 294 | } 295 | 296 | .markdown-body p { 297 | margin-top: 0; 298 | margin-bottom: 10px; 299 | } 300 | 301 | .markdown-body blockquote { 302 | margin: 0; 303 | padding: 0 1em; 304 | color: #8b949e; 305 | border-left: 0.25em solid #30363d; 306 | } 307 | 308 | .markdown-body ul, 309 | .markdown-body ol { 310 | margin-top: 0; 311 | margin-bottom: 0; 312 | padding-left: 2em; 313 | } 314 | 315 | .markdown-body ol ol, 316 | .markdown-body ul ol { 317 | list-style-type: lower-roman; 318 | } 319 | 320 | .markdown-body ul ul ol, 321 | .markdown-body ul ol ol, 322 | .markdown-body ol ul ol, 323 | .markdown-body ol ol ol { 324 | list-style-type: lower-alpha; 325 | } 326 | 327 | .markdown-body dd { 328 | margin-left: 0; 329 | } 330 | 331 | .markdown-body tt, 332 | .markdown-body code { 333 | font-family: 334 | ui-monospace, 335 | SFMono-Regular, 336 | SF Mono, 337 | Menlo, 338 | Consolas, 339 | Liberation Mono, 340 | monospace; 341 | font-size: 12px; 342 | } 343 | 344 | .markdown-body pre { 345 | margin-top: 0; 346 | margin-bottom: 0; 347 | font-family: 348 | ui-monospace, 349 | SFMono-Regular, 350 | SF Mono, 351 | Menlo, 352 | Consolas, 353 | Liberation Mono, 354 | monospace; 355 | font-size: 12px; 356 | word-wrap: normal; 357 | } 358 | 359 | .markdown-body .octicon { 360 | display: inline-block; 361 | overflow: visible !important; 362 | vertical-align: text-bottom; 363 | fill: currentColor; 364 | } 365 | 366 | .markdown-body ::placeholder { 367 | color: #484f58; 368 | opacity: 1; 369 | } 370 | 371 | .markdown-body input::-webkit-outer-spin-button, 372 | .markdown-body input::-webkit-inner-spin-button { 373 | margin: 0; 374 | -webkit-appearance: none; 375 | appearance: none; 376 | } 377 | 378 | .markdown-body .pl-c { 379 | color: #8b949e; 380 | } 381 | 382 | .markdown-body .pl-c1, 383 | .markdown-body .pl-s .pl-v { 384 | color: #79c0ff; 385 | } 386 | 387 | .markdown-body .pl-e, 388 | .markdown-body .pl-en { 389 | color: #d2a8ff; 390 | } 391 | 392 | .markdown-body .pl-smi, 393 | .markdown-body .pl-s .pl-s1 { 394 | color: #c9d1d9; 395 | } 396 | 397 | .markdown-body .pl-ent { 398 | color: #7ee787; 399 | } 400 | 401 | .markdown-body .pl-k { 402 | color: #ff7b72; 403 | } 404 | 405 | .markdown-body .pl-s, 406 | .markdown-body .pl-pds, 407 | .markdown-body .pl-s .pl-pse .pl-s1, 408 | .markdown-body .pl-sr, 409 | .markdown-body .pl-sr .pl-cce, 410 | .markdown-body .pl-sr .pl-sre, 411 | .markdown-body .pl-sr .pl-sra { 412 | color: #a5d6ff; 413 | } 414 | 415 | .markdown-body .pl-v, 416 | .markdown-body .pl-smw { 417 | color: #ffa657; 418 | } 419 | 420 | .markdown-body .pl-bu { 421 | color: #f85149; 422 | } 423 | 424 | .markdown-body .pl-ii { 425 | color: #f0f6fc; 426 | background-color: #8e1519; 427 | } 428 | 429 | .markdown-body .pl-c2 { 430 | color: #f0f6fc; 431 | background-color: #b62324; 432 | } 433 | 434 | .markdown-body .pl-sr .pl-cce { 435 | font-weight: bold; 436 | color: #7ee787; 437 | } 438 | 439 | .markdown-body .pl-ml { 440 | color: #f2cc60; 441 | } 442 | 443 | .markdown-body .pl-mh, 444 | .markdown-body .pl-mh .pl-en, 445 | .markdown-body .pl-ms { 446 | font-weight: bold; 447 | color: #1f6feb; 448 | } 449 | 450 | .markdown-body .pl-mi { 451 | font-style: italic; 452 | color: #c9d1d9; 453 | } 454 | 455 | .markdown-body .pl-mb { 456 | font-weight: bold; 457 | color: #c9d1d9; 458 | } 459 | 460 | .markdown-body .pl-md { 461 | color: #ffdcd7; 462 | background-color: #67060c; 463 | } 464 | 465 | .markdown-body .pl-mi1 { 466 | color: #aff5b4; 467 | background-color: #033a16; 468 | } 469 | 470 | .markdown-body .pl-mc { 471 | color: #ffdfb6; 472 | background-color: #5a1e02; 473 | } 474 | 475 | .markdown-body .pl-mi2 { 476 | color: #c9d1d9; 477 | background-color: #1158c7; 478 | } 479 | 480 | .markdown-body .pl-mdr { 481 | font-weight: bold; 482 | color: #d2a8ff; 483 | } 484 | 485 | .markdown-body .pl-ba { 486 | color: #8b949e; 487 | } 488 | 489 | .markdown-body .pl-sg { 490 | color: #484f58; 491 | } 492 | 493 | .markdown-body .pl-corl { 494 | text-decoration: underline; 495 | color: #a5d6ff; 496 | } 497 | 498 | .markdown-body [data-catalyst] { 499 | display: block; 500 | } 501 | 502 | .markdown-body g-emoji { 503 | font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; 504 | font-size: 1em; 505 | font-style: normal !important; 506 | font-weight: 400; 507 | line-height: 1; 508 | vertical-align: -0.075em; 509 | } 510 | 511 | .markdown-body g-emoji img { 512 | width: 1em; 513 | height: 1em; 514 | } 515 | 516 | .markdown-body::before { 517 | display: table; 518 | content: ''; 519 | } 520 | 521 | .markdown-body::after { 522 | display: table; 523 | clear: both; 524 | content: ''; 525 | } 526 | 527 | .markdown-body > *:first-child { 528 | margin-top: 0 !important; 529 | } 530 | 531 | .markdown-body > *:last-child { 532 | margin-bottom: 0 !important; 533 | } 534 | 535 | .markdown-body a:not([href]) { 536 | color: inherit; 537 | text-decoration: none; 538 | } 539 | 540 | .markdown-body .absent { 541 | color: #f85149; 542 | } 543 | 544 | .markdown-body .anchor { 545 | float: left; 546 | padding-right: 4px; 547 | margin-left: -20px; 548 | line-height: 1; 549 | } 550 | 551 | .markdown-body .anchor:focus { 552 | outline: none; 553 | } 554 | 555 | .markdown-body p, 556 | .markdown-body blockquote, 557 | .markdown-body ul, 558 | .markdown-body ol, 559 | .markdown-body dl, 560 | .markdown-body table, 561 | .markdown-body pre, 562 | .markdown-body details { 563 | margin-top: 0; 564 | margin-bottom: 16px; 565 | } 566 | 567 | .markdown-body blockquote > :first-child { 568 | margin-top: 0; 569 | } 570 | 571 | .markdown-body blockquote > :last-child { 572 | margin-bottom: 0; 573 | } 574 | 575 | .markdown-body sup > a::before { 576 | content: '['; 577 | } 578 | 579 | .markdown-body sup > a::after { 580 | content: ']'; 581 | } 582 | 583 | .markdown-body h1 .octicon-link, 584 | .markdown-body h2 .octicon-link, 585 | .markdown-body h3 .octicon-link, 586 | .markdown-body h4 .octicon-link, 587 | .markdown-body h5 .octicon-link, 588 | .markdown-body h6 .octicon-link { 589 | color: #c9d1d9; 590 | vertical-align: middle; 591 | visibility: hidden; 592 | } 593 | 594 | .markdown-body h1:hover .anchor, 595 | .markdown-body h2:hover .anchor, 596 | .markdown-body h3:hover .anchor, 597 | .markdown-body h4:hover .anchor, 598 | .markdown-body h5:hover .anchor, 599 | .markdown-body h6:hover .anchor { 600 | text-decoration: none; 601 | } 602 | 603 | .markdown-body h1:hover .anchor .octicon-link, 604 | .markdown-body h2:hover .anchor .octicon-link, 605 | .markdown-body h3:hover .anchor .octicon-link, 606 | .markdown-body h4:hover .anchor .octicon-link, 607 | .markdown-body h5:hover .anchor .octicon-link, 608 | .markdown-body h6:hover .anchor .octicon-link { 609 | visibility: visible; 610 | } 611 | 612 | .markdown-body h1 tt, 613 | .markdown-body h1 code, 614 | .markdown-body h2 tt, 615 | .markdown-body h2 code, 616 | .markdown-body h3 tt, 617 | .markdown-body h3 code, 618 | .markdown-body h4 tt, 619 | .markdown-body h4 code, 620 | .markdown-body h5 tt, 621 | .markdown-body h5 code, 622 | .markdown-body h6 tt, 623 | .markdown-body h6 code { 624 | padding: 0 0.2em; 625 | font-size: inherit; 626 | } 627 | 628 | .markdown-body ul.no-list, 629 | .markdown-body ol.no-list { 630 | padding: 0; 631 | list-style-type: none; 632 | } 633 | 634 | .markdown-body ol[type='1'] { 635 | list-style-type: decimal; 636 | } 637 | 638 | .markdown-body ol[type='a'] { 639 | list-style-type: lower-alpha; 640 | } 641 | 642 | .markdown-body ol[type='i'] { 643 | list-style-type: lower-roman; 644 | } 645 | 646 | .markdown-body div > ol:not([type]) { 647 | list-style-type: decimal; 648 | } 649 | 650 | .markdown-body ul ul, 651 | .markdown-body ul ol, 652 | .markdown-body ol ol, 653 | .markdown-body ol ul { 654 | margin-top: 0; 655 | margin-bottom: 0; 656 | } 657 | 658 | .markdown-body li > p { 659 | margin-top: 16px; 660 | } 661 | 662 | .markdown-body li + li { 663 | margin-top: 0.25em; 664 | } 665 | 666 | .markdown-body dl { 667 | padding: 0; 668 | } 669 | 670 | .markdown-body dl dt { 671 | padding: 0; 672 | margin-top: 16px; 673 | font-size: 1em; 674 | font-style: italic; 675 | font-weight: 600; 676 | } 677 | 678 | .markdown-body dl dd { 679 | padding: 0 16px; 680 | margin-bottom: 16px; 681 | } 682 | 683 | .markdown-body table th { 684 | font-weight: 600; 685 | } 686 | 687 | .markdown-body table th, 688 | .markdown-body table td { 689 | padding: 6px 13px; 690 | border: 1px solid #30363d; 691 | } 692 | 693 | .markdown-body table tr { 694 | background-color: #0d1117; 695 | border-top: 1px solid #21262d; 696 | } 697 | 698 | .markdown-body table tr:nth-child(2n) { 699 | background-color: #161b22; 700 | } 701 | 702 | .markdown-body table img { 703 | background-color: transparent; 704 | } 705 | 706 | .markdown-body img[align='right'] { 707 | padding-left: 20px; 708 | } 709 | 710 | .markdown-body img[align='left'] { 711 | padding-right: 20px; 712 | } 713 | 714 | .markdown-body .emoji { 715 | max-width: none; 716 | vertical-align: text-top; 717 | background-color: transparent; 718 | } 719 | 720 | .markdown-body span.frame { 721 | display: block; 722 | overflow: hidden; 723 | } 724 | 725 | .markdown-body span.frame > span { 726 | display: block; 727 | float: left; 728 | width: auto; 729 | padding: 7px; 730 | margin: 13px 0 0; 731 | overflow: hidden; 732 | border: 1px solid #30363d; 733 | } 734 | 735 | .markdown-body span.frame span img { 736 | display: block; 737 | float: left; 738 | } 739 | 740 | .markdown-body span.frame span span { 741 | display: block; 742 | padding: 5px 0 0; 743 | clear: both; 744 | color: #c9d1d9; 745 | } 746 | 747 | .markdown-body span.align-center { 748 | display: block; 749 | overflow: hidden; 750 | clear: both; 751 | } 752 | 753 | .markdown-body span.align-center > span { 754 | display: block; 755 | margin: 13px auto 0; 756 | overflow: hidden; 757 | text-align: center; 758 | } 759 | 760 | .markdown-body span.align-center span img { 761 | margin: 0 auto; 762 | text-align: center; 763 | } 764 | 765 | .markdown-body span.align-right { 766 | display: block; 767 | overflow: hidden; 768 | clear: both; 769 | } 770 | 771 | .markdown-body span.align-right > span { 772 | display: block; 773 | margin: 13px 0 0; 774 | overflow: hidden; 775 | text-align: right; 776 | } 777 | 778 | .markdown-body span.align-right span img { 779 | margin: 0; 780 | text-align: right; 781 | } 782 | 783 | .markdown-body span.float-left { 784 | display: block; 785 | float: left; 786 | margin-right: 13px; 787 | overflow: hidden; 788 | } 789 | 790 | .markdown-body span.float-left span { 791 | margin: 13px 0 0; 792 | } 793 | 794 | .markdown-body span.float-right { 795 | display: block; 796 | float: right; 797 | margin-left: 13px; 798 | overflow: hidden; 799 | } 800 | 801 | .markdown-body span.float-right > span { 802 | display: block; 803 | margin: 13px auto 0; 804 | overflow: hidden; 805 | text-align: right; 806 | } 807 | 808 | .markdown-body code, 809 | .markdown-body tt { 810 | padding: 0.2em 0.4em; 811 | margin: 0; 812 | font-size: 85%; 813 | background-color: rgba(110, 118, 129, 0.4); 814 | border-radius: 6px; 815 | } 816 | 817 | .markdown-body code br, 818 | .markdown-body tt br { 819 | display: none; 820 | } 821 | 822 | .markdown-body del code { 823 | text-decoration: inherit; 824 | } 825 | 826 | .markdown-body pre code { 827 | font-size: 100%; 828 | } 829 | 830 | .markdown-body pre > code { 831 | padding: 0; 832 | margin: 0; 833 | word-break: normal; 834 | white-space: pre; 835 | background: transparent; 836 | border: 0; 837 | } 838 | 839 | .markdown-body .highlight { 840 | margin-bottom: 16px; 841 | } 842 | 843 | .markdown-body .highlight pre { 844 | margin-bottom: 0; 845 | word-break: normal; 846 | } 847 | 848 | .markdown-body .highlight pre, 849 | .markdown-body pre { 850 | padding: 16px; 851 | overflow: auto; 852 | font-size: 85%; 853 | line-height: 1.45; 854 | background-color: #161b22; 855 | border-radius: 6px; 856 | } 857 | 858 | .markdown-body pre code, 859 | .markdown-body pre tt { 860 | display: inline; 861 | max-width: auto; 862 | padding: 0; 863 | margin: 0; 864 | overflow: visible; 865 | line-height: inherit; 866 | word-wrap: normal; 867 | background-color: transparent; 868 | border: 0; 869 | } 870 | 871 | .markdown-body .csv-data td, 872 | .markdown-body .csv-data th { 873 | padding: 5px; 874 | overflow: hidden; 875 | font-size: 12px; 876 | line-height: 1; 877 | text-align: left; 878 | white-space: nowrap; 879 | } 880 | 881 | .markdown-body .csv-data .blob-num { 882 | padding: 10px 8px 9px; 883 | text-align: right; 884 | background: #0d1117; 885 | border: 0; 886 | } 887 | 888 | .markdown-body .csv-data tr { 889 | border-top: 0; 890 | } 891 | 892 | .markdown-body .csv-data th { 893 | font-weight: 600; 894 | background: #161b22; 895 | border-top: 0; 896 | } 897 | 898 | .markdown-body .footnotes { 899 | font-size: 12px; 900 | color: #8b949e; 901 | border-top: 1px solid #30363d; 902 | } 903 | 904 | .markdown-body .footnotes ol { 905 | padding-left: 16px; 906 | } 907 | 908 | .markdown-body .footnotes li { 909 | position: relative; 910 | } 911 | 912 | .markdown-body .footnotes li:target::before { 913 | position: absolute; 914 | top: -8px; 915 | right: -8px; 916 | bottom: -8px; 917 | left: -24px; 918 | pointer-events: none; 919 | content: ''; 920 | border: 2px solid #1f6feb; 921 | border-radius: 6px; 922 | } 923 | 924 | .markdown-body .footnotes li:target { 925 | color: #c9d1d9; 926 | } 927 | 928 | .markdown-body .footnotes .data-footnote-backref g-emoji { 929 | font-family: monospace; 930 | } 931 | 932 | .markdown-body .task-list-item { 933 | list-style-type: none; 934 | } 935 | 936 | .markdown-body .task-list-item label { 937 | font-weight: 400; 938 | } 939 | 940 | .markdown-body .task-list-item.enabled label { 941 | cursor: pointer; 942 | } 943 | 944 | .markdown-body .task-list-item + .task-list-item { 945 | margin-top: 3px; 946 | } 947 | 948 | .markdown-body .task-list-item .handle { 949 | display: none; 950 | } 951 | 952 | .markdown-body .task-list-item-checkbox { 953 | margin: 0 0.2em 0.25em -1.6em; 954 | vertical-align: middle; 955 | } 956 | 957 | .markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox { 958 | margin: 0 -1.6em 0.25em 0.2em; 959 | } 960 | 961 | .markdown-body ::-webkit-calendar-picker-indicator { 962 | filter: invert(50%); 963 | } 964 | --------------------------------------------------------------------------------