diff --git a/.env.ios b/.env.ios deleted file mode 100644 index 7a2b25a..0000000 --- a/.env.ios +++ /dev/null @@ -1,8 +0,0 @@ -# iOS / Capacitor build environment -# Used by: VITE_IOS_BUILD=true npm run build -# or: vite build --mode ios (requires .env.ios to be named .env.ios) -# -# Supabase vars are intentionally absent — iOS build is local-only storage. -# No user data leaves the device, keeping App Store privacy declarations clean. - -VITE_IOS_BUILD=true diff --git a/capacitor.config.ts b/capacitor.config.ts deleted file mode 100644 index a761423..0000000 --- a/capacitor.config.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { CapacitorConfig } from '@capacitor/cli'; - -const config: CapacitorConfig = { - appId: 'com.adamjolicoeur.timetraked', - appName: 'Timetraked', - webDir: 'dist', - - ios: { - // Respect safe-area insets (notch, home indicator) automatically - contentInset: 'always', - // Match the app's background so there is no flash during launch - backgroundColor: '#ffffff', - // Prevent the WKWebView itself from scrolling — the app manages scroll internally - scrollEnabled: false, - // Restricts navigation to the app bundle; blocks accidental external loads - limitsNavigationsToAppBoundDomains: true - }, - - experimental: { - ios: { - spm: { - // iOS 26 requires PackageDescription 6.2; without this cap sync defaults to 5.9 - swiftToolsVersion: '6.2' - } - } - }, - - plugins: { - Keyboard: { - // Shrink the body when the keyboard appears so fixed-bottom UI (MobileNav, - // bottom sheets) moves up with the keyboard automatically. - resize: 'body', - style: 'default', - resizeOnFullScreen: true - } - } -}; - -export default config; diff --git a/ios/.gitignore b/ios/.gitignore deleted file mode 100644 index f470299..0000000 --- a/ios/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -App/build -App/Pods -App/output -App/App/public -DerivedData -xcuserdata - -# Cordova plugins for Capacitor -capacitor-cordova-ios-plugins - -# Generated Config files -App/App/capacitor.config.json -App/App/config.xml diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj deleted file mode 100644 index 8e40643..0000000 --- a/ios/App/App.xcodeproj/project.pbxproj +++ /dev/null @@ -1,386 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 100; - objects = { - -/* Begin PBXBuildFile section */ - 2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; }; - 4D22ABE92AF431CB00220026 /* CapApp-SPM in Frameworks */ = {isa = PBXBuildFile; productRef = 4D22ABE82AF431CB00220026 /* CapApp-SPM */; }; - 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; }; - 504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; }; - 504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; }; - 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; - 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; - 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; - A03D22E02FACCAA400D5F84F /* TimeTrack.icon in Resources */ = {isa = PBXBuildFile; fileRef = A03D22DF2FACCAA400D5F84F /* TimeTrack.icon */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; - 50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; - 504EC3041FED79650016851F /* Timetraked.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Timetraked.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; - 958DCC722DB07C7200EA8C5F /* debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = debug.xcconfig; path = ../debug.xcconfig; sourceTree = SOURCE_ROOT; }; - A03D22DF2FACCAA400D5F84F /* TimeTrack.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = TimeTrack.icon; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 504EC3011FED79650016851F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - files = ( - 4D22ABE92AF431CB00220026 /* CapApp-SPM in Frameworks */, - ); - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 504EC2FB1FED79650016851F = { - isa = PBXGroup; - children = ( - 958DCC722DB07C7200EA8C5F /* debug.xcconfig */, - 504EC3061FED79650016851F /* App */, - 504EC3051FED79650016851F /* Products */, - ); - sourceTree = ""; - }; - 504EC3051FED79650016851F /* Products */ = { - isa = PBXGroup; - children = ( - 504EC3041FED79650016851F /* Timetraked.app */, - ); - name = Products; - sourceTree = ""; - }; - 504EC3061FED79650016851F /* App */ = { - isa = PBXGroup; - children = ( - 50379B222058CBB4000EE86E /* capacitor.config.json */, - 504EC3071FED79650016851F /* AppDelegate.swift */, - 504EC30B1FED79650016851F /* Main.storyboard */, - 504EC30E1FED79650016851F /* Assets.xcassets */, - 504EC3101FED79650016851F /* LaunchScreen.storyboard */, - 504EC3131FED79650016851F /* Info.plist */, - A03D22DF2FACCAA400D5F84F /* TimeTrack.icon */, - 2FAD9762203C412B000D30F8 /* config.xml */, - 50B271D01FEDC1A000F3C39B /* public */, - ); - path = App; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 504EC3031FED79650016851F /* Timetraked */ = { - isa = PBXNativeTarget; - buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "Timetraked" */; - buildPhases = ( - 504EC3001FED79650016851F /* Sources */, - 504EC3011FED79650016851F /* Frameworks */, - 504EC3021FED79650016851F /* Resources */, - ); - buildRules = ( - ); - name = Timetraked; - packageProductDependencies = ( - 4D22ABE82AF431CB00220026 /* CapApp-SPM */, - ); - productName = Timetraked; - productReference = 504EC3041FED79650016851F /* Timetraked.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 504EC2FC1FED79650016851F /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 2630; - LastUpgradeCheck = 2630; - TargetAttributes = { - 504EC3031FED79650016851F = { - CreatedOnToolsVersion = 9.2; - LastSwiftMigration = 1100; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 504EC2FB1FED79650016851F; - packageReferences = ( - D4C12C0A2AAA248700AAC8A2 /* XCLocalSwiftPackageReference "CapApp-SPM" */, - ); - preferredProjectObjectVersion = 100; - productRefGroup = 504EC3051FED79650016851F /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 504EC3031FED79650016851F /* Timetraked */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 504EC3021FED79650016851F /* Resources */ = { - isa = PBXResourcesBuildPhase; - files = ( - 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */, - 50B271D11FEDC1A000F3C39B /* public in Resources */, - 504EC30F1FED79650016851F /* Assets.xcassets in Resources */, - 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */, - 504EC30D1FED79650016851F /* Main.storyboard in Resources */, - 2FAD9763203C412B000D30F8 /* config.xml in Resources */, - A03D22E02FACCAA400D5F84F /* TimeTrack.icon in Resources */, - ); - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 504EC3001FED79650016851F /* Sources */ = { - isa = PBXSourcesBuildPhase; - files = ( - 504EC3081FED79650016851F /* AppDelegate.swift in Sources */, - ); - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 504EC30B1FED79650016851F /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 504EC30C1FED79650016851F /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 504EC3101FED79650016851F /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 504EC3111FED79650016851F /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 504EC3141FED79650016851F /* Debug configuration for PBXProject "App" */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 958DCC722DB07C7200EA8C5F /* debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 26.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 504EC3151FED79650016851F /* Release configuration for PBXProject "App" */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 26.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 504EC3171FED79650016851F /* Debug configuration for PBXNativeTarget "Timetraked" */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 958DCC722DB07C7200EA8C5F /* debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = TimeTrack; - ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = J7D3ZTJ7SH; - INFOPLIST_FILE = App/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = Timetraked; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; - IPHONEOS_DEPLOYMENT_TARGET = 26.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_SWIFT_FLAGS = "$(inherited) \"-DDEBUG\""; - PRODUCT_BUNDLE_IDENTIFIER = com.adamjolicoeur.timetraked; - PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 504EC3181FED79650016851F /* Release configuration for PBXNativeTarget "Timetraked" */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = TimeTrack; - ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = J7D3ZTJ7SH; - INFOPLIST_FILE = App/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = Timetraked; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; - IPHONEOS_DEPLOYMENT_TARGET = 26.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.adamjolicoeur.timetraked; - PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 504EC3141FED79650016851F /* Debug configuration for PBXProject "App" */, - 504EC3151FED79650016851F /* Release configuration for PBXProject "App" */, - ); - defaultConfigurationName = Release; - }; - 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "Timetraked" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 504EC3171FED79650016851F /* Debug configuration for PBXNativeTarget "Timetraked" */, - 504EC3181FED79650016851F /* Release configuration for PBXNativeTarget "Timetraked" */, - ); - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCLocalSwiftPackageReference section */ - D4C12C0A2AAA248700AAC8A2 /* XCLocalSwiftPackageReference "CapApp-SPM" */ = { - isa = XCLocalSwiftPackageReference; - relativePath = "CapApp-SPM"; - }; -/* End XCLocalSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 4D22ABE82AF431CB00220026 /* CapApp-SPM */ = { - isa = XCSwiftPackageProductDependency; - package = D4C12C0A2AAA248700AAC8A2 /* XCLocalSwiftPackageReference "CapApp-SPM" */; - productName = "CapApp-SPM"; - }; -/* End XCSwiftPackageProductDependency section */ - }; - rootObject = 504EC2FC1FED79650016851F /* Project object */; -} diff --git a/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 6e461b7..0000000 --- a/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,15 +0,0 @@ -{ - "originHash" : "b7d16c968312d279d4245bcf6153959e4c21bf85ca1557fa871c62e5b8fabfd0", - "pins" : [ - { - "identity" : "capacitor-swift-pm", - "kind" : "remoteSourceControl", - "location" : "https://github.com/ionic-team/capacitor-swift-pm.git", - "state" : { - "revision" : "f1a8fadf1437c23b825c818fb6509c9dbbae2f61", - "version" : "8.3.1" - } - } - ], - "version" : 3 -} diff --git a/ios/App/App.xcodeproj/xcshareddata/xcschemes/TimeTrackerPro.xcscheme b/ios/App/App.xcodeproj/xcshareddata/xcschemes/TimeTrackerPro.xcscheme deleted file mode 100644 index 30adcfc..0000000 --- a/ios/App/App.xcodeproj/xcshareddata/xcschemes/TimeTrackerPro.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/App/App/AppDelegate.swift b/ios/App/App/AppDelegate.swift deleted file mode 100644 index f9ef495..0000000 --- a/ios/App/App/AppDelegate.swift +++ /dev/null @@ -1,26 +0,0 @@ -import UIKit -import Capacitor - -@main -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - return true - } - - func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { - // Called when the app was launched with a url. Feel free to add additional processing here, - // but if you want the App API to support tracking app url opens, make sure to keep this call - return ApplicationDelegateProxy.shared.application(app, open: url, options: options) - } - - func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { - // Called when the app was launched with an activity, including Universal Links. - // Feel free to add additional processing here, but if you want the App API to support - // tracking app url opens, make sure to keep this call - return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) - } - -} diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index e9c0651..0000000 --- a/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "images" : [ - { - "filename" : "favicon.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/favicon.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/favicon.png deleted file mode 100644 index b15d433..0000000 Binary files a/ios/App/App/Assets.xcassets/AppIcon.appiconset/favicon.png and /dev/null differ diff --git a/ios/App/App/Assets.xcassets/Contents.json b/ios/App/App/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/ios/App/App/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json b/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json deleted file mode 100644 index 09837de..0000000 --- a/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "splash-screen.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "splash-screen 1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "splash-screen 2.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-screen 1.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-screen 1.png deleted file mode 100644 index a8ae1aa..0000000 Binary files a/ios/App/App/Assets.xcassets/Splash.imageset/splash-screen 1.png and /dev/null differ diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-screen 2.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-screen 2.png deleted file mode 100644 index a8ae1aa..0000000 Binary files a/ios/App/App/Assets.xcassets/Splash.imageset/splash-screen 2.png and /dev/null differ diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-screen.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-screen.png deleted file mode 100644 index a8ae1aa..0000000 Binary files a/ios/App/App/Assets.xcassets/Splash.imageset/splash-screen.png and /dev/null differ diff --git a/ios/App/App/Base.lproj/LaunchScreen.storyboard b/ios/App/App/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 2aa21bb..0000000 --- a/ios/App/App/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/App/App/Base.lproj/Main.storyboard b/ios/App/App/Base.lproj/Main.storyboard deleted file mode 100644 index b44df7b..0000000 --- a/ios/App/App/Base.lproj/Main.storyboard +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/ios/App/App/Info.plist b/ios/App/App/Info.plist deleted file mode 100644 index 1e1d695..0000000 --- a/ios/App/App/Info.plist +++ /dev/null @@ -1,51 +0,0 @@ - - - - - CAPACITOR_DEBUG - $(CAPACITOR_DEBUG) - CFBundleDevelopmentRegion - en - CFBundleDisplayName - Timetraked - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/ios/App/App/TimeTrack.icon/Assets/Group 3.svg b/ios/App/App/TimeTrack.icon/Assets/Group 3.svg deleted file mode 100644 index 646cf58..0000000 --- a/ios/App/App/TimeTrack.icon/Assets/Group 3.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/App/App/TimeTrack.icon/Assets/Group 4.svg b/ios/App/App/TimeTrack.icon/Assets/Group 4.svg deleted file mode 100644 index a0eb832..0000000 --- a/ios/App/App/TimeTrack.icon/Assets/Group 4.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/ios/App/App/TimeTrack.icon/Assets/Vector.svg b/ios/App/App/TimeTrack.icon/Assets/Vector.svg deleted file mode 100644 index eb46eb3..0000000 --- a/ios/App/App/TimeTrack.icon/Assets/Vector.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ios/App/App/TimeTrack.icon/icon.json b/ios/App/App/TimeTrack.icon/icon.json deleted file mode 100644 index ca085db..0000000 --- a/ios/App/App/TimeTrack.icon/icon.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "fill" : { - "automatic-gradient" : "srgb:0.01176,0.15294,0.41569,1.00000" - }, - "groups" : [ - { - "blur-material" : null, - "hidden" : true, - "layers" : [ - { - "fill" : { - "solid" : "display-p3:0.82251,0.81110,0.96783,1.00000" - }, - "glass" : true, - "image-name" : "Vector.svg", - "name" : "Vector", - "position" : { - "scale" : 1, - "translation-in-points" : [ - -187.5043940536824, - 78.81918975031795 - ] - } - } - ], - "lighting" : "individual", - "shadow" : { - "kind" : "layer-color", - "opacity" : 0.5 - }, - "specular" : true, - "translucency" : { - "enabled" : false, - "value" : 0.5 - } - }, - { - "blur-material" : null, - "hidden" : true, - "layers" : [ - { - "fill" : { - "linear-gradient" : [ - "display-p3:0.23936,0.37523,0.66670,1.00000", - "display-p3:0.07587,0.21740,0.52102,1.00000" - ], - "orientation" : { - "start" : { - "x" : 0.5, - "y" : 0 - }, - "stop" : { - "x" : 1, - "y" : 0 - } - } - }, - "glass" : true, - "image-name" : "Group 4.svg", - "name" : "Group 4", - "position" : { - "scale" : 1, - "translation-in-points" : [ - 0.08449999999993452, - -46.52115620560636 - ] - } - } - ], - "shadow" : { - "kind" : "neutral", - "opacity" : 0.5 - }, - "translucency" : { - "enabled" : false, - "value" : 0.5 - } - }, - { - "blur-material" : null, - "layers" : [ - { - "fill" : { - "automatic-gradient" : "extended-gray:0.75000,1.00000" - }, - "image-name" : "Group 3.svg", - "name" : "Group 3", - "position" : { - "scale" : 1, - "translation-in-points" : [ - 0, - 0.00017297796205184568 - ] - } - } - ], - "shadow" : { - "kind" : "neutral", - "opacity" : 0.5 - }, - "translucency" : { - "enabled" : false, - "value" : 0.5 - } - } - ], - "supported-platforms" : { - "circles" : [ - "watchOS" - ], - "squares" : "shared" - } -} \ No newline at end of file diff --git a/ios/App/CapApp-SPM/.gitignore b/ios/App/CapApp-SPM/.gitignore deleted file mode 100644 index 3b29812..0000000 --- a/ios/App/CapApp-SPM/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -.DS_Store -/.build -/Packages -/*.xcodeproj -xcuserdata/ -DerivedData/ -.swiftpm/config/registries.json -.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata -.netrc diff --git a/ios/App/CapApp-SPM/Package.swift b/ios/App/CapApp-SPM/Package.swift deleted file mode 100644 index 0e8a144..0000000 --- a/ios/App/CapApp-SPM/Package.swift +++ /dev/null @@ -1,33 +0,0 @@ -// swift-tools-version: 6.2 -import PackageDescription - -// DO NOT MODIFY THIS FILE - managed by Capacitor CLI commands -let package = Package( - name: "CapApp-SPM", - platforms: [.iOS(.v26)], - products: [ - .library( - name: "CapApp-SPM", - targets: ["CapApp-SPM"]) - ], - dependencies: [ - .package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", exact: "8.3.1"), - .package(name: "CapacitorApp", path: "../../../node_modules/@capacitor/app"), - .package(name: "CapacitorHaptics", path: "../../../node_modules/@capacitor/haptics"), - .package(name: "CapacitorKeyboard", path: "../../../node_modules/@capacitor/keyboard"), - .package(name: "CapacitorStatusBar", path: "../../../node_modules/@capacitor/status-bar") - ], - targets: [ - .target( - name: "CapApp-SPM", - dependencies: [ - .product(name: "Capacitor", package: "capacitor-swift-pm"), - .product(name: "Cordova", package: "capacitor-swift-pm"), - .product(name: "CapacitorApp", package: "CapacitorApp"), - .product(name: "CapacitorHaptics", package: "CapacitorHaptics"), - .product(name: "CapacitorKeyboard", package: "CapacitorKeyboard"), - .product(name: "CapacitorStatusBar", package: "CapacitorStatusBar") - ] - ) - ] -) diff --git a/ios/App/CapApp-SPM/README.md b/ios/App/CapApp-SPM/README.md deleted file mode 100644 index 03964db..0000000 --- a/ios/App/CapApp-SPM/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# CapApp-SPM - -This package is used to host SPM dependencies for your Capacitor project - -Do not modify the contents of it or there may be unintended consequences. diff --git a/ios/App/CapApp-SPM/Sources/CapApp-SPM/CapApp-SPM.swift b/ios/App/CapApp-SPM/Sources/CapApp-SPM/CapApp-SPM.swift deleted file mode 100644 index 945afec..0000000 --- a/ios/App/CapApp-SPM/Sources/CapApp-SPM/CapApp-SPM.swift +++ /dev/null @@ -1 +0,0 @@ -public let isCapacitorApp = true diff --git a/ios/debug.xcconfig b/ios/debug.xcconfig deleted file mode 100644 index 53ce18d..0000000 --- a/ios/debug.xcconfig +++ /dev/null @@ -1 +0,0 @@ -CAPACITOR_DEBUG = true diff --git a/package-lock.json b/package-lock.json index c09ce15..65471e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,6 @@ "name": "timetraked", "version": "0.49.0", "dependencies": { - "@capacitor/app": "^8.1.0", - "@capacitor/core": "^8.3.1", - "@capacitor/haptics": "^8.0.2", - "@capacitor/ios": "^8.3.1", - "@capacitor/keyboard": "^8.0.3", - "@capacitor/status-bar": "^8.0.2", "@hookform/resolvers": "^3.10.0", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-alert-dialog": "^1.1.15", @@ -68,7 +62,6 @@ "zod": "^3.25.76" }, "devDependencies": { - "@capacitor/cli": "^8.3.1", "@eslint/js": "^9.39.4", "@playwright/test": "^1.56.1", "@tailwindcss/typography": "^0.5.15", @@ -1726,93 +1719,6 @@ "node": ">=6.9.0" } }, - "node_modules/@capacitor/app": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-8.1.0.tgz", - "integrity": "sha512-MlmttTOWHDedr/G4SrhNRxsXMqY+R75S4MM4eIgzsgCzOYhb/MpCkA5Q3nuOCfL1oHm26xjUzqZ5aupbOwdfYg==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": ">=8.0.0" - } - }, - "node_modules/@capacitor/cli": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-8.3.1.tgz", - "integrity": "sha512-1sPGW4THTDfR6YjXwZ0jM7oAfAtciPOHN00qs/3sNAQx1kKrrEYSfDPwCm1/xlAgi0OeL69SiRfw314Ans+1sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ionic/cli-framework-output": "^2.2.8", - "@ionic/utils-subprocess": "^3.0.1", - "@ionic/utils-terminal": "^2.3.5", - "commander": "^12.1.0", - "debug": "^4.4.0", - "env-paths": "^2.2.0", - "fs-extra": "^11.2.0", - "kleur": "^4.1.5", - "native-run": "^2.0.3", - "open": "^8.4.0", - "plist": "^3.1.0", - "prompts": "^2.4.2", - "rimraf": "^6.0.1", - "semver": "^7.6.3", - "tar": "^7.5.3", - "tslib": "^2.8.1", - "xml2js": "^0.6.2" - }, - "bin": { - "cap": "bin/capacitor", - "capacitor": "bin/capacitor" - }, - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/@capacitor/core": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.3.1.tgz", - "integrity": "sha512-UF8ItlHguU1Z6GXfPTeT2gakf+ctNI8pAS1kwSBQlsJMlfD4OPoto/SmKnOxKCQvnF4WRcdWeg6C0zREUNaAQg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@capacitor/haptics": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-8.0.2.tgz", - "integrity": "sha512-c2hZzRR5Fk1tbTvhG1jhh2XBAf3EhnIerMIb2sl7Mt41Gxx1fhBJFDa0/BI1IbY4loVepyyuqNC9820/GZuoWQ==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": ">=8.0.0" - } - }, - "node_modules/@capacitor/ios": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-8.3.1.tgz", - "integrity": "sha512-BEhLyYYHWJLib4mpaPMaaylbC8meqgxbNYwQJH2svsSLW7yo/hFie+Zoo66a44XnqcMd2tvmAuzimWunXZi/xA==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": "^8.3.0" - } - }, - "node_modules/@capacitor/keyboard": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-8.0.3.tgz", - "integrity": "sha512-27Bv5/2w1Ss2njguBgTS98O0Bb8DRJhAARyzXYib0JlT/n6BrJw/EZ0CokM4C8GFUjFDjJnEKF1Ie01buTMEXQ==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": ">=8.0.0" - } - }, - "node_modules/@capacitor/status-bar": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-8.0.2.tgz", - "integrity": "sha512-WXs8YB8B9eEaPZz+bcdY6t2nForF1FLoj/JU0Dl9RRgQnddnS98FEEyDooQhaY7wivr000j4+SC1FyeJkrFO7A==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": ">=8.0.0" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -2613,154 +2519,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@ionic/cli-framework-output": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", - "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ionic/utils-terminal": "2.3.5", - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-array": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", - "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-fs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", - "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/fs-extra": "^8.0.0", - "debug": "^4.0.0", - "fs-extra": "^9.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-fs/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@ionic/utils-object": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", - "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-process": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", - "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ionic/utils-object": "2.1.6", - "@ionic/utils-terminal": "2.3.5", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz", - "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-subprocess": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", - "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ionic/utils-array": "2.1.6", - "@ionic/utils-fs": "3.1.7", - "@ionic/utils-process": "2.1.12", - "@ionic/utils-stream": "3.1.7", - "@ionic/utils-terminal": "2.3.5", - "cross-spawn": "^7.0.3", - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-terminal": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", - "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/slice-ansi": "^4.0.0", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "slice-ansi": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "tslib": "^2.0.1", - "untildify": "^4.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@isaacs/cliui": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", @@ -2771,19 +2529,6 @@ "node": ">=18" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -5825,16 +5570,6 @@ "@types/estree": "*" } }, - "node_modules/@types/fs-extra": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", - "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -5908,13 +5643,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -6412,16 +6140,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@xmldom/xmldom": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", - "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.6" - } - }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -6614,16 +6332,6 @@ "node": "*" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -6773,27 +6481,6 @@ "dev": true, "license": "MIT" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/baseline-browser-mapping": { "version": "2.10.23", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.23.tgz", @@ -6807,16 +6494,6 @@ "node": ">=6.0.0" } }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -6829,19 +6506,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, "node_modules/brace-expansion": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", @@ -6899,16 +6563,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -7151,16 +6805,6 @@ "node": ">= 6" } }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -7234,16 +6878,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -7684,16 +7318,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -7827,19 +7451,6 @@ "dev": true, "license": "ISC" }, - "node_modules/elementtree": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", - "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "sax": "1.1.4" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/embla-carousel": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", @@ -7868,13 +7479,6 @@ "embla-carousel": "8.6.0" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -7888,16 +7492,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/es-abstract": { "version": "1.24.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", @@ -8446,16 +8040,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -8612,21 +8196,6 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -8797,24 +8366,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -8827,45 +8378,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/globals": { "version": "15.15.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", @@ -9186,23 +8698,6 @@ "node": ">=8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/inline-style-parser": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", @@ -9430,22 +8925,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -9471,16 +8950,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -9779,19 +9248,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -9988,16 +9444,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -11132,19 +10578,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/mlly": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", @@ -11200,32 +10633,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/native-run": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.3.tgz", - "integrity": "sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ionic/utils-fs": "^3.1.7", - "@ionic/utils-terminal": "^2.3.4", - "bplist-parser": "^0.3.2", - "debug": "^4.3.4", - "elementtree": "^0.1.7", - "ini": "^4.1.1", - "plist": "^3.1.0", - "split2": "^4.2.0", - "through2": "^4.0.2", - "tslib": "^2.6.2", - "yauzl": "^2.10.0" - }, - "bin": { - "native-run": "bin/native-run" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -11390,24 +10797,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -11594,13 +10983,6 @@ "node": "*" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -11688,21 +11070,6 @@ "node": ">=18" } }, - "node_modules/plist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", - "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.9.10", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -11934,30 +11301,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prompts/node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -12470,21 +11813,6 @@ "pify": "^2.3.0" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -12783,26 +12111,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", - "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^13.0.3", - "package-json-from-dist": "^1.0.1" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.60.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", @@ -12898,27 +12206,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -12961,13 +12248,6 @@ "dev": true, "license": "MIT" }, - "node_modules/sax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", - "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", - "dev": true, - "license": "ISC" - }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -13168,38 +12448,6 @@ "dev": true, "license": "ISC" }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/smob": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/smob/-/smob-1.6.1.tgz", @@ -13311,16 +12559,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -13349,31 +12587,6 @@ "node": ">= 0.4" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string.prototype.matchall": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", @@ -13490,19 +12703,6 @@ "node": ">=4" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", @@ -13722,23 +12922,6 @@ "node": ">=4" } }, - "node_modules/tar": { - "version": "7.5.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", - "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -13828,16 +13011,6 @@ "node": ">=0.8" } }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -13974,16 +13147,6 @@ "node": ">=18" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -14418,16 +13581,6 @@ "node": ">= 10.0.0" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -15433,24 +14586,6 @@ "workbox-core": "7.4.0" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/ws": { "version": "8.20.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", @@ -15482,40 +14617,6 @@ "node": ">=18" } }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -15523,27 +14624,6 @@ "dev": true, "license": "MIT" }, - "node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 212b1bc..646dc87 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,6 @@ "scripts": { "dev": "vite", "build": "vite build", - "build:ios": "vite build --mode ios", - "sync:ios": "npm run build:ios && npx cap sync ios", - "open:ios": "open ios/App/App.xcodeproj/project.xcworkspace", "build:dev": "vite build --mode development", "lint": "eslint .", "test": "vitest", @@ -21,12 +18,6 @@ "screenshots:headed": "playwright test screenshots.spec.ts --headed" }, "dependencies": { - "@capacitor/app": "^8.1.0", - "@capacitor/core": "^8.3.1", - "@capacitor/haptics": "^8.0.2", - "@capacitor/ios": "^8.3.1", - "@capacitor/keyboard": "^8.0.3", - "@capacitor/status-bar": "^8.0.2", "@hookform/resolvers": "^3.10.0", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-alert-dialog": "^1.1.15", @@ -85,7 +76,6 @@ "@rollup/plugin-terser": ">=0.4.4" }, "devDependencies": { - "@capacitor/cli": "^8.3.1", "@eslint/js": "^9.39.4", "@playwright/test": "^1.56.1", "@tailwindcss/typography": "^0.5.15", diff --git a/public/pwa.css b/public/pwa.css index b430172..ef6a046 100644 --- a/public/pwa.css +++ b/public/pwa.css @@ -1,6 +1,6 @@ /* PWA-specific styles */ -/* Safe area insets for notched devices (iOS) */ +/* Safe area insets for notched devices */ :root { --safe-area-inset-top: env(safe-area-inset-top); --safe-area-inset-right: env(safe-area-inset-right); @@ -15,16 +15,9 @@ body { padding-right: var(--safe-area-inset-right); } -/* IosPageHeader consumes the safe-area-inset-top itself via paddingTop inline style. - Prevent double-stacking when running as a Capacitor iOS build. */ -.ios-build body { - padding-top: 0; -} - /* Add padding bottom for mobile nav on mobile devices */ -/* Note: iOS-specific padding is handled in the iOS section below */ @media (max-width: 768px) { - body:not(.ios-device) { + body { padding-bottom: calc(3rem + var(--safe-area-inset-bottom)); } } @@ -122,6 +115,20 @@ body { min-height: 44px; min-width: 44px; } + button[role="checkbox"] { + min-height: 24px; + min-width: 24px; + } +} + +/* Improve input targets on mobile */ +@media (max-width: 768px) { + input:not([aria-hidden="true"]), + textarea:not([aria-hidden="true"]), + select:not([aria-hidden="true"]) { + min-height: 44px; + min-width: 44px; + } } /* Loading states for PWA */ @@ -197,11 +204,8 @@ body { bottom: 0; left: 0; right: 0; - /* Ensure navigation is always visible above content */ z-index: 9999; - /* Use safe area insets for iOS notch/home indicator */ padding-bottom: env(safe-area-inset-bottom); - /* Add backdrop for better visibility */ backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); background-color: rgba(255, 255, 255, 0.95); @@ -230,28 +234,32 @@ body { overscroll-behavior: contain; } -/* Lift the floating action button above the mobile nav + home indicator on iOS */ +/* Lift the floating action button above the mobile nav + home indicator */ @supports (-webkit-touch-callout: none) { .fab-nav-offset { bottom: calc(4rem + env(safe-area-inset-bottom, 0px)) !important; } } -/* iOS page transition: subtle slide-in from the right on route change */ -@supports (-webkit-touch-callout: none) { - .page-transition-enter { - animation: iosSlideIn 280ms cubic-bezier(0.25, 0.46, 0.45, 0.94) both; +/* Page transitions via CSS View Transitions API */ +@keyframes slideInFromRight { + from { + transform: translateX(30px); + opacity: 0.8; + } + to { + transform: translateX(0); + opacity: 1; } +} - @keyframes iosSlideIn { - from { - transform: translateX(30px); - opacity: 0.8; - } - to { - transform: translateX(0); - opacity: 1; - } +@supports (view-transition-name: none) { + ::view-transition-new(root) { + animation: slideInFromRight 280ms cubic-bezier(0.25, 0.46, 0.45, 0.94) both; + } + + ::view-transition-old(root) { + animation: none; } } diff --git a/src/App.tsx b/src/App.tsx index 335ebbd..855945e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,17 +1,14 @@ import { Toaster } from "@/components/ui/toaster"; import { Toaster as Sonner } from "@/components/ui/sonner"; import { TooltipProvider } from "@/components/ui/tooltip"; -import { HashRouter, Routes, Route, Navigate, useLocation } from "react-router-dom"; +import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom"; import { AuthProvider } from "@/contexts/AuthContext"; import { OfflineProvider } from "@/contexts/OfflineContext"; import { TimeTrackingProvider } from "@/contexts/TimeTrackingContext"; import { useAuth } from "@/hooks/useAuth"; -import { Suspense, lazy, useState, useEffect } from "react"; +import { Suspense, lazy } from "react"; import { InstallPrompt } from "@/components/InstallPrompt"; import { UpdateNotification } from "@/components/UpdateNotification"; -import { useStatusBar } from "@/hooks/useStatusBar"; - -const isIosBuild = import.meta.env.VITE_IOS_BUILD === "true"; import { MobileNav } from "@/components/MobileNav"; // Lazy load pages for code splitting @@ -39,55 +36,31 @@ const ProtectedRoute = ({ children }: { children: React.ReactNode }) => { return <>{children}; }; -const AppShell = () => { - const [isDark, setIsDark] = useState( - () => window.matchMedia("(prefers-color-scheme: dark)").matches - ); - useEffect(() => { - const mq = window.matchMedia("(prefers-color-scheme: dark)"); - const handler = (e: MediaQueryListEvent) => setIsDark(e.matches); - mq.addEventListener("change", handler); - return () => mq.removeEventListener("change", handler); - }, []); - useStatusBar(isDark); - return null; -}; - -const AnimatedRoutes = () => { - const location = useLocation(); - return ( -
- - } /> - } /> - } /> - } /> - } /> - } /> - } /> - {/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */} - } /> - -
- ); -}; - const App = () => ( - - + }> - + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + {/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */} + } /> + - - {!isIosBuild && } - {!isIosBuild && } + + + diff --git a/src/components/DeleteConfirmationDialog.tsx b/src/components/DeleteConfirmationDialog.tsx index ddd4f02..865ada5 100644 --- a/src/components/DeleteConfirmationDialog.tsx +++ b/src/components/DeleteConfirmationDialog.tsx @@ -1,14 +1,4 @@ import React from "react"; -import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, -} from "@/components/ui/alert-dialog"; import { AdaptiveDialog, AdaptiveDialogContent, @@ -20,8 +10,6 @@ import { import { Button } from "@/components/ui/button"; import { useHaptics } from "@/hooks/useHaptics"; -const isIosBuild = import.meta.env.VITE_IOS_BUILD === "true"; - interface DeleteConfirmationDialogProps { isOpen: boolean; onClose: () => void; @@ -34,58 +22,32 @@ export const DeleteConfirmationDialog: React.FC< > = ({ isOpen, onClose, onConfirm, taskTitle }) => { const { heavyImpact } = useHaptics(); - if (isIosBuild) { - return ( - - - - Delete Task - - Are you sure you want to delete “{taskTitle}”? This action cannot be - undone. - - - - {/* Destructive action first on iOS (action-sheet convention) */} - - - - - - ); - } - return ( - - - - Delete Task - + + + + Delete Task + Are you sure you want to delete “{taskTitle}”? This action cannot be undone. - - - - Cancel - + + + + + + + ); }; diff --git a/src/components/IosPageHeader.tsx b/src/components/IosPageHeader.tsx deleted file mode 100644 index 22e8e47..0000000 --- a/src/components/IosPageHeader.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import type { ReactNode } from "react"; -import { useNavigate } from "react-router-dom"; -import { ChevronLeft } from "lucide-react"; -import { Button } from "@/components/ui/button"; - -interface IosPageHeaderProps { - title?: ReactNode; - actions?: ReactNode; - /** Show back chevron. Pass true to use history.back(), or a path string to navigate there. */ - back?: boolean | string; -} - -export const IosPageHeader = ({ title, actions, back }: IosPageHeaderProps) => { - const navigate = useNavigate(); - - const handleBack = () => { - if (typeof back === "string") { - navigate(back); - } else { - navigate(-1); - } - }; - - return ( -
-
- {back ? ( - - ) : ( -
- )} - - {title && ( -

- {title} -

- )} - - {actions ? ( -
- {actions} -
- ) : ( -
- )} -
-
- ); -}; diff --git a/src/components/Navigation.tsx b/src/components/Navigation.tsx index 0426502..05fd96f 100644 --- a/src/components/Navigation.tsx +++ b/src/components/Navigation.tsx @@ -18,8 +18,6 @@ import { formatDuration } from '@/utils/timeUtil'; import { SyncStatus } from '@/components/SyncStatus'; import { useAuth } from '@/hooks/useAuth'; -const isIosBuild = import.meta.env.VITE_IOS_BUILD === "true"; - const getNavLinkClasses = (isActive: boolean) => `transition-all duration-200 flex items-center space-x-2 px-4 rounded-md h-10 border border-gray-200 hover:border-input ${isActive ? "bg-accent hover:bg-accent/80 hover:text-accent-foreground" : "bg-white hover:bg-accent hover:text-accent-foreground"}`; @@ -41,7 +39,7 @@ const SiteNavigationMenu = () => { isSyncing, lastSyncTime, hasUnsavedChanges, - forceSyncToDatabase // Use manual sync instead of refresh + forceSyncToDatabase } = useTimeTracking(); const runningTime = isDayStarted ? getTotalDayDuration() : 0; @@ -72,34 +70,30 @@ const SiteNavigationMenu = () => { )}
- {!isIosBuild && ( - - - - )} - {!isIosBuild && isAuthenticated && ( + + + + {isAuthenticated && ( getNavLinkClasses(isActive)}>Report )} - {!isIosBuild && ( - - - - )} + + + { Settings - {!isIosBuild && ( - -
- setShowAuthDialog(true)} /> -
-
- )} + +
+ setShowAuthDialog(true)} /> +
+
@@ -133,12 +125,10 @@ const SiteNavigationMenu = () => { - {!isIosBuild && ( - setShowAuthDialog(false)} - /> - )} + setShowAuthDialog(false)} + /> { return (
- {isIosBuild ? ( - - ) : ( - - )} - {!isIosBuild && title !== undefined && ( + + {title !== undefined && (

@@ -44,9 +37,6 @@ export const PageLayout = ({ )}

)} - {isIosBuild && description && ( -

{description}

- )} {children}
); diff --git a/src/components/TaskItem.tsx b/src/components/TaskItem.tsx index 873f21f..37c7178 100644 --- a/src/components/TaskItem.tsx +++ b/src/components/TaskItem.tsx @@ -46,7 +46,6 @@ export const TaskItem: React.FC = ({ const longPressHandlers = useLongPress(() => { mediumImpact(); - // Simulate a right-click to open the Radix context menu programmatically if (contextMenuTriggerRef.current) { contextMenuTriggerRef.current.dispatchEvent( new MouseEvent("contextmenu", { bubbles: true, cancelable: true }) @@ -57,8 +56,6 @@ export const TaskItem: React.FC = ({ const duration = task.duration || (isActive ? currentDuration : 0); const category = categories.find((c) => c.id === task.category); - const isIosBuild = import.meta.env.VITE_IOS_BUILD === "true"; - return ( <> @@ -73,14 +70,6 @@ export const TaskItem: React.FC = ({
- {/* Should I remove this section? */} - {/* {category && ( -
- )} */}

{task.title}

@@ -130,30 +119,28 @@ export const TaskItem: React.FC = ({
- {!isIosBuild && ( -
- - -
- )} +
+ + +
diff --git a/src/components/ui/adaptive-dialog.tsx b/src/components/ui/adaptive-dialog.tsx index f76f1a9..9d5b644 100644 --- a/src/components/ui/adaptive-dialog.tsx +++ b/src/components/ui/adaptive-dialog.tsx @@ -16,13 +16,24 @@ import { DrawerFooter, } from "@/components/ui/drawer" -const isIosBuild = import.meta.env.VITE_IOS_BUILD === "true" +function useIsMobile() { + const [isMobile, setIsMobile] = React.useState( + () => typeof window !== "undefined" && window.matchMedia("(max-width: 767px)").matches + ) + React.useEffect(() => { + const mq = window.matchMedia("(max-width: 767px)") + const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches) + mq.addEventListener("change", handler) + return () => mq.removeEventListener("change", handler) + }, []) + return isMobile +} interface AdaptiveDialogProps { open: boolean onOpenChange: (open: boolean) => void children: React.ReactNode - /** vaul snap points, iOS only */ + /** vaul snap points, mobile only */ snapPoints?: (number | string)[] } @@ -32,6 +43,7 @@ export const AdaptiveDialog = ({ children, snapPoints, }: AdaptiveDialogProps) => { + const isMobile = useIsMobile() const [activeSnapPoint, setActiveSnapPoint] = React.useState( snapPoints?.[0] ?? null ) @@ -42,7 +54,7 @@ export const AdaptiveDialog = ({ } }, [open]) // snapPoints are static per dialog instance - if (isIosBuild) { + if (isMobile) { return ( { - if (isIosBuild) { + const isMobile = useIsMobile() + if (isMobile) { return ( {children} @@ -92,7 +105,8 @@ export const AdaptiveDialogHeader = ({ children: React.ReactNode className?: string }) => { - if (isIosBuild) { + const isMobile = useIsMobile() + if (isMobile) { return {children} } return {children} @@ -102,7 +116,8 @@ export const AdaptiveDialogTitle = React.forwardRef< HTMLHeadingElement, React.HTMLAttributes >(({ children, className, ...props }, ref) => { - if (isIosBuild) { + const isMobile = useIsMobile() + if (isMobile) { return ( {children} @@ -121,7 +136,8 @@ export const AdaptiveDialogDescription = React.forwardRef< HTMLParagraphElement, React.HTMLAttributes >(({ children, className, ...props }, ref) => { - if (isIosBuild) { + const isMobile = useIsMobile() + if (isMobile) { return ( {children} @@ -143,7 +159,8 @@ export const AdaptiveDialogFooter = ({ children: React.ReactNode className?: string }) => { - if (isIosBuild) { + const isMobile = useIsMobile() + if (isMobile) { return ( {children} diff --git a/src/components/ui/drawer.tsx b/src/components/ui/drawer.tsx index 8a107f2..ef0fd08 100644 --- a/src/components/ui/drawer.tsx +++ b/src/components/ui/drawer.tsx @@ -2,10 +2,6 @@ import * as React from "react" import { Drawer as DrawerPrimitive } from "vaul" import { cn } from "@/lib/util" -import { useKeyboardHeight } from "@/hooks/useKeyboardHeight" - - - const Drawer = ({ shouldScaleBackground = true, @@ -39,26 +35,22 @@ DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName const DrawerContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef ->(({ className, children, style, ...props }, ref) => { - const keyboardHeight = useKeyboardHeight(); - return ( - - - 0 ? keyboardHeight : undefined, ...style }} - {...props} - > -
- {children} - - - ); -}) +>(({ className, children, ...props }, ref) => ( + + + +
+ {children} + + +)) DrawerContent.displayName = "DrawerContent" const DrawerHeader = ({ diff --git a/src/hooks/useAppLifecycle.ts b/src/hooks/useAppLifecycle.ts index a0e85d1..9b9eee0 100644 --- a/src/hooks/useAppLifecycle.ts +++ b/src/hooks/useAppLifecycle.ts @@ -1,36 +1,14 @@ import { useEffect } from "react"; -import { Capacitor } from "@capacitor/core"; -/** - * Calls onBackground when the app is suspended (native) or hidden (web). - * On iOS/Capacitor, uses @capacitor/app's appStateChange which fires at the - * Swift layer before WKWebView freezes — more reliable than visibilitychange. - * Falls back to visibilitychange on web. - */ export function useAppLifecycle(onBackground: () => void) { useEffect(() => { - if (Capacitor.isNativePlatform()) { - // Dynamic import avoids a hard dependency when running as a PWA - // (the plugin is present but the runtime only activates on native) - import("@capacitor/app").then(({ App }) => { - const listenerPromise = App.addListener("appStateChange", ({ isActive }) => { - if (!isActive) { - onBackground(); - } - }); - return () => { - listenerPromise.then((handle) => handle.remove()); - }; - }); - } else { - const handleVisibilityChange = () => { - if (document.visibilityState === "hidden") { - onBackground(); - } - }; - document.addEventListener("visibilitychange", handleVisibilityChange); - return () => document.removeEventListener("visibilitychange", handleVisibilityChange); - } + const handleVisibilityChange = () => { + if (document.visibilityState === "hidden") { + onBackground(); + } + }; + document.addEventListener("visibilitychange", handleVisibilityChange); + return () => document.removeEventListener("visibilitychange", handleVisibilityChange); // onBackground is intentionally excluded — callers should memoize with useCallback // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/src/hooks/useHaptics.ts b/src/hooks/useHaptics.ts index d604518..8c002f4 100644 --- a/src/hooks/useHaptics.ts +++ b/src/hooks/useHaptics.ts @@ -1,51 +1,13 @@ -import { Capacitor } from "@capacitor/core"; - -let hapticsModule: typeof import("@capacitor/haptics") | null = null; - -async function getHaptics() { - if (!Capacitor.isNativePlatform()) return null; - if (!hapticsModule) { - hapticsModule = await import("@capacitor/haptics"); - } - return hapticsModule; -} - export function useHaptics() { - const lightImpact = () => { - getHaptics().then((h) => { - if (h) h.Haptics.impact({ style: h.ImpactStyle.Light }); - }); - }; - - const mediumImpact = () => { - getHaptics().then((h) => { - if (h) h.Haptics.impact({ style: h.ImpactStyle.Medium }); - }); - }; - - const heavyImpact = () => { - getHaptics().then((h) => { - if (h) h.Haptics.impact({ style: h.ImpactStyle.Heavy }); - }); - }; - - const successNotify = () => { - getHaptics().then((h) => { - if (h) h.Haptics.notification({ type: h.NotificationType.Success }); - }); - }; - - const errorNotify = () => { - getHaptics().then((h) => { - if (h) h.Haptics.notification({ type: h.NotificationType.Error }); - }); + const vibrate = (pattern: number | number[]) => { + navigator.vibrate?.(pattern); }; - - const warnNotify = () => { - getHaptics().then((h) => { - if (h) h.Haptics.notification({ type: h.NotificationType.Warning }); - }); + return { + lightImpact: () => vibrate(10), + mediumImpact: () => vibrate(20), + heavyImpact: () => vibrate(50), + successNotify: () => vibrate([10, 50, 10]), + errorNotify: () => vibrate([50, 50, 50]), + warnNotify: () => vibrate(30), }; - - return { lightImpact, mediumImpact, heavyImpact, successNotify, errorNotify, warnNotify }; } diff --git a/src/hooks/useKeyboardHeight.ts b/src/hooks/useKeyboardHeight.ts deleted file mode 100644 index 6f8e0a4..0000000 --- a/src/hooks/useKeyboardHeight.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { useState, useEffect } from "react"; -import { Capacitor } from "@capacitor/core"; - -/** - * Returns the current on-screen keyboard height in px (0 when hidden). - * Uses @capacitor/keyboard events on native; always returns 0 on web. - */ -export function useKeyboardHeight(): number { - const [height, setHeight] = useState(0); - - useEffect(() => { - if (!Capacitor.isNativePlatform()) return; - - let showHandle: { remove: () => void } | null = null; - let hideHandle: { remove: () => void } | null = null; - - import("@capacitor/keyboard").then(({ Keyboard }) => { - Keyboard.addListener("keyboardWillShow", (info) => { - setHeight(info.keyboardHeight); - }).then((handle) => { showHandle = handle; }); - - Keyboard.addListener("keyboardWillHide", () => { - setHeight(0); - }).then((handle) => { hideHandle = handle; }); - }); - - return () => { - showHandle?.remove(); - hideHandle?.remove(); - }; - }, []); - - return height; -} diff --git a/src/hooks/useStatusBar.ts b/src/hooks/useStatusBar.ts deleted file mode 100644 index a368716..0000000 --- a/src/hooks/useStatusBar.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { useEffect } from "react"; -import { Capacitor } from "@capacitor/core"; - -/** - * Syncs the iOS status bar text colour with the app's light/dark theme. - * Style.Dark = white text (for dark backgrounds). - * Style.Light = black text (for light backgrounds). - * No-op on web. - */ -export function useStatusBar(isDark: boolean) { - useEffect(() => { - if (!Capacitor.isNativePlatform()) return; - - import("@capacitor/status-bar").then(({ StatusBar, Style }) => { - StatusBar.setStyle({ style: isDark ? Style.Dark : Style.Light }); - }); - }, [isDark]); -} diff --git a/src/main.tsx b/src/main.tsx index 22a5ec3..70e44cb 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -4,10 +4,6 @@ import App from './App.tsx'; import '@radix-ui/themes/styles.css'; import './index.css'; -if (import.meta.env.VITE_IOS_BUILD === "true") { - document.body.classList.add("ios-build"); -} - createRoot(document.getElementById('root')!).render( diff --git a/vite.config.ts b/vite.config.ts index 9151fe6..0ce2eef 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,14 +1,10 @@ -import { defineConfig, loadEnv } from "vite"; +import { defineConfig } from "vite"; import react from "@vitejs/plugin-react-swc"; import path from "path"; import { VitePWA } from "vite-plugin-pwa"; // https://vitejs.dev/config/ -export default defineConfig(({ mode }) => { - const env = loadEnv(mode, process.cwd()); - const isIosBuild = env.VITE_IOS_BUILD === "true"; - - return { +export default defineConfig({ server: { host: "::", port: 8080 @@ -16,7 +12,6 @@ export default defineConfig(({ mode }) => { plugins: [ react(), VitePWA({ - disable: isIosBuild, registerType: "autoUpdate", includeAssets: [ "favicon.svg", @@ -90,7 +85,7 @@ export default defineConfig(({ mode }) => { type: "module" } }) - ].filter(Boolean), + ], resolve: { alias: { "@": path.resolve(__dirname, "./src") @@ -100,16 +95,15 @@ export default defineConfig(({ mode }) => { globals: true, environment: "jsdom", setupFiles: ["./src/test-setup.ts"], - include: ["src/**/*.test.{ts,tsx}"], // Only include test files in src directory + include: ["src/**/*.test.{ts,tsx}"], exclude: [ "**/node_modules/**", "**/dist/**", "**/cypress/**", "**/.{idea,git,cache,output,temp}/**", "**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build}.config.*", - "**/*.spec.ts" // Exclude Playwright test files (use .test.ts for Vitest) + "**/*.spec.ts" ], - passWithNoTests: true // Don't fail when no test files are found + passWithNoTests: true } - }; });