experiments in a post-browser web
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(mobile): dual simulator dev command, DRY item components, fix iOS/Android crate-type conflict

- Add dev-both.sh: launches iOS simulator + Android emulator with HMR simultaneously
- iOS uses custom build pipeline (port 5188), Android uses tauri android dev
- Fix iOS device build: use cargo rustc --crate-type staticlib to avoid cdylib linker errors
- DRY up App.tsx: extract icon consts and reusable CardFooter/TodoCheckbox/TodayToggleButton/DeleteButton components
- Fix image items using hardcoded todo/done tags instead of configurable state

+1516 -2111
+6 -1
backend/tauri-mobile/build-ios.sh
··· 91 91 # Swift FFI symbols (webview_plugin_*) are provided by Xcode at final link time 92 92 # custom-protocol is required so Tauri serves bundled assets via scheme handler; 93 93 # for dev builds the "assets" are a bootstrap HTML that redirects to the dev server 94 - cargo build --lib --target aarch64-apple-ios-sim --features custom-protocol 94 + # Use cargo rustc with --crate-type to override Cargo.toml's crate-type list. 95 + # Cargo.toml has ["staticlib", "cdylib", "rlib"] for Android compatibility, 96 + # but cdylib triggers full linking which fails on iOS because Swift FFI symbols 97 + # (webview_plugin_*) are only provided by Xcode at final link time. 98 + # iOS only needs staticlib to produce the .a file for Xcode. 99 + cargo rustc --lib --crate-type staticlib --target aarch64-apple-ios-sim --features custom-protocol 95 100 96 101 # Copy to Xcode location 97 102 mkdir -p "$DEST_DIR"
+6 -1
backend/tauri-mobile/build-release.sh
··· 68 68 # Build only the lib target - the bin target would fail to link because 69 69 # Swift FFI symbols (webview_plugin_*) are provided by Xcode at final link time 70 70 # Use custom-protocol feature for bundled assets (not dev server) 71 - cargo build --lib --release --features custom-protocol --target aarch64-apple-ios 71 + # Use cargo rustc with --crate-type to override Cargo.toml's crate-type list. 72 + # Cargo.toml has ["staticlib", "cdylib", "rlib"] for Android compatibility, 73 + # but cdylib triggers full linking which fails on iOS because Swift FFI symbols 74 + # (webview_plugin_*) are only provided by Xcode at final link time. 75 + # iOS only needs staticlib to produce the .a file for Xcode. 76 + cargo rustc --lib --crate-type staticlib --release --features custom-protocol --target aarch64-apple-ios 72 77 73 78 echo "Copying library to Xcode location..." 74 79 mkdir -p "$DEST_DIR"
+51 -12
backend/tauri-mobile/dev-android.sh
··· 1 1 #!/bin/bash 2 - # Start Android emulator dev environment with HMR 3 - # Analogous to dev-ios-sim.sh for iOS simulator 2 + # Start Android emulator dev environment with HMR. 3 + # Usage: ./dev-android.sh 4 4 # 5 - # Usage: ./dev-android.sh 5 + # Uses `tauri android dev` which handles: 6 + # - Starting Vite with TAURI_DEV_HOST for mobile HMR 7 + # - adb reverse port forwarding 8 + # - Building APK, installing, and launching on emulator 6 9 7 10 set -e 8 - 9 11 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" 10 - TAURI_DIR="$SCRIPT_DIR/src-tauri" 11 12 12 13 # Ensure ANDROID_HOME and JAVA_HOME are set 13 14 if [ -z "$ANDROID_HOME" ]; then ··· 46 47 echo "NDK_HOME=$NDK_HOME" 47 48 48 49 # Ensure local.properties exists 50 + TAURI_DIR="$SCRIPT_DIR/src-tauri" 49 51 if [ ! -f "$TAURI_DIR/gen/android/local.properties" ]; then 52 + mkdir -p "$TAURI_DIR/gen/android" 50 53 echo "sdk.dir=$ANDROID_HOME" > "$TAURI_DIR/gen/android/local.properties" 51 54 echo "Created local.properties" 52 55 fi 53 56 54 - cd "$SCRIPT_DIR" 57 + # Bump build number 58 + BUILD_FILE="$SCRIPT_DIR/BUILD_NUMBER" 59 + BUILD_NUM=$(($(cat "$BUILD_FILE") + 1)) 60 + echo "$BUILD_NUM" > "$BUILD_FILE" 61 + echo "[dev] Build number: v$BUILD_NUM" 62 + 63 + # Start emulator if no devices connected 64 + ADB="$ANDROID_HOME/platform-tools/adb" 65 + if [ -x "$ADB" ]; then 66 + DEVICES=$("$ADB" devices 2>/dev/null | grep -c 'device$' || true) 67 + if [ "$DEVICES" -eq 0 ]; then 68 + echo "[dev] No Android devices/emulators found." 69 + EMULATOR="$ANDROID_HOME/emulator/emulator" 70 + if [ -x "$EMULATOR" ]; then 71 + AVD=$("$EMULATOR" -list-avds 2>/dev/null | head -1) 72 + if [ -n "$AVD" ]; then 73 + echo "[dev] Starting emulator: $AVD" 74 + "$EMULATOR" -avd "$AVD" -no-snapshot-load & 75 + echo "[dev] Waiting for emulator to boot..." 76 + "$ADB" wait-for-device 77 + # Wait for boot to complete 78 + while [ "$("$ADB" shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')" != "1" ]; do 79 + sleep 1 80 + done 81 + echo "[dev] Emulator ready" 82 + else 83 + echo "ERROR: No AVDs found. Create one in Android Studio." 84 + exit 1 85 + fi 86 + else 87 + echo "ERROR: No emulator binary found. Connect a device or install an emulator." 88 + exit 1 89 + fi 90 + fi 91 + fi 55 92 56 - echo "Starting Android dev environment..." 57 - echo "Tauri will build frontend, compile Rust, and launch on emulator with HMR" 93 + # Let tauri android dev handle everything: 94 + # - Starts Vite with TAURI_DEV_HOST set (for mobile HMR WebSocket config) 95 + # - Sets up adb reverse port forwarding 96 + # - Builds Rust + APK without custom-protocol 97 + # - Installs and launches on device/emulator 98 + echo "[dev] Starting tauri android dev..." 58 99 echo "" 59 - 60 - # custom-protocol needed for asset serving 61 - export TAURI_ANDROID_FEATURES="custom-protocol" 62 - npx tauri android dev 100 + cd "$SCRIPT_DIR" 101 + npx tauri android dev --target aarch64
+342
backend/tauri-mobile/dev-both.sh
··· 1 + #!/bin/bash 2 + # Start BOTH iOS simulator and Android emulator with HMR. 3 + # Usage: ./dev-both.sh 4 + # 5 + # Architecture: 6 + # 1. iOS: custom build pipeline + vite HMR server on port 5188 7 + # 2. Android: `tauri android dev` (runs its own vite on port 1420, handles build/install/launch) 8 + # 3. Ctrl+C cleans up everything 9 + 10 + set -e 11 + SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" 12 + CONF="$SCRIPT_DIR/src-tauri/tauri.conf.json" 13 + TAURI_DIR="$SCRIPT_DIR/src-tauri" 14 + PORT=5188 15 + ADB="" 16 + VITE_PID="" 17 + EMULATOR_PID="" 18 + TAURI_ANDROID_PID="" 19 + IOS_OK=false 20 + ANDROID_OK=false 21 + 22 + ts() { 23 + date "+%H:%M:%S" 24 + } 25 + 26 + log() { 27 + echo "[$(ts)] $1" 28 + } 29 + 30 + # ── Environment setup ─────────────────────────────────────────────── 31 + 32 + # Kill any stale vite on our port 33 + lsof -ti tcp:$PORT | xargs kill 2>/dev/null || true 34 + 35 + # Get host IP (simulator/emulator both need this) 36 + HOST_IP=$(ipconfig getifaddr en0 || ipconfig getifaddr en1 || echo "127.0.0.1") 37 + log "Host IP: $HOST_IP" 38 + log "HMR port: $PORT" 39 + 40 + # Android env 41 + if [ -z "$ANDROID_HOME" ]; then 42 + export ANDROID_HOME="$HOME/Library/Android/sdk" 43 + fi 44 + if [ -z "$JAVA_HOME" ]; then 45 + if [ -d "/Applications/Android Studio.app/Contents/jbr/Contents/Home" ]; then 46 + export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" 47 + fi 48 + fi 49 + if [ -z "$NDK_HOME" ]; then 50 + NDK_VERSION=$(ls "$ANDROID_HOME/ndk/" 2>/dev/null | sort -V | tail -1) 51 + if [ -n "$NDK_VERSION" ]; then 52 + export NDK_HOME="$ANDROID_HOME/ndk/$NDK_VERSION" 53 + fi 54 + fi 55 + 56 + if [ -d "$ANDROID_HOME/platform-tools" ]; then 57 + ADB="$ANDROID_HOME/platform-tools/adb" 58 + fi 59 + 60 + # ── Backup and cleanup ───────────────────────────────────────────── 61 + 62 + cp "$CONF" "$CONF.bak" 63 + 64 + cleanup() { 65 + echo "" 66 + log "Cleaning up..." 67 + 68 + if [ -n "$VITE_PID" ] && kill -0 "$VITE_PID" 2>/dev/null; then 69 + log "Stopping vite server..." 70 + kill "$VITE_PID" 2>/dev/null 71 + wait "$VITE_PID" 2>/dev/null || true 72 + fi 73 + 74 + if [ -n "$TAURI_ANDROID_PID" ] && kill -0 "$TAURI_ANDROID_PID" 2>/dev/null; then 75 + log "Stopping tauri android dev..." 76 + kill "$TAURI_ANDROID_PID" 2>/dev/null 77 + wait "$TAURI_ANDROID_PID" 2>/dev/null || true 78 + fi 79 + 80 + log "Restoring tauri.conf.json..." 81 + if [ -f "$CONF.bak" ]; then 82 + mv "$CONF.bak" "$CONF" 83 + fi 84 + 85 + log "Done." 86 + } 87 + trap cleanup EXIT 88 + 89 + # ── Patch tauri.conf.json ─────────────────────────────────────────── 90 + 91 + python3 -c " 92 + import json 93 + with open('$CONF') as f: 94 + c = json.load(f) 95 + c['build']['devUrl'] = 'http://$HOST_IP:$PORT' 96 + c['build']['beforeBuildCommand'] = '' 97 + with open('$CONF', 'w') as f: 98 + json.dump(c, f, indent=2) 99 + f.write('\n') 100 + " 101 + log "Patched tauri.conf.json: devUrl=http://$HOST_IP:$PORT, beforeBuildCommand disabled" 102 + 103 + # ── Bump build number (once for both) ────────────────────────────── 104 + 105 + BUILD_FILE="$SCRIPT_DIR/BUILD_NUMBER" 106 + BUILD_NUM=$(($(cat "$BUILD_FILE") + 1)) 107 + echo "$BUILD_NUM" > "$BUILD_FILE" 108 + log "Build number: v$BUILD_NUM" 109 + 110 + # ── Boot iOS simulator ──────────────────────────────────────────── 111 + 112 + boot_ios_simulator() { 113 + # Check if any simulator is already booted 114 + if xcrun simctl list devices booted 2>/dev/null | grep -q "Booted"; then 115 + log "[ios] Simulator already booted" 116 + return 0 117 + fi 118 + 119 + # Find an available iPhone simulator 120 + SIM_UDID=$(xcrun simctl list devices available -j 2>/dev/null | python3 -c " 121 + import json, sys 122 + data = json.load(sys.stdin) 123 + for runtime, devices in data.get('devices', {}).items(): 124 + if 'iOS' not in runtime: 125 + continue 126 + for d in devices: 127 + if d.get('isAvailable') and 'iPhone' in d.get('name', ''): 128 + print(d['udid']) 129 + sys.exit(0) 130 + " 2>/dev/null || true) 131 + 132 + if [ -z "$SIM_UDID" ]; then 133 + log "[ios] ERROR: No available iPhone simulator found" 134 + return 1 135 + fi 136 + 137 + SIM_NAME=$(xcrun simctl list devices available -j 2>/dev/null | python3 -c " 138 + import json, sys 139 + data = json.load(sys.stdin) 140 + for runtime, devices in data.get('devices', {}).items(): 141 + for d in devices: 142 + if d.get('udid') == '$SIM_UDID': 143 + print(d['name']) 144 + sys.exit(0) 145 + " 2>/dev/null || true) 146 + 147 + log "[ios] Booting simulator: $SIM_NAME ($SIM_UDID)..." 148 + xcrun simctl boot "$SIM_UDID" 2>/dev/null || true 149 + open -a Simulator 150 + log "[ios] Simulator booted" 151 + } 152 + 153 + # ── Start Android emulator if needed ──────────────────────────────── 154 + 155 + start_android_emulator() { 156 + if [ -z "$ADB" ] || [ ! -x "$ADB" ]; then 157 + log "[android] ERROR: adb not found at $ADB" 158 + return 1 159 + fi 160 + 161 + DEVICES=$("$ADB" devices 2>/dev/null | grep -c 'device$' || true) 162 + if [ "$DEVICES" -eq 0 ]; then 163 + log "[android] No Android devices/emulators found, starting emulator..." 164 + EMULATOR="$ANDROID_HOME/emulator/emulator" 165 + if [ ! -x "$EMULATOR" ]; then 166 + log "[android] ERROR: emulator binary not found" 167 + return 1 168 + fi 169 + AVD=$("$EMULATOR" -list-avds 2>/dev/null | head -1) 170 + if [ -z "$AVD" ]; then 171 + log "[android] ERROR: No AVDs found. Create one in Android Studio." 172 + return 1 173 + fi 174 + log "[android] Starting emulator: $AVD" 175 + "$EMULATOR" -avd "$AVD" -no-snapshot-load & 176 + EMULATOR_PID=$! 177 + log "[android] Waiting for emulator to boot..." 178 + "$ADB" wait-for-device 179 + while [ "$("$ADB" shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')" != "1" ]; do 180 + sleep 1 181 + done 182 + log "[android] Emulator ready" 183 + else 184 + log "[android] Emulator/device already running ($DEVICES devices)" 185 + fi 186 + return 0 187 + } 188 + 189 + # Boot iOS simulator synchronously (fast if already booted) 190 + boot_ios_simulator 191 + 192 + # Start Android emulator in background (slow to boot) 193 + start_android_emulator & 194 + EMULATOR_BOOT_PID=$! 195 + 196 + # ── Build iOS ─────────────────────────────────────────────────────── 197 + 198 + build_ios() { 199 + log "[ios] Building Rust library with devUrl..." 200 + cd "$SCRIPT_DIR" 201 + DEV_PORT=$PORT ./build-ios.sh --force 202 + 203 + log "[ios] Running xcodebuild..." 204 + rm -rf /tmp/peek-xcodebuild-sim 205 + cd "$TAURI_DIR/gen/apple" 206 + xcodebuild \ 207 + -scheme peek-save_iOS \ 208 + -configuration Debug \ 209 + -sdk iphonesimulator \ 210 + -derivedDataPath /tmp/peek-xcodebuild-sim \ 211 + -destination 'generic/platform=iOS Simulator' \ 212 + clean build 2>&1 | tail -5 213 + 214 + log "[ios] Installing to simulator..." 215 + xcrun simctl install booted '/tmp/peek-xcodebuild-sim/Build/Products/Debug-iphonesimulator/Peek Save.app' 216 + IOS_OK=true 217 + log "[ios] Build complete" 218 + } 219 + 220 + # ── Build Android ─────────────────────────────────────────────────── 221 + 222 + build_android() { 223 + # Validate Android env 224 + if [ ! -d "$ANDROID_HOME" ]; then 225 + log "[android] ERROR: Android SDK not found at $ANDROID_HOME" 226 + return 1 227 + fi 228 + if [ -z "$JAVA_HOME" ] || [ ! -d "$JAVA_HOME" ]; then 229 + log "[android] ERROR: JAVA_HOME not found" 230 + return 1 231 + fi 232 + 233 + log "[android] ANDROID_HOME=$ANDROID_HOME" 234 + log "[android] JAVA_HOME=$JAVA_HOME" 235 + log "[android] NDK_HOME=$NDK_HOME" 236 + 237 + # Ensure local.properties exists 238 + if [ ! -f "$TAURI_DIR/gen/android/local.properties" ]; then 239 + mkdir -p "$TAURI_DIR/gen/android" 240 + echo "sdk.dir=$ANDROID_HOME" > "$TAURI_DIR/gen/android/local.properties" 241 + log "[android] Created local.properties" 242 + fi 243 + 244 + # Wait for emulator boot to finish 245 + wait $EMULATOR_BOOT_PID 2>/dev/null || true 246 + 247 + # Restore original tauri.conf.json — `tauri android dev` needs an unpatched 248 + # config so it starts its own vite and sets devUrl itself. 249 + # iOS build is already complete by this point, so it's safe to restore. 250 + log "[android] Restoring tauri.conf.json for tauri android dev..." 251 + cp "$CONF.bak" "$CONF" 252 + 253 + # Use `tauri android dev` which handles everything: 254 + # - Starts its own Vite server (on default port 1420) 255 + # - Sets up adb reverse port forwarding 256 + # - Builds Rust + APK 257 + # - Installs and launches on emulator 258 + # Runs in background so we can also serve iOS. 259 + log "[android] Starting tauri android dev (runs its own vite + builds + installs)..." 260 + cd "$SCRIPT_DIR" 261 + npx tauri android dev & 262 + TAURI_ANDROID_PID=$! 263 + 264 + ANDROID_OK=true 265 + log "[android] tauri android dev started (PID $TAURI_ANDROID_PID)" 266 + } 267 + 268 + # ── Run builds ────────────────────────────────────────────────────── 269 + # iOS uses our custom build pipeline; Android uses tauri android dev 270 + # which handles its own vite + build + install + launch. 271 + 272 + log "Starting builds..." 273 + 274 + # Build iOS first 275 + build_ios || log "[ios] BUILD FAILED (continuing with Android)" 276 + 277 + # Build Android second 278 + build_android || log "[android] BUILD FAILED (continuing)" 279 + 280 + if [ "$IOS_OK" = false ] && [ "$ANDROID_OK" = false ]; then 281 + log "ERROR: Both builds failed. Exiting." 282 + exit 1 283 + fi 284 + 285 + # ── Start vite HMR server ────────────────────────────────────────── 286 + 287 + log "Starting HMR dev server on 0.0.0.0:$PORT..." 288 + cd "$SCRIPT_DIR" 289 + npx vite --host 0.0.0.0 --port $PORT & 290 + VITE_PID=$! 291 + 292 + # Wait for vite to be ready 293 + log "Waiting for vite server..." 294 + for i in $(seq 1 30); do 295 + if curl -s -o /dev/null "http://localhost:$PORT/" 2>/dev/null; then 296 + log "Vite server ready" 297 + break 298 + fi 299 + if [ "$i" -eq 30 ]; then 300 + log "ERROR: Vite server did not start within 15 seconds" 301 + exit 1 302 + fi 303 + sleep 0.5 304 + done 305 + 306 + # ── Launch iOS app ────────────────────────────────────────────────── 307 + # Android launch is handled by `tauri android dev` 308 + 309 + if [ "$IOS_OK" = true ]; then 310 + log "[ios] Launching app..." 311 + xcrun simctl terminate booted com.dietrich.peek-mobile 2>/dev/null || true 312 + if xcrun simctl launch booted com.dietrich.peek-mobile; then 313 + log "[ios] App launched" 314 + else 315 + log "[ios] WARNING: Failed to launch app (is simulator booted?)" 316 + fi 317 + fi 318 + 319 + # ── Summary ───────────────────────────────────────────────────────── 320 + 321 + echo "" 322 + log "================================================" 323 + log " Both platforms running with HMR" 324 + log " iOS Vite: http://0.0.0.0:$PORT" 325 + log " Android Vite: managed by tauri android dev" 326 + log " Build: v$BUILD_NUM" 327 + if [ "$IOS_OK" = true ]; then 328 + log " iOS simulator: RUNNING" 329 + else 330 + log " iOS simulator: FAILED" 331 + fi 332 + if [ "$ANDROID_OK" = true ]; then 333 + log " Android emulator: RUNNING" 334 + else 335 + log " Android emulator: FAILED" 336 + fi 337 + log " Press Ctrl+C to stop" 338 + log "================================================" 339 + echo "" 340 + 341 + # Block on both background processes (Ctrl+C kills everything via trap) 342 + wait $VITE_PID $TAURI_ANDROID_PID 2>/dev/null
+68 -61
backend/tauri-mobile/package-lock.json
··· 8 8 "name": "peek", 9 9 "version": "0.1.0", 10 10 "dependencies": { 11 - "@tauri-apps/api": "2.9.1", 12 - "@tauri-apps/plugin-opener": "^2", 13 - "@tauri-apps/plugin-store": "^2.4.1", 11 + "@tauri-apps/api": "^2.10.1", 12 + "@tauri-apps/plugin-opener": "^2.5.3", 13 + "@tauri-apps/plugin-store": "^2.4.2", 14 14 "react": "^19.1.0", 15 - "react-dom": "^19.1.0" 15 + "react-dom": "^19.1.0", 16 + "snarkdown": "^2.0.0" 16 17 }, 17 18 "devDependencies": { 18 - "@tauri-apps/cli": "^2", 19 + "@tauri-apps/cli": "^2.10.1", 19 20 "@types/react": "^19.1.8", 20 21 "@types/react-dom": "^19.1.6", 21 22 "@vitejs/plugin-react": "^4.6.0", ··· 1113 1114 ] 1114 1115 }, 1115 1116 "node_modules/@tauri-apps/api": { 1116 - "version": "2.9.1", 1117 - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.9.1.tgz", 1118 - "integrity": "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw==", 1117 + "version": "2.10.1", 1118 + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.10.1.tgz", 1119 + "integrity": "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw==", 1119 1120 "license": "Apache-2.0 OR MIT", 1120 1121 "funding": { 1121 1122 "type": "opencollective", ··· 1123 1124 } 1124 1125 }, 1125 1126 "node_modules/@tauri-apps/cli": { 1126 - "version": "2.9.4", 1127 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.9.4.tgz", 1128 - "integrity": "sha512-pvylWC9QckrOS9ATWXIXcgu7g2hKK5xTL5ZQyZU/U0n9l88SEFGcWgLQNa8WZmd+wWIOWhkxOFcOl3i6ubDNNw==", 1127 + "version": "2.10.1", 1128 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.10.1.tgz", 1129 + "integrity": "sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g==", 1129 1130 "dev": true, 1130 1131 "license": "Apache-2.0 OR MIT", 1131 1132 "bin": { ··· 1139 1140 "url": "https://opencollective.com/tauri" 1140 1141 }, 1141 1142 "optionalDependencies": { 1142 - "@tauri-apps/cli-darwin-arm64": "2.9.4", 1143 - "@tauri-apps/cli-darwin-x64": "2.9.4", 1144 - "@tauri-apps/cli-linux-arm-gnueabihf": "2.9.4", 1145 - "@tauri-apps/cli-linux-arm64-gnu": "2.9.4", 1146 - "@tauri-apps/cli-linux-arm64-musl": "2.9.4", 1147 - "@tauri-apps/cli-linux-riscv64-gnu": "2.9.4", 1148 - "@tauri-apps/cli-linux-x64-gnu": "2.9.4", 1149 - "@tauri-apps/cli-linux-x64-musl": "2.9.4", 1150 - "@tauri-apps/cli-win32-arm64-msvc": "2.9.4", 1151 - "@tauri-apps/cli-win32-ia32-msvc": "2.9.4", 1152 - "@tauri-apps/cli-win32-x64-msvc": "2.9.4" 1143 + "@tauri-apps/cli-darwin-arm64": "2.10.1", 1144 + "@tauri-apps/cli-darwin-x64": "2.10.1", 1145 + "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.1", 1146 + "@tauri-apps/cli-linux-arm64-gnu": "2.10.1", 1147 + "@tauri-apps/cli-linux-arm64-musl": "2.10.1", 1148 + "@tauri-apps/cli-linux-riscv64-gnu": "2.10.1", 1149 + "@tauri-apps/cli-linux-x64-gnu": "2.10.1", 1150 + "@tauri-apps/cli-linux-x64-musl": "2.10.1", 1151 + "@tauri-apps/cli-win32-arm64-msvc": "2.10.1", 1152 + "@tauri-apps/cli-win32-ia32-msvc": "2.10.1", 1153 + "@tauri-apps/cli-win32-x64-msvc": "2.10.1" 1153 1154 } 1154 1155 }, 1155 1156 "node_modules/@tauri-apps/cli-darwin-arm64": { 1156 - "version": "2.9.4", 1157 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.9.4.tgz", 1158 - "integrity": "sha512-9rHkMVtbMhe0AliVbrGpzMahOBg3rwV46JYRELxR9SN6iu1dvPOaMaiC4cP6M/aD1424ziXnnMdYU06RAH8oIw==", 1157 + "version": "2.10.1", 1158 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.10.1.tgz", 1159 + "integrity": "sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ==", 1159 1160 "cpu": [ 1160 1161 "arm64" 1161 1162 ], ··· 1170 1171 } 1171 1172 }, 1172 1173 "node_modules/@tauri-apps/cli-darwin-x64": { 1173 - "version": "2.9.4", 1174 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.9.4.tgz", 1175 - "integrity": "sha512-VT9ymNuT06f5TLjCZW2hfSxbVtZDhORk7CDUDYiq5TiSYQdxkl8MVBy0CCFFcOk4QAkUmqmVUA9r3YZ/N/vPRQ==", 1174 + "version": "2.10.1", 1175 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.10.1.tgz", 1176 + "integrity": "sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw==", 1176 1177 "cpu": [ 1177 1178 "x64" 1178 1179 ], ··· 1187 1188 } 1188 1189 }, 1189 1190 "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { 1190 - "version": "2.9.4", 1191 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.9.4.tgz", 1192 - "integrity": "sha512-tTWkEPig+2z3Rk0zqZYfjUYcgD+aSm72wdrIhdYobxbQZOBw0zfn50YtWv+av7bm0SHvv75f0l7JuwgZM1HFow==", 1191 + "version": "2.10.1", 1192 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.10.1.tgz", 1193 + "integrity": "sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w==", 1193 1194 "cpu": [ 1194 1195 "arm" 1195 1196 ], ··· 1204 1205 } 1205 1206 }, 1206 1207 "node_modules/@tauri-apps/cli-linux-arm64-gnu": { 1207 - "version": "2.9.4", 1208 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.9.4.tgz", 1209 - "integrity": "sha512-ql6vJ611qoqRYHxkKPnb2vHa27U+YRKRmIpLMMBeZnfFtZ938eao7402AQCH1mO2+/8ioUhbpy9R/ZcLTXVmkg==", 1208 + "version": "2.10.1", 1209 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.10.1.tgz", 1210 + "integrity": "sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA==", 1210 1211 "cpu": [ 1211 1212 "arm64" 1212 1213 ], ··· 1221 1222 } 1222 1223 }, 1223 1224 "node_modules/@tauri-apps/cli-linux-arm64-musl": { 1224 - "version": "2.9.4", 1225 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.9.4.tgz", 1226 - "integrity": "sha512-vg7yNn7ICTi6hRrcA/6ff2UpZQP7un3xe3SEld5QM0prgridbKAiXGaCKr3BnUBx/rGXegQlD/wiLcWdiiraSw==", 1225 + "version": "2.10.1", 1226 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.10.1.tgz", 1227 + "integrity": "sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg==", 1227 1228 "cpu": [ 1228 1229 "arm64" 1229 1230 ], ··· 1238 1239 } 1239 1240 }, 1240 1241 "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { 1241 - "version": "2.9.4", 1242 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.9.4.tgz", 1243 - "integrity": "sha512-l8L+3VxNk6yv5T/Z/gv5ysngmIpsai40B9p6NQQyqYqxImqYX37pqREoEBl1YwG7szGnDibpWhidPrWKR59OJA==", 1242 + "version": "2.10.1", 1243 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.10.1.tgz", 1244 + "integrity": "sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw==", 1244 1245 "cpu": [ 1245 1246 "riscv64" 1246 1247 ], ··· 1255 1256 } 1256 1257 }, 1257 1258 "node_modules/@tauri-apps/cli-linux-x64-gnu": { 1258 - "version": "2.9.4", 1259 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.9.4.tgz", 1260 - "integrity": "sha512-PepPhCXc/xVvE3foykNho46OmCyx47E/aG676vKTVp+mqin5d+IBqDL6wDKiGNT5OTTxKEyNlCQ81Xs2BQhhqA==", 1259 + "version": "2.10.1", 1260 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.10.1.tgz", 1261 + "integrity": "sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw==", 1261 1262 "cpu": [ 1262 1263 "x64" 1263 1264 ], ··· 1272 1273 } 1273 1274 }, 1274 1275 "node_modules/@tauri-apps/cli-linux-x64-musl": { 1275 - "version": "2.9.4", 1276 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.9.4.tgz", 1277 - "integrity": "sha512-zcd1QVffh5tZs1u1SCKUV/V7RRynebgYUNWHuV0FsIF1MjnULUChEXhAhug7usCDq4GZReMJOoXa6rukEozWIw==", 1276 + "version": "2.10.1", 1277 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.10.1.tgz", 1278 + "integrity": "sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ==", 1278 1279 "cpu": [ 1279 1280 "x64" 1280 1281 ], ··· 1289 1290 } 1290 1291 }, 1291 1292 "node_modules/@tauri-apps/cli-win32-arm64-msvc": { 1292 - "version": "2.9.4", 1293 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.9.4.tgz", 1294 - "integrity": "sha512-/7ZhnP6PY04bEob23q8MH/EoDISdmR1wuNm0k9d5HV7TDMd2GGCDa8dPXA4vJuglJKXIfXqxFmZ4L+J+MO42+w==", 1293 + "version": "2.10.1", 1294 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.10.1.tgz", 1295 + "integrity": "sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg==", 1295 1296 "cpu": [ 1296 1297 "arm64" 1297 1298 ], ··· 1306 1307 } 1307 1308 }, 1308 1309 "node_modules/@tauri-apps/cli-win32-ia32-msvc": { 1309 - "version": "2.9.4", 1310 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.9.4.tgz", 1311 - "integrity": "sha512-1LmAfaC4Cq+3O1Ir1ksdhczhdtFSTIV51tbAGtbV/mr348O+M52A/xwCCXQank0OcdBxy5BctqkMtuZnQvA8uQ==", 1310 + "version": "2.10.1", 1311 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.10.1.tgz", 1312 + "integrity": "sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw==", 1312 1313 "cpu": [ 1313 1314 "ia32" 1314 1315 ], ··· 1323 1324 } 1324 1325 }, 1325 1326 "node_modules/@tauri-apps/cli-win32-x64-msvc": { 1326 - "version": "2.9.4", 1327 - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.9.4.tgz", 1328 - "integrity": "sha512-EdYd4c9wGvtPB95kqtEyY+bUR+k4kRw3IA30mAQ1jPH6z57AftT8q84qwv0RDp6kkEqOBKxeInKfqi4BESYuqg==", 1327 + "version": "2.10.1", 1328 + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.10.1.tgz", 1329 + "integrity": "sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg==", 1329 1330 "cpu": [ 1330 1331 "x64" 1331 1332 ], ··· 1340 1341 } 1341 1342 }, 1342 1343 "node_modules/@tauri-apps/plugin-opener": { 1343 - "version": "2.5.2", 1344 - "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.2.tgz", 1345 - "integrity": "sha512-ei/yRRoCklWHImwpCcDK3VhNXx+QXM9793aQ64YxpqVF0BDuuIlXhZgiAkc15wnPVav+IbkYhmDJIv5R326Mew==", 1344 + "version": "2.5.3", 1345 + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.3.tgz", 1346 + "integrity": "sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ==", 1346 1347 "license": "MIT OR Apache-2.0", 1347 1348 "dependencies": { 1348 1349 "@tauri-apps/api": "^2.8.0" 1349 1350 } 1350 1351 }, 1351 1352 "node_modules/@tauri-apps/plugin-store": { 1352 - "version": "2.4.1", 1353 - "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-store/-/plugin-store-2.4.1.tgz", 1354 - "integrity": "sha512-ckGSEzZ5Ii4Hf2D5x25Oqnm2Zf9MfDWAzR+volY0z/OOBz6aucPKEY0F649JvQ0Vupku6UJo7ugpGRDOFOunkA==", 1353 + "version": "2.4.2", 1354 + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-store/-/plugin-store-2.4.2.tgz", 1355 + "integrity": "sha512-0ClHS50Oq9HEvLPhNzTNFxbWVOqoAp3dRvtewQBeqfIQ0z5m3JRnOISIn2ZVPCrQC0MyGyhTS9DWhHjpigQE7A==", 1355 1356 "license": "MIT OR Apache-2.0", 1356 1357 "dependencies": { 1357 1358 "@tauri-apps/api": "^2.8.0" ··· 1862 1863 "bin": { 1863 1864 "semver": "bin/semver.js" 1864 1865 } 1866 + }, 1867 + "node_modules/snarkdown": { 1868 + "version": "2.0.0", 1869 + "resolved": "https://registry.npmjs.org/snarkdown/-/snarkdown-2.0.0.tgz", 1870 + "integrity": "sha512-MgL/7k/AZdXCTJiNgrO7chgDqaB9FGM/1Tvlcenenb7div6obaDATzs16JhFyHHBGodHT3B7RzRc5qk8pFhg3A==", 1871 + "license": "MIT" 1865 1872 }, 1866 1873 "node_modules/source-map-js": { 1867 1874 "version": "1.2.1",
+2 -1
backend/tauri-mobile/package.json
··· 42 42 "build:android:release:force": "./build-android-release.sh --force", 43 43 "build:android:aab": "./build-android-release.sh --aab", 44 44 "dev:android": "./dev-android.sh", 45 + "dev:both": "./dev-both.sh", 45 46 "clean:android": "cd src-tauri && rm -rf target/aarch64-linux-android target/x86_64-linux-android target/i686-linux-android target/armv7-linux-androideabi 2>/dev/null; echo 'Android build cache cleaned'" 46 47 }, 47 48 "dependencies": { ··· 53 54 "snarkdown": "^2.0.0" 54 55 }, 55 56 "devDependencies": { 56 - "@tauri-apps/cli": "^2.10.0", 57 + "@tauri-apps/cli": "^2.10.1", 57 58 "@types/react": "^19.1.8", 58 59 "@types/react-dom": "^19.1.6", 59 60 "@vitejs/plugin-react": "^4.6.0",
+6 -2
backend/tauri-mobile/peek-core/build-xcframework.sh
··· 30 30 echo "=== Building peek-core for iOS ===" 31 31 32 32 # Step 1: Build static libraries 33 + # Use cargo rustc with --crate-type to override Cargo.toml's crate-type list. 34 + # Cargo.toml has ["lib", "staticlib", "cdylib"] for Android compatibility, 35 + # but cdylib triggers full linking which can fail on iOS targets. 36 + # iOS only needs staticlib to produce the .a file for XCFramework. 33 37 echo "--- Building for simulator ($SIM_TARGET) ---" 34 - cargo build --release --target "$SIM_TARGET" 38 + cargo rustc --lib --crate-type staticlib --release --target "$SIM_TARGET" 35 39 36 40 if [[ "$SIM_ONLY" == false ]]; then 37 41 echo "--- Building for device ($DEVICE_TARGET) ---" 38 - cargo build --release --target "$DEVICE_TARGET" 42 + cargo rustc --lib --crate-type staticlib --release --target "$DEVICE_TARGET" 39 43 fi 40 44 41 45 # Step 2: Generate Swift bindings from the simulator library
+1 -1
backend/tauri-mobile/src-tauri/Cargo.toml
··· 12 12 # to make the lib name unique and wouldn't conflict with the bin name. 13 13 # This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 14 14 name = "peek_save_lib" 15 - crate-type = ["staticlib", "rlib"] 15 + crate-type = ["staticlib", "cdylib", "rlib"] 16 16 17 17 [build-dependencies] 18 18 tauri-build = { version = "2", features = [] }
backend/tauri-mobile/src-tauri/gen/android/.gradle/8.14.3/checksums/checksums.lock

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/.gradle/8.14.3/checksums/md5-checksums.bin

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/.gradle/8.14.3/checksums/sha1-checksums.bin

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/.gradle/8.14.3/executionHistory/executionHistory.lock

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/.gradle/8.14.3/fileHashes/fileHashes.bin

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/.gradle/8.14.3/fileHashes/fileHashes.lock

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/.gradle/8.14.3/fileHashes/resourceHashesCache.bin

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/.gradle/buildOutputCleanup/outputFiles.bin

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/.gradle/file-system.probe

This is a binary file and will not be displayed.

+1 -1
backend/tauri-mobile/src-tauri/gen/android/app/build/intermediates/assets/universalDebug/mergeUniversalDebugAssets/tauri.conf.json
··· 1 - {"$schema":"https://schema.tauri.app/config/2","productName":"Peek Save","version":"0.1.0","identifier":"com.dietrich.peek-mobile","app":{"windows":[{"label":"main","create":true,"url":"index.html","userAgent":"Mozilla/5.0 (iPhone; CPU iPhone OS 18_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Mobile/15E148 Safari/604.1","dragDropEnabled":true,"center":false,"width":800.0,"height":600.0,"resizable":true,"maximizable":true,"minimizable":true,"closable":true,"title":"Peek Save","fullscreen":false,"focus":true,"focusable":true,"transparent":false,"maximized":false,"visible":true,"decorations":true,"alwaysOnBottom":false,"alwaysOnTop":false,"visibleOnAllWorkspaces":false,"contentProtected":false,"skipTaskbar":false,"titleBarStyle":"Visible","hiddenTitle":false,"acceptFirstMouse":false,"shadow":true,"incognito":false,"zoomHotkeysEnabled":false,"browserExtensionsEnabled":false,"useHttpsScheme":false,"javascriptDisabled":false,"allowLinkPreview":true,"disableInputAccessoryView":true,"scrollBarStyle":"default"}],"security":{"freezePrototype":false,"dangerousDisableAssetCspModification":false,"assetProtocol":{"scope":[],"enable":false},"pattern":{"use":"brownfield"},"capabilities":[]},"macOSPrivateApi":false,"withGlobalTauri":false,"enableGTKAppId":false},"build":{"devUrl":"http://192.168.50.69:5188/","frontendDist":"../dist","beforeBuildCommand":"npm run build","removeUnusedCommands":false,"additionalWatchFolders":[]},"bundle":{"active":true,"targets":"all","createUpdaterArtifacts":false,"icon":["icons/32x32.png","icons/128x128.png","icons/128x128@2x.png","icons/icon.icns","icons/icon.ico"],"useLocalToolsDir":false,"windows":{"digestAlgorithm":null,"certificateThumbprint":null,"timestampUrl":null,"tsp":false,"webviewInstallMode":{"type":"downloadBootstrapper","silent":true},"allowDowngrades":true,"wix":null,"nsis":null,"signCommand":null},"linux":{"appimage":{"bundleMediaFramework":false,"files":{}},"deb":{"files":{}},"rpm":{"release":"1","epoch":0,"files":{}}},"macOS":{"files":{},"minimumSystemVersion":"10.13","hardenedRuntime":true,"dmg":{"windowSize":{"width":660,"height":400},"appPosition":{"x":180,"y":170},"applicationFolderPosition":{"x":480,"y":170}}},"iOS":{"developmentTeam":"TXZTDLL5LC","minimumSystemVersion":"14.0"},"android":{"minSdkVersion":24,"autoIncrementVersionCode":false}},"plugins":{}} 1 + {"$schema":"https://schema.tauri.app/config/2","productName":"Peek Save","version":"0.1.0","identifier":"com.dietrich.peek-mobile","app":{"windows":[{"label":"main","create":true,"url":"index.html","userAgent":"Mozilla/5.0 (iPhone; CPU iPhone OS 18_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Mobile/15E148 Safari/604.1","dragDropEnabled":true,"center":false,"width":800.0,"height":600.0,"resizable":true,"maximizable":true,"minimizable":true,"closable":true,"title":"Peek Save","fullscreen":false,"focus":true,"focusable":true,"transparent":false,"maximized":false,"visible":true,"decorations":true,"alwaysOnBottom":false,"alwaysOnTop":false,"visibleOnAllWorkspaces":false,"contentProtected":false,"skipTaskbar":false,"titleBarStyle":"Visible","hiddenTitle":false,"acceptFirstMouse":false,"shadow":true,"incognito":false,"zoomHotkeysEnabled":false,"browserExtensionsEnabled":false,"useHttpsScheme":false,"javascriptDisabled":false,"allowLinkPreview":true,"disableInputAccessoryView":true,"scrollBarStyle":"default"}],"security":{"freezePrototype":false,"dangerousDisableAssetCspModification":false,"assetProtocol":{"scope":[],"enable":false},"pattern":{"use":"brownfield"},"capabilities":[]},"macOSPrivateApi":false,"withGlobalTauri":false,"enableGTKAppId":false},"build":{"devUrl":"http://192.168.50.69:5188/","frontendDist":"../dist","beforeDevCommand":"npm run dev","beforeBuildCommand":"","removeUnusedCommands":false,"additionalWatchFolders":[]},"bundle":{"active":true,"targets":"all","createUpdaterArtifacts":false,"icon":["icons/32x32.png","icons/128x128.png","icons/128x128@2x.png","icons/icon.icns","icons/icon.ico"],"useLocalToolsDir":false,"windows":{"digestAlgorithm":null,"certificateThumbprint":null,"timestampUrl":null,"tsp":false,"webviewInstallMode":{"type":"downloadBootstrapper","silent":true},"allowDowngrades":true,"wix":null,"nsis":null,"signCommand":null},"linux":{"appimage":{"bundleMediaFramework":false,"files":{}},"deb":{"files":{}},"rpm":{"release":"1","epoch":0,"files":{}}},"macOS":{"files":{},"minimumSystemVersion":"10.13","hardenedRuntime":true,"dmg":{"windowSize":{"width":660,"height":400},"appPosition":{"x":180,"y":170},"applicationFolderPosition":{"x":480,"y":170}}},"iOS":{"developmentTeam":"TXZTDLL5LC","minimumSystemVersion":"14.0"},"android":{"minSdkVersion":24,"autoIncrementVersionCode":false}},"plugins":{}}
backend/tauri-mobile/src-tauri/gen/android/app/build/intermediates/dex/universalDebug/mergeProjectDexUniversalDebug/10/classes.dex

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at

This is a binary file and will not be displayed.

+1 -1
backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/counters.tab
··· 1 - 9 1 + 10 2 2 0
backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/cacheable/last-build.bin

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/app/build/kotlin/compileUniversalDebugKotlin/local-state/build-history.bin

This is a binary file and will not be displayed.

+1 -1
backend/tauri-mobile/src-tauri/gen/android/app/src/main/assets/tauri.conf.json
··· 1 - {"$schema":"https://schema.tauri.app/config/2","productName":"Peek Save","version":"0.1.0","identifier":"com.dietrich.peek-mobile","app":{"windows":[{"label":"main","create":true,"url":"index.html","userAgent":"Mozilla/5.0 (iPhone; CPU iPhone OS 18_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Mobile/15E148 Safari/604.1","dragDropEnabled":true,"center":false,"width":800.0,"height":600.0,"resizable":true,"maximizable":true,"minimizable":true,"closable":true,"title":"Peek Save","fullscreen":false,"focus":true,"focusable":true,"transparent":false,"maximized":false,"visible":true,"decorations":true,"alwaysOnBottom":false,"alwaysOnTop":false,"visibleOnAllWorkspaces":false,"contentProtected":false,"skipTaskbar":false,"titleBarStyle":"Visible","hiddenTitle":false,"acceptFirstMouse":false,"shadow":true,"incognito":false,"zoomHotkeysEnabled":false,"browserExtensionsEnabled":false,"useHttpsScheme":false,"javascriptDisabled":false,"allowLinkPreview":true,"disableInputAccessoryView":true,"scrollBarStyle":"default"}],"security":{"freezePrototype":false,"dangerousDisableAssetCspModification":false,"assetProtocol":{"scope":[],"enable":false},"pattern":{"use":"brownfield"},"capabilities":[]},"macOSPrivateApi":false,"withGlobalTauri":false,"enableGTKAppId":false},"build":{"devUrl":"http://192.168.50.69:5188/","frontendDist":"../dist","beforeBuildCommand":"npm run build","removeUnusedCommands":false,"additionalWatchFolders":[]},"bundle":{"active":true,"targets":"all","createUpdaterArtifacts":false,"icon":["icons/32x32.png","icons/128x128.png","icons/128x128@2x.png","icons/icon.icns","icons/icon.ico"],"useLocalToolsDir":false,"windows":{"digestAlgorithm":null,"certificateThumbprint":null,"timestampUrl":null,"tsp":false,"webviewInstallMode":{"type":"downloadBootstrapper","silent":true},"allowDowngrades":true,"wix":null,"nsis":null,"signCommand":null},"linux":{"appimage":{"bundleMediaFramework":false,"files":{}},"deb":{"files":{}},"rpm":{"release":"1","epoch":0,"files":{}}},"macOS":{"files":{},"minimumSystemVersion":"10.13","hardenedRuntime":true,"dmg":{"windowSize":{"width":660,"height":400},"appPosition":{"x":180,"y":170},"applicationFolderPosition":{"x":480,"y":170}}},"iOS":{"developmentTeam":"TXZTDLL5LC","minimumSystemVersion":"14.0"},"android":{"minSdkVersion":24,"autoIncrementVersionCode":false}},"plugins":{}} 1 + {"$schema":"https://schema.tauri.app/config/2","productName":"Peek Save","version":"0.1.0","identifier":"com.dietrich.peek-mobile","app":{"windows":[{"label":"main","create":true,"url":"index.html","userAgent":"Mozilla/5.0 (iPhone; CPU iPhone OS 18_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Mobile/15E148 Safari/604.1","dragDropEnabled":true,"center":false,"width":800.0,"height":600.0,"resizable":true,"maximizable":true,"minimizable":true,"closable":true,"title":"Peek Save","fullscreen":false,"focus":true,"focusable":true,"transparent":false,"maximized":false,"visible":true,"decorations":true,"alwaysOnBottom":false,"alwaysOnTop":false,"visibleOnAllWorkspaces":false,"contentProtected":false,"skipTaskbar":false,"titleBarStyle":"Visible","hiddenTitle":false,"acceptFirstMouse":false,"shadow":true,"incognito":false,"zoomHotkeysEnabled":false,"browserExtensionsEnabled":false,"useHttpsScheme":false,"javascriptDisabled":false,"allowLinkPreview":true,"disableInputAccessoryView":true,"scrollBarStyle":"default"}],"security":{"freezePrototype":false,"dangerousDisableAssetCspModification":false,"assetProtocol":{"scope":[],"enable":false},"pattern":{"use":"brownfield"},"capabilities":[]},"macOSPrivateApi":false,"withGlobalTauri":false,"enableGTKAppId":false},"build":{"devUrl":"http://192.168.50.69:5188/","frontendDist":"../dist","beforeDevCommand":"npm run dev","beforeBuildCommand":"","removeUnusedCommands":false,"additionalWatchFolders":[]},"bundle":{"active":true,"targets":"all","createUpdaterArtifacts":false,"icon":["icons/32x32.png","icons/128x128.png","icons/128x128@2x.png","icons/icon.icns","icons/icon.ico"],"useLocalToolsDir":false,"windows":{"digestAlgorithm":null,"certificateThumbprint":null,"timestampUrl":null,"tsp":false,"webviewInstallMode":{"type":"downloadBootstrapper","silent":true},"allowDowngrades":true,"wix":null,"nsis":null,"signCommand":null},"linux":{"appimage":{"bundleMediaFramework":false,"files":{}},"deb":{"files":{}},"rpm":{"release":"1","epoch":0,"files":{}}},"macOS":{"files":{},"minimumSystemVersion":"10.13","hardenedRuntime":true,"dmg":{"windowSize":{"width":660,"height":400},"appPosition":{"x":180,"y":170},"applicationFolderPosition":{"x":480,"y":170}}},"iOS":{"developmentTeam":"TXZTDLL5LC","minimumSystemVersion":"14.0"},"android":{"minSdkVersion":24,"autoIncrementVersionCode":false}},"plugins":{}}
+25
backend/tauri-mobile/src-tauri/gen/android/app/src/main/java/com/dietrich/peek_mobile/MainActivity.kt
··· 1 1 package com.dietrich.peek_mobile 2 2 3 3 import android.os.Bundle 4 + import android.webkit.WebView 4 5 import androidx.activity.enableEdgeToEdge 6 + import androidx.core.view.ViewCompat 7 + import androidx.core.view.WindowInsetsCompat 5 8 6 9 class MainActivity : TauriActivity() { 7 10 override fun onCreate(savedInstanceState: Bundle?) { 8 11 enableEdgeToEdge() 9 12 super.onCreate(savedInstanceState) 13 + } 14 + 15 + override fun onWebViewCreate(webView: WebView) { 16 + // Android WebView does not expose env(safe-area-inset-*) CSS variables, 17 + // so we bridge them from the native WindowInsets API as CSS custom properties. 18 + ViewCompat.setOnApplyWindowInsetsListener(webView) { view, insets -> 19 + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) 20 + val density = view.resources.displayMetrics.density 21 + val topDp = systemBars.top / density 22 + val bottomDp = systemBars.bottom / density 23 + val leftDp = systemBars.left / density 24 + val rightDp = systemBars.right / density 25 + val js = """ 26 + document.documentElement.style.setProperty('--android-safe-area-top', '${topDp}px'); 27 + document.documentElement.style.setProperty('--android-safe-area-bottom', '${bottomDp}px'); 28 + document.documentElement.style.setProperty('--android-safe-area-left', '${leftDp}px'); 29 + document.documentElement.style.setProperty('--android-safe-area-right', '${rightDp}px'); 30 + """.trimIndent() 31 + webView.evaluateJavascript(js, null) 32 + insets 33 + } 34 + ViewCompat.requestApplyInsets(webView) 10 35 } 11 36 }
backend/tauri-mobile/src-tauri/gen/android/buildSrc/.gradle/8.14.3/executionHistory/executionHistory.lock

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/buildSrc/.gradle/buildOutputCleanup/buildOutputCleanup.lock

This is a binary file and will not be displayed.

backend/tauri-mobile/src-tauri/gen/android/buildSrc/.gradle/file-system.probe

This is a binary file and will not be displayed.

+2 -1
backend/tauri-mobile/src-tauri/tauri.conf.json
··· 4 4 "version": "0.1.0", 5 5 "identifier": "com.dietrich.peek-mobile", 6 6 "build": { 7 - "beforeBuildCommand": "npm run build", 7 + "beforeDevCommand": "npm run dev", 8 + "beforeBuildCommand": "", 8 9 "frontendDist": "../dist", 9 10 "devUrl": "http://192.168.50.69:5188" 10 11 },
+28 -6
backend/tauri-mobile/src/App.css
··· 122 122 header { 123 123 background: #ffffff; 124 124 padding: 0.25rem 0.75rem; 125 - padding-top: calc(env(safe-area-inset-top, 0px) + 0.4rem); 125 + /* Android injects --android-safe-area-top via MainActivity; iOS uses env() */ 126 + padding-top: calc(var(--android-safe-area-top, env(safe-area-inset-top, 0px)) + 0.4rem); 126 127 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 127 128 position: sticky; 128 129 top: 0; ··· 1156 1157 -webkit-overflow-scrolling: touch; 1157 1158 overscroll-behavior-y: contain; 1158 1159 padding: 1rem; 1159 - padding-bottom: calc(env(safe-area-inset-bottom, 0px) + 1rem); 1160 + padding-bottom: calc(var(--android-safe-area-bottom, env(safe-area-inset-bottom, 0px)) + 1rem); 1160 1161 max-width: 600px; 1161 1162 width: 100%; 1162 1163 margin: 0 auto; ··· 2490 2491 flex-direction: column; 2491 2492 align-items: center; 2492 2493 padding: 0.5rem; 2493 - padding-top: env(safe-area-inset-top, 4px); 2494 + padding-top: var(--android-safe-area-top, env(safe-area-inset-top, 4px)); 2494 2495 /* Ensure safe area padding at bottom when keyboard is hidden */ 2495 - padding-bottom: max(env(safe-area-inset-bottom, 0px), 0.5rem); 2496 + padding-bottom: max(var(--android-safe-area-bottom, env(safe-area-inset-bottom, 0px)), 0.5rem); 2496 2497 /* Prevent iOS from scrolling the viewport when keyboard appears */ 2497 2498 overflow: hidden; 2498 2499 overscroll-behavior: contain; ··· 3165 3166 /* Toast notifications */ 3166 3167 .toast { 3167 3168 position: fixed; 3168 - bottom: calc(env(safe-area-inset-bottom, 0px) + 80px); 3169 + bottom: calc(var(--android-safe-area-bottom, env(safe-area-inset-bottom, 0px)) + 80px); 3169 3170 left: 50%; 3170 3171 transform: translateX(-50%); 3171 3172 padding: 0.75rem 1.25rem; ··· 3574 3575 display: flex; 3575 3576 align-items: center; 3576 3577 justify-content: center; 3577 - padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left); 3578 + padding: var(--android-safe-area-top, env(safe-area-inset-top)) env(safe-area-inset-right) var(--android-safe-area-bottom, env(safe-area-inset-bottom)) env(safe-area-inset-left); 3578 3579 } 3579 3580 3580 3581 .image-fullscreen-img { ··· 3647 3648 border-radius: 6px; 3648 3649 } 3649 3650 3651 + /* Checkbox list items in reader mode */ 3652 + .note-reader-content li.checkbox-item { 3653 + list-style: none; 3654 + margin-left: -1.5em; 3655 + } 3656 + 3657 + .note-reader-content li.checkbox-item input[type="checkbox"] { 3658 + margin-right: 0.4em; 3659 + vertical-align: middle; 3660 + pointer-events: none; 3661 + } 3662 + 3663 + .note-reader-content li.checkbox-checked { 3664 + color: var(--base04, #888); 3665 + text-decoration: line-through; 3666 + } 3667 + 3650 3668 /* Active eye icon for reader mode */ 3651 3669 .card-action-btn.reader-active { 3652 3670 color: var(--base0D, #007aff); ··· 3681 3699 3682 3700 body.dark .note-reader-content a { 3683 3701 color: #0a84ff; 3702 + } 3703 + 3704 + body.dark .note-reader-content li.checkbox-checked { 3705 + color: #777; 3684 3706 } 3685 3707 3686 3708 /* Editor reader mode toggle — eye icon is now inside undo-redo-buttons row */
+208 -255
backend/tauri-mobile/src/App.tsx
··· 5 5 import snarkdown from "snarkdown"; 6 6 import "./App.css"; 7 7 import readerCss from "./reader.css?raw"; 8 + import { autoListContinue } from "./auto-list.js"; 8 9 9 10 declare const __BUILD_NUMBER__: string; 11 + 12 + /** Pre-process markdown to protect checkbox syntax from snarkdown's link parsing */ 13 + function preProcessCheckboxes(md: string): string { 14 + return md 15 + .replace(/^(\s*[-*])\s+\[ \]/gm, '$1 CBTODO') 16 + .replace(/^(\s*[-*])\s+\[x\]/gim, '$1 CBDONE'); 17 + } 18 + 19 + /** Post-process HTML to render checkbox placeholders as actual checkboxes */ 20 + function postProcessCheckboxes(html: string): string { 21 + return html 22 + .replace(/<li>\s*CBTODO\s*/g, '<li class="checkbox-item"><input type="checkbox" disabled /> ') 23 + .replace(/<li>\s*CBDONE\s*/g, '<li class="checkbox-item checkbox-checked"><input type="checkbox" checked disabled /> '); 24 + } 10 25 11 26 type ItemType = "page" | "text" | "tagset" | "image"; 12 27 ··· 184 199 return () => viewport.removeEventListener('scroll', handleScroll); 185 200 }, []); 186 201 202 + // On Android, the Kotlin bridge injects --android-safe-area-top via evaluateJavascript, 203 + // but it may fire before the page DOM is ready (race condition). Set a sensible default 204 + // so the header isn't behind the status bar while waiting for the native bridge. 205 + // The Kotlin bridge will overwrite this with the exact value once it fires. 206 + useEffect(() => { 207 + const isAndroid = /android/i.test(navigator.userAgent); 208 + if (isAndroid) { 209 + const root = document.documentElement; 210 + // Only set default if the Kotlin bridge hasn't already provided a value 211 + if (!root.style.getPropertyValue('--android-safe-area-top')) { 212 + root.style.setProperty('--android-safe-area-top', '24px'); 213 + } 214 + } 215 + }, []); 216 + 187 217 const handleTouchStart = (e: React.TouchEvent) => { 188 218 swipeStartYRef.current = e.touches[0].clientY; 189 219 }; ··· 324 354 ) : ( 325 355 <div className="expandable-card-section"> 326 356 {availableTags.length === 0 ? ( 327 - <div className="tags-empty-message">Add some tags!</div> 357 + <div className="tags-empty-message">This is where your tags live - tag something!</div> 328 358 ) : tagInput.trim() ? ( 329 359 <div className="tags-empty-message">No matching tags</div> 330 360 ) : null} ··· 509 539 delete document.body.dataset.resizing; 510 540 }; 511 541 512 - // Auto markdown list continuation on Enter 542 + // Auto markdown list continuation on Enter (includes checkbox support) 513 543 const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => { 514 544 if (e.key !== 'Enter') return; 515 545 ··· 517 547 if (!textarea) return; 518 548 519 549 const { selectionStart, value: domValue } = textarea; 520 - const textBefore = domValue.substring(0, selectionStart); 521 - const textAfter = domValue.substring(selectionStart); 522 - 523 - // Find current line 524 - const lastNewline = textBefore.lastIndexOf('\n'); 525 - const currentLine = textBefore.substring(lastNewline + 1); 526 - 527 - // Match list marker: optional whitespace + marker (-, *, +, or number.) + space 528 - const listMatch = currentLine.match(/^(\s*)([-*+]|\d+\.)\s/); 529 - if (!listMatch) return; // Not a list line, let default Enter happen 550 + const result = autoListContinue(domValue, selectionStart); 551 + if (!result) return; // Not a list line, let default Enter happen 530 552 531 553 e.preventDefault(); 532 - 533 - const indent = listMatch[1]; 534 - const marker = listMatch[2]; 535 - const contentAfterMarker = currentLine.substring(listMatch[0].length); 536 - 537 - if (contentAfterMarker.trim() === '') { 538 - // Empty list item — remove the marker (end the list) 539 - const lineStart = lastNewline + 1; 540 - const newValue = domValue.substring(0, lineStart) + '\n' + textAfter; 541 - onChange(newValue); 542 - // Set cursor after the newline 543 - requestAnimationFrame(() => { 544 - if (textareaRef.current) { 545 - const pos = lineStart + 1; 546 - textareaRef.current.selectionStart = pos; 547 - textareaRef.current.selectionEnd = pos; 548 - } 549 - }); 550 - } else { 551 - // Continue the list 552 - let nextMarker = marker; 553 - const numMatch = marker.match(/^(\d+)\.$/); 554 - if (numMatch) { 555 - nextMarker = `${parseInt(numMatch[1], 10) + 1}.`; 554 + onChange(result.newValue); 555 + requestAnimationFrame(() => { 556 + if (textareaRef.current) { 557 + textareaRef.current.selectionStart = result.cursorPos; 558 + textareaRef.current.selectionEnd = result.cursorPos; 556 559 } 557 - const insertion = `\n${indent}${nextMarker} `; 558 - const newValue = textBefore + insertion + textAfter; 559 - onChange(newValue); 560 - requestAnimationFrame(() => { 561 - if (textareaRef.current) { 562 - const pos = selectionStart + insertion.length; 563 - textareaRef.current.selectionStart = pos; 564 - textareaRef.current.selectionEnd = pos; 565 - } 566 - }); 567 - } 560 + }); 568 561 }; 569 562 570 563 useEffect(() => { ··· 850 843 const [readmeTagInput, setReadmeTagInput] = useState("readme"); 851 844 const [readTag, setReadTag] = useState("read"); 852 845 const [readTagInput, setReadTagInput] = useState("read"); 853 - const [todayTag, setTodayTag] = useState("today"); 854 - const [todayTagInput, setTodayTagInput] = useState("today"); 855 - const [laterTag, setLaterTag] = useState("later"); 856 - const [laterTagInput, setLaterTagInput] = useState("later"); 846 + const [todayTag, _setTodayTag] = useState("today"); 847 + const [_todayTagInput, _setTodayTagInput] = useState("today"); 848 + const [laterTag, _setLaterTag] = useState("later"); 849 + const [_laterTagInput, _setLaterTagInput] = useState("later"); 857 850 const [offlineTag, setOfflineTag] = useState("offline"); 858 851 const [offlineTagInput, setOfflineTagInput] = useState("offline"); 859 852 const [offlineStorageSize, setOfflineStorageSize] = useState(0); ··· 2304 2297 </button> 2305 2298 </div> 2306 2299 <div className="note-reader-content" dangerouslySetInnerHTML={{ __html: (() => { 2307 - const rendered = editingTextContent.split(/\n\n+/).map(block => { 2300 + const preprocessed = preProcessCheckboxes(editingTextContent); 2301 + const rendered = preprocessed.split(/\n\n+/).map(block => { 2308 2302 const html = snarkdown(block.trim()); 2309 2303 return /^<(h[1-6]|ul|ol|pre|blockquote|table|hr)/i.test(html) ? html : `<p>${html}</p>`; 2310 2304 }).join(''); 2311 - return rendered || `<p>${editingTextContent}</p>`; 2305 + return postProcessCheckboxes(rendered || `<p>${editingTextContent}</p>`); 2312 2306 })() }} /> 2313 2307 </> 2314 2308 ) : ( ··· 2423 2417 return null; 2424 2418 }; 2425 2419 2420 + // ============================================================================ 2421 + // Shared Icon Constants & Item Footer Components 2422 + // ============================================================================ 2423 + 2424 + const ICON_TODAY = "!"; 2425 + const ICON_LATER = "\u{1F4A4}"; // 💤 2426 + 2427 + const ICON_TODO_CHECKED = ( 2428 + <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2429 + <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect> 2430 + <polyline points="9 11 12 14 22 4"></polyline> 2431 + </svg> 2432 + ); 2433 + 2434 + const ICON_TODO_UNCHECKED = ( 2435 + <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2436 + <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect> 2437 + </svg> 2438 + ); 2439 + 2440 + const ICON_READING_CHECKED = ( 2441 + <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2442 + <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path> 2443 + <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path> 2444 + <polyline points="9 11 12 14 22 4"></polyline> 2445 + </svg> 2446 + ); 2447 + 2448 + const ICON_READING_UNCHECKED = ( 2449 + <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2450 + <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path> 2451 + <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path> 2452 + </svg> 2453 + ); 2454 + 2455 + const ICON_DELETE = ( 2456 + <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2457 + <polyline points="3 6 5 6 21 6"></polyline> 2458 + <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path> 2459 + </svg> 2460 + ); 2461 + 2462 + /** Todo/Done checkbox button */ 2463 + const TodoCheckbox: React.FC<{ 2464 + tags: string[]; 2465 + itemId: string; 2466 + itemType: ItemType; 2467 + onClick: (e: React.MouseEvent) => void; 2468 + }> = ({ tags, onClick }) => { 2469 + if (!tags.includes(todoTag) && !tags.includes(doneTag)) return null; 2470 + const isDone = tags.includes(doneTag); 2471 + return ( 2472 + <button 2473 + className={`todo-checkbox ${isDone ? "checked" : ""}`} 2474 + onClick={onClick} 2475 + > 2476 + {isDone ? ICON_TODO_CHECKED : ICON_TODO_UNCHECKED} 2477 + </button> 2478 + ); 2479 + }; 2480 + 2481 + /** Reading (readme/read) checkbox button */ 2482 + const ReadingCheckbox: React.FC<{ 2483 + tags: string[]; 2484 + onClick: (e: React.MouseEvent) => void; 2485 + }> = ({ tags, onClick }) => { 2486 + if (!tags.includes(readmeTag) && !tags.includes(readTag)) return null; 2487 + const isRead = tags.includes(readTag); 2488 + return ( 2489 + <button 2490 + className={`todo-checkbox reading-checkbox ${isRead ? "checked" : ""}`} 2491 + onClick={onClick} 2492 + > 2493 + {isRead ? ICON_READING_CHECKED : ICON_READING_UNCHECKED} 2494 + </button> 2495 + ); 2496 + }; 2497 + 2498 + /** Today/Later toggle button */ 2499 + const TodayToggleButton: React.FC<{ 2500 + tags: string[]; 2501 + onClick: (e: React.MouseEvent) => void; 2502 + }> = ({ tags, onClick }) => { 2503 + if (!tags.includes(todayTag) && !tags.includes(laterTag)) return null; 2504 + const isToday = tags.includes(todayTag); 2505 + return ( 2506 + <button 2507 + className="todo-checkbox today-checkbox" 2508 + onClick={onClick} 2509 + title={isToday ? "Today" : "Later"} 2510 + > 2511 + {isToday ? ICON_TODAY : ICON_LATER} 2512 + </button> 2513 + ); 2514 + }; 2515 + 2516 + /** Delete button (trash icon) */ 2517 + const DeleteButton: React.FC<{ 2518 + itemId: string; 2519 + itemType: ItemType; 2520 + }> = ({ itemId, itemType }) => ( 2521 + <button 2522 + className="card-delete-btn" 2523 + onClick={(e) => { 2524 + e.stopPropagation(); 2525 + requestDelete(itemId, itemType); 2526 + }} 2527 + > 2528 + {ICON_DELETE} 2529 + </button> 2530 + ); 2531 + 2532 + /** Card footer with tag checkboxes, tags list, and date */ 2533 + const CardFooter: React.FC<{ 2534 + tags: string[]; 2535 + itemId: string; 2536 + itemType: ItemType; 2537 + savedAt: string; 2538 + showReadingCheckbox?: boolean; 2539 + }> = ({ tags, itemId, itemType, savedAt, showReadingCheckbox = false }) => ( 2540 + <div className="card-footer"> 2541 + <TodoCheckbox 2542 + tags={tags} 2543 + itemId={itemId} 2544 + itemType={itemType} 2545 + onClick={(e) => toggleTagPair(e, itemId, itemType, tags, todoTag, doneTag)} 2546 + /> 2547 + {showReadingCheckbox && ( 2548 + <ReadingCheckbox 2549 + tags={tags} 2550 + onClick={(e) => toggleTagPair(e, itemId, itemType, tags, readmeTag, readTag)} 2551 + /> 2552 + )} 2553 + <TodayToggleButton 2554 + tags={tags} 2555 + onClick={(e) => toggleTagPair(e, itemId, itemType, tags, todayTag, laterTag)} 2556 + /> 2557 + <div className="card-tags"> 2558 + {tags.map((tag) => ( 2559 + <span key={tag} className="card-tag">{tag}</span> 2560 + ))} 2561 + <span className="card-date"> 2562 + {new Date(savedAt).toLocaleDateString()} 2563 + </span> 2564 + </div> 2565 + </div> 2566 + ); 2567 + 2426 2568 // Render unified item based on type 2427 2569 const renderUnifiedItem = (item: UnifiedItem) => { 2428 2570 switch (item.type) { ··· 2563 2705 </svg> 2564 2706 </button> 2565 2707 )} 2566 - <button 2567 - className="card-delete-btn" 2568 - onClick={(e) => { 2569 - e.stopPropagation(); 2570 - requestDelete(item.id, "page"); 2571 - }} 2572 - > 2573 - <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2574 - <polyline points="3 6 5 6 21 6"></polyline> 2575 - <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path> 2576 - </svg> 2577 - </button> 2708 + <DeleteButton itemId={item.id} itemType="page" /> 2578 2709 </div> 2579 2710 </div> 2580 2711 {isExpanded && renderWebviewInline(expandedWebview.url)} 2581 - <div className="card-footer"> 2582 - {(item.tags.includes(todoTag) || item.tags.includes(doneTag)) && ( 2583 - <button 2584 - className={`todo-checkbox ${item.tags.includes(doneTag) ? "checked" : ""}`} 2585 - onClick={(e) => toggleTagPair(e, item.id, "page", item.tags, todoTag, doneTag)} 2586 - > 2587 - {item.tags.includes(doneTag) ? ( 2588 - <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2589 - <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect> 2590 - <polyline points="9 11 12 14 22 4"></polyline> 2591 - </svg> 2592 - ) : ( 2593 - <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2594 - <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect> 2595 - </svg> 2596 - )} 2597 - </button> 2598 - )} 2599 - {(item.tags.includes(readmeTag) || item.tags.includes(readTag)) && ( 2600 - <button 2601 - className={`todo-checkbox reading-checkbox ${item.tags.includes(readTag) ? "checked" : ""}`} 2602 - onClick={(e) => toggleTagPair(e, item.id, "page", item.tags, readmeTag, readTag)} 2603 - > 2604 - {item.tags.includes(readTag) ? ( 2605 - <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2606 - <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path> 2607 - <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path> 2608 - <polyline points="9 11 12 14 22 4"></polyline> 2609 - </svg> 2610 - ) : ( 2611 - <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2612 - <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path> 2613 - <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path> 2614 - </svg> 2615 - )} 2616 - </button> 2617 - )} 2618 - {(item.tags.includes(todayTag) || item.tags.includes(laterTag)) && ( 2619 - <button 2620 - className="todo-checkbox today-checkbox" 2621 - onClick={(e) => toggleTagPair(e, item.id, "page", item.tags, todayTag, laterTag)} 2622 - title={item.tags.includes(todayTag) ? "Today" : "Later"} 2623 - > 2624 - {item.tags.includes(todayTag) ? "‼" : "💤"} 2625 - </button> 2626 - )} 2627 - <div className="card-tags"> 2628 - {item.tags.map((tag) => ( 2629 - <span key={tag} className="card-tag">{tag}</span> 2630 - ))} 2631 - <span className="card-date"> 2632 - {new Date(item.saved_at).toLocaleDateString()} 2633 - </span> 2634 - </div> 2635 - </div> 2712 + <CardFooter tags={item.tags} itemId={item.id} itemType="page" savedAt={item.saved_at} showReadingCheckbox /> 2636 2713 </div> 2637 2714 ); 2638 2715 }; ··· 2706 2783 </svg> 2707 2784 </button> 2708 2785 )} 2709 - <button 2710 - className="card-delete-btn" 2711 - onClick={(e) => { 2712 - e.stopPropagation(); 2713 - requestDelete(item.id, "text"); 2714 - }} 2715 - > 2716 - <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2717 - <polyline points="3 6 5 6 21 6"></polyline> 2718 - <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path> 2719 - </svg> 2720 - </button> 2786 + <DeleteButton itemId={item.id} itemType="text" /> 2721 2787 </div> 2722 2788 </div> 2723 2789 {textReaderMode === item.id && ( 2724 2790 <div className="note-reader-content" dangerouslySetInnerHTML={{ __html: (() => { 2725 - const rendered = item.content.split(/\n\n+/).map(block => { 2791 + const preprocessed = preProcessCheckboxes(item.content); 2792 + const rendered = preprocessed.split(/\n\n+/).map(block => { 2726 2793 const html = snarkdown(block.trim()); 2727 2794 return /^<(h[1-6]|ul|ol|pre|blockquote|table|hr)/i.test(html) ? html : `<p>${html}</p>`; 2728 2795 }).join(''); 2729 - return rendered || `<p>${item.content}</p>`; 2796 + return postProcessCheckboxes(rendered || `<p>${item.content}</p>`); 2730 2797 })() }} /> 2731 2798 )} 2732 2799 {isExpanded && renderWebviewInline(expandedWebview.url)} 2733 - <div className="card-footer"> 2734 - {(tags.includes(todoTag) || tags.includes(doneTag)) && ( 2735 - <button 2736 - className={`todo-checkbox ${tags.includes(doneTag) ? "checked" : ""}`} 2737 - onClick={(e) => toggleTagPair(e, item.id, "text", tags, todoTag, doneTag)} 2738 - > 2739 - {tags.includes(doneTag) ? ( 2740 - <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2741 - <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect> 2742 - <polyline points="9 11 12 14 22 4"></polyline> 2743 - </svg> 2744 - ) : ( 2745 - <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2746 - <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect> 2747 - </svg> 2748 - )} 2749 - </button> 2750 - )} 2751 - {(tags.includes(readmeTag) || tags.includes(readTag)) && ( 2752 - <button 2753 - className={`todo-checkbox reading-checkbox ${tags.includes(readTag) ? "checked" : ""}`} 2754 - onClick={(e) => toggleTagPair(e, item.id, "text", tags, readmeTag, readTag)} 2755 - > 2756 - {tags.includes(readTag) ? ( 2757 - <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2758 - <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path> 2759 - <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path> 2760 - <polyline points="9 11 12 14 22 4"></polyline> 2761 - </svg> 2762 - ) : ( 2763 - <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2764 - <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path> 2765 - <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path> 2766 - </svg> 2767 - )} 2768 - </button> 2769 - )} 2770 - {(tags.includes(todayTag) || tags.includes(laterTag)) && ( 2771 - <button 2772 - className="todo-checkbox today-checkbox" 2773 - onClick={(e) => toggleTagPair(e, item.id, "text", tags, todayTag, laterTag)} 2774 - title={tags.includes(todayTag) ? "Today" : "Later"} 2775 - > 2776 - {tags.includes(todayTag) ? "‼" : "💤"} 2777 - </button> 2778 - )} 2779 - <div className="card-tags"> 2780 - {tags.map((tag) => ( 2781 - <span key={tag} className="card-tag">{tag}</span> 2782 - ))} 2783 - <span className="card-date"> 2784 - {new Date(item.saved_at).toLocaleDateString()} 2785 - </span> 2786 - </div> 2787 - </div> 2800 + <CardFooter tags={tags} itemId={item.id} itemType="text" savedAt={item.saved_at} showReadingCheckbox /> 2788 2801 </div> 2789 2802 ); 2790 2803 }; ··· 2804 2817 <span key={tag} className="card-tag">{tag}</span> 2805 2818 ))} 2806 2819 </div> 2807 - <button 2808 - className="card-delete-btn" 2809 - onClick={(e) => { 2810 - e.stopPropagation(); 2811 - requestDelete(item.id, "tagset"); 2812 - }} 2813 - > 2814 - <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 2815 - <polyline points="3 6 5 6 21 6"></polyline> 2816 - <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path> 2817 - </svg> 2818 - </button> 2820 + <DeleteButton itemId={item.id} itemType="tagset" /> 2819 2821 </div> 2820 2822 <div className="card-footer"> 2821 2823 <div className="card-tags"> ··· 2955 2957 } 2956 2958 }; 2957 2959 2958 - // Legacy wrapper for backward compatibility 2959 - const toggleTodoDone = (e: React.MouseEvent, id: string, type: ItemType, currentTags: string[]) => { 2960 - toggleTagPair(e, id, type, currentTags, todoTag, doneTag); 2961 - }; 2962 - 2963 2960 // Open URL in system browser (Safari) 2964 2961 const openInBrowser = async (url: string, itemId: string, e: React.MouseEvent) => { 2965 2962 e.stopPropagation(); ··· 3190 3187 )} 3191 3188 </div> 3192 3189 <div className="card-title">{title || sourceUrl || "Image"}</div> 3193 - <button 3194 - className="card-delete-btn" 3195 - onClick={(e) => { 3196 - e.stopPropagation(); 3197 - requestDelete(item.id, "image"); 3198 - }} 3199 - > 3200 - <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 3201 - <polyline points="3 6 5 6 21 6"></polyline> 3202 - <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path> 3203 - </svg> 3204 - </button> 3190 + <DeleteButton itemId={item.id} itemType="image" /> 3205 3191 </div> 3206 3192 {item.content && ( 3207 3193 <div className="card-content" style={{ padding: "0 12px 8px", fontSize: "13px", opacity: 0.8, overflow: "hidden", display: "-webkit-box", WebkitLineClamp: 3, WebkitBoxOrient: "vertical" as const }}> 3208 3194 {item.content.length > 200 ? item.content.substring(0, 200) + "..." : item.content} 3209 3195 </div> 3210 3196 )} 3211 - <div className="card-footer"> 3212 - {(item.tags.includes("todo") || item.tags.includes("done")) && ( 3213 - <button 3214 - className={`todo-checkbox ${item.tags.includes("done") ? "checked" : ""}`} 3215 - onClick={(e) => toggleTodoDone(e, item.id, "image", item.tags)} 3216 - > 3217 - {item.tags.includes("done") ? ( 3218 - <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 3219 - <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect> 3220 - <polyline points="9 11 12 14 22 4"></polyline> 3221 - </svg> 3222 - ) : ( 3223 - <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"> 3224 - <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect> 3225 - </svg> 3226 - )} 3227 - </button> 3228 - )} 3229 - {(item.tags.includes(todayTag) || item.tags.includes(laterTag)) && ( 3230 - <button 3231 - className="todo-checkbox today-checkbox" 3232 - onClick={(e) => toggleTagPair(e, item.id, "image", item.tags, todayTag, laterTag)} 3233 - title={item.tags.includes(todayTag) ? "Today" : "Later"} 3234 - > 3235 - {item.tags.includes(todayTag) ? "‼" : "💤"} 3236 - </button> 3237 - )} 3238 - <div className="card-tags"> 3239 - {item.tags.map((tag) => ( 3240 - <span key={tag} className="card-tag">{tag}</span> 3241 - ))} 3242 - <span className="card-date"> 3243 - {new Date(item.saved_at).toLocaleDateString()} 3244 - </span> 3245 - </div> 3246 - </div> 3197 + <CardFooter tags={item.tags} itemId={item.id} itemType="image" savedAt={item.saved_at} /> 3247 3198 </div> 3248 3199 ); 3249 3200 }; ··· 4012 3963 ref={filterTagsRef} 4013 3964 style={{ height: `${filterTagsHeight}px` }} 4014 3965 > 4015 - {getFilteredTags().length === 0 ? ( 3966 + {allTags.length === 0 ? ( 3967 + <div className="filter-tags-empty">This is where your tags live - tag something!</div> 3968 + ) : getFilteredTags().length === 0 ? ( 4016 3969 <div className="filter-tags-empty">No matching tags</div> 4017 3970 ) : ( 4018 3971 <div className="filter-tags">
+4
backend/tauri-mobile/src/auto-list.d.ts
··· 1 + export function autoListContinue( 2 + value: string, 3 + selectionStart: number 4 + ): { newValue: string; cursorPos: number } | null;
+48
backend/tauri-mobile/src/auto-list.js
··· 1 + // Pure auto-list continuation logic, extracted for testability. 2 + // Given the full text value and cursor position (selectionStart), 3 + // returns { newValue, cursorPos } or null if no list continuation applies. 4 + 5 + export function autoListContinue(value, selectionStart) { 6 + const textBefore = value.substring(0, selectionStart); 7 + const textAfter = value.substring(selectionStart); 8 + 9 + // Find current line 10 + const lastNewline = textBefore.lastIndexOf('\n'); 11 + const currentLine = textBefore.substring(lastNewline + 1); 12 + 13 + // Match list marker: optional whitespace + marker (-, *, +, or number.) + space + optional checkbox 14 + // Group 1: indent, Group 2: marker (-, *, +, or N.), Group 3: checkbox if present ([ ] or [x]) 15 + const listMatch = currentLine.match(/^(\s*)([-*+]|\d+\.)\s(?:(\[[ x]\])\s)?/); 16 + if (!listMatch) return null; 17 + 18 + const indent = listMatch[1]; 19 + const marker = listMatch[2]; 20 + const checkbox = listMatch[3]; // undefined, '[ ]', or '[x]' 21 + const fullPrefix = listMatch[0]; 22 + const contentAfterPrefix = currentLine.substring(fullPrefix.length); 23 + 24 + if (contentAfterPrefix.trim() === '') { 25 + // Empty list item — remove the marker (end the list) 26 + const lineStart = lastNewline + 1; 27 + const newValue = value.substring(0, lineStart) + '\n' + textAfter; 28 + return { newValue, cursorPos: lineStart + 1 }; 29 + } else { 30 + // Continue the list 31 + let nextMarker = marker; 32 + const numMatch = marker.match(/^(\d+)\.$/); 33 + if (numMatch) { 34 + nextMarker = `${parseInt(numMatch[1], 10) + 1}.`; 35 + } 36 + 37 + let insertion; 38 + if (checkbox !== undefined) { 39 + // Always continue with unchecked checkbox 40 + insertion = `\n${indent}${nextMarker} [ ] `; 41 + } else { 42 + insertion = `\n${indent}${nextMarker} `; 43 + } 44 + 45 + const newValue = textBefore + insertion + textAfter; 46 + return { newValue, cursorPos: selectionStart + insertion.length }; 47 + } 48 + }
+175
backend/tauri-mobile/tests/auto-list.test.js
··· 1 + import { describe, it } from 'node:test'; 2 + import assert from 'node:assert/strict'; 3 + import { autoListContinue } from '../src/auto-list.js'; 4 + 5 + describe('autoListContinue', () => { 6 + // Helper: simulate pressing Enter at end of the given text 7 + function atEnd(text) { 8 + return autoListContinue(text, text.length); 9 + } 10 + 11 + describe('basic list markers', () => { 12 + it('continues - list item', () => { 13 + const r = atEnd('- hello'); 14 + assert.equal(r.newValue, '- hello\n- '); 15 + assert.equal(r.cursorPos, '- hello\n- '.length); 16 + }); 17 + 18 + it('continues * list item', () => { 19 + const r = atEnd('* hello'); 20 + assert.equal(r.newValue, '* hello\n* '); 21 + assert.equal(r.cursorPos, '* hello\n* '.length); 22 + }); 23 + 24 + it('continues + list item', () => { 25 + const r = atEnd('+ hello'); 26 + assert.equal(r.newValue, '+ hello\n+ '); 27 + assert.equal(r.cursorPos, '+ hello\n+ '.length); 28 + }); 29 + 30 + it('continues numbered list and increments', () => { 31 + const r = atEnd('1. hello'); 32 + assert.equal(r.newValue, '1. hello\n2. '); 33 + assert.equal(r.cursorPos, '1. hello\n2. '.length); 34 + }); 35 + 36 + it('increments from higher numbers', () => { 37 + const r = atEnd('9. hello'); 38 + assert.equal(r.newValue, '9. hello\n10. '); 39 + assert.equal(r.cursorPos, '9. hello\n10. '.length); 40 + }); 41 + }); 42 + 43 + describe('checkbox patterns', () => { 44 + it('continues - [ ] with unchecked checkbox', () => { 45 + const r = atEnd('- [ ] todo item'); 46 + assert.equal(r.newValue, '- [ ] todo item\n- [ ] '); 47 + assert.equal(r.cursorPos, '- [ ] todo item\n- [ ] '.length); 48 + }); 49 + 50 + it('continues - [x] with unchecked checkbox', () => { 51 + const r = atEnd('- [x] done item'); 52 + assert.equal(r.newValue, '- [x] done item\n- [ ] '); 53 + assert.equal(r.cursorPos, '- [x] done item\n- [ ] '.length); 54 + }); 55 + 56 + it('continues * [ ] with unchecked checkbox', () => { 57 + const r = atEnd('* [ ] todo item'); 58 + assert.equal(r.newValue, '* [ ] todo item\n* [ ] '); 59 + assert.equal(r.cursorPos, '* [ ] todo item\n* [ ] '.length); 60 + }); 61 + 62 + it('continues * [x] with unchecked checkbox', () => { 63 + const r = atEnd('* [x] done item'); 64 + assert.equal(r.newValue, '* [x] done item\n* [ ] '); 65 + assert.equal(r.cursorPos, '* [x] done item\n* [ ] '.length); 66 + }); 67 + 68 + it('continues numbered checkbox list', () => { 69 + const r = atEnd('1. [ ] todo item'); 70 + assert.equal(r.newValue, '1. [ ] todo item\n2. [ ] '); 71 + assert.equal(r.cursorPos, '1. [ ] todo item\n2. [ ] '.length); 72 + }); 73 + 74 + it('continues numbered checked checkbox with unchecked', () => { 75 + const r = atEnd('3. [x] done item'); 76 + assert.equal(r.newValue, '3. [x] done item\n4. [ ] '); 77 + assert.equal(r.cursorPos, '3. [x] done item\n4. [ ] '.length); 78 + }); 79 + }); 80 + 81 + describe('indented variants', () => { 82 + it('preserves indent for - list', () => { 83 + const r = atEnd(' - hello'); 84 + assert.equal(r.newValue, ' - hello\n - '); 85 + }); 86 + 87 + it('preserves indent for * [ ] checkbox', () => { 88 + const r = atEnd(' * [ ] task'); 89 + assert.equal(r.newValue, ' * [ ] task\n * [ ] '); 90 + }); 91 + 92 + it('preserves indent for - [x] checkbox', () => { 93 + const r = atEnd(' - [x] done'); 94 + assert.equal(r.newValue, ' - [x] done\n - [ ] '); 95 + }); 96 + 97 + it('preserves indent for numbered list', () => { 98 + const r = atEnd(' 2. item'); 99 + assert.equal(r.newValue, ' 2. item\n 3. '); 100 + }); 101 + 102 + it('preserves indent for numbered checkbox', () => { 103 + const r = atEnd(' 1. [ ] task'); 104 + assert.equal(r.newValue, ' 1. [ ] task\n 2. [ ] '); 105 + }); 106 + }); 107 + 108 + describe('empty item removal (exit list mode)', () => { 109 + it('removes empty - prefix', () => { 110 + const r = atEnd('- first\n- '); 111 + assert.equal(r.newValue, '- first\n\n'); 112 + assert.equal(r.cursorPos, '- first\n\n'.length); 113 + }); 114 + 115 + it('removes empty * prefix', () => { 116 + const r = atEnd('* first\n* '); 117 + assert.equal(r.newValue, '* first\n\n'); 118 + }); 119 + 120 + it('removes empty numbered prefix', () => { 121 + const r = atEnd('1. first\n2. '); 122 + assert.equal(r.newValue, '1. first\n\n'); 123 + }); 124 + 125 + it('removes empty - [ ] prefix', () => { 126 + const r = atEnd('- [ ] task\n- [ ] '); 127 + assert.equal(r.newValue, '- [ ] task\n\n'); 128 + }); 129 + 130 + it('removes empty indented prefix', () => { 131 + const r = atEnd(' - item\n - '); 132 + assert.equal(r.newValue, ' - item\n\n'); 133 + }); 134 + 135 + it('removes empty indented checkbox prefix', () => { 136 + const r = atEnd(' - [ ] task\n - [ ] '); 137 + assert.equal(r.newValue, ' - [ ] task\n\n'); 138 + }); 139 + }); 140 + 141 + describe('non-list lines', () => { 142 + it('returns null for plain text', () => { 143 + assert.equal(atEnd('hello world'), null); 144 + }); 145 + 146 + it('returns null for empty string', () => { 147 + assert.equal(atEnd(''), null); 148 + }); 149 + 150 + it('returns null for line without list prefix', () => { 151 + assert.equal(atEnd('some text here'), null); 152 + }); 153 + 154 + it('returns null for marker without space after', () => { 155 + assert.equal(atEnd('-no space'), null); 156 + }); 157 + }); 158 + 159 + describe('mid-text cursor', () => { 160 + it('handles cursor in the middle of text', () => { 161 + const text = '- item one\n- item two\nsome other text'; 162 + const cursor = '- item one'.length; // end of first line 163 + const r = autoListContinue(text, cursor); 164 + assert.equal(r.newValue, '- item one\n- \n- item two\nsome other text'); 165 + assert.equal(r.cursorPos, '- item one\n- '.length); 166 + }); 167 + 168 + it('handles cursor at end of checkbox line mid-text', () => { 169 + const text = '- [ ] first task\n- [ ] second task'; 170 + const cursor = '- [ ] first task'.length; 171 + const r = autoListContinue(text, cursor); 172 + assert.equal(r.newValue, '- [ ] first task\n- [ ] \n- [ ] second task'); 173 + }); 174 + }); 175 + });
+77 -3
backend/tauri-mobile/tests/reader-mode.test.js
··· 12 12 const cssSource = readFileSync(join(__dirname, '..', 'src', 'App.css'), 'utf-8'); 13 13 const tsxSource = readFileSync(join(__dirname, '..', 'src', 'App.tsx'), 'utf-8'); 14 14 15 - // Reproduce the exact rendering logic from App.tsx (lines 2307-2311) 15 + /** Pre-process markdown to protect checkbox syntax from snarkdown's link parsing */ 16 + function preProcessCheckboxes(md) { 17 + return md 18 + .replace(/^(\s*[-*])\s+\[ \]/gm, '$1 CBTODO') 19 + .replace(/^(\s*[-*])\s+\[x\]/gim, '$1 CBDONE'); 20 + } 21 + 22 + /** Post-process HTML to render checkbox placeholders as actual checkboxes */ 23 + function postProcessCheckboxes(html) { 24 + return html 25 + .replace(/<li>\s*CBTODO\s*/g, '<li class="checkbox-item"><input type="checkbox" disabled /> ') 26 + .replace(/<li>\s*CBDONE\s*/g, '<li class="checkbox-item checkbox-checked"><input type="checkbox" checked disabled /> '); 27 + } 28 + 29 + // Reproduce the exact rendering logic from App.tsx 16 30 function renderMarkdown(content) { 17 - const rendered = content.split(/\n\n+/).map(block => { 31 + const preprocessed = preProcessCheckboxes(content); 32 + const rendered = preprocessed.split(/\n\n+/).map(block => { 18 33 const html = snarkdown(block.trim()); 19 34 return /^<(h[1-6]|ul|ol|pre|blockquote|table|hr)/i.test(html) ? html : `<p>${html}</p>`; 20 35 }).join(''); 21 - return rendered || `<p>${content}</p>`; 36 + return postProcessCheckboxes(rendered || `<p>${content}</p>`); 22 37 } 23 38 24 39 describe('snarkdown basic functionality', () => { ··· 96 111 const result = renderMarkdown(content); 97 112 assert.ok(result.length > 0, 'Should produce non-empty output'); 98 113 assert.ok(result.includes('My note'), 'Should contain note text'); 114 + }); 115 + }); 116 + 117 + describe('checkbox list items in reader mode', () => { 118 + it('renders unchecked checkbox for - [ ] syntax', () => { 119 + const result = renderMarkdown('- [ ] todo item'); 120 + assert.ok(result.includes('<input type="checkbox" disabled />'), `Expected disabled checkbox in: ${result}`); 121 + assert.ok(result.includes('class="checkbox-item"'), `Expected checkbox-item class in: ${result}`); 122 + assert.ok(result.includes('todo item'), `Expected text in: ${result}`); 123 + assert.ok(!result.includes('checked'), `Should not be checked in: ${result}`); 124 + }); 125 + 126 + it('renders checked checkbox for - [x] syntax', () => { 127 + const result = renderMarkdown('- [x] done item'); 128 + assert.ok(result.includes('<input type="checkbox" checked disabled />'), `Expected checked checkbox in: ${result}`); 129 + assert.ok(result.includes('checkbox-checked'), `Expected checkbox-checked class in: ${result}`); 130 + assert.ok(result.includes('done item'), `Expected text in: ${result}`); 131 + }); 132 + 133 + it('renders checked checkbox for - [X] syntax (uppercase)', () => { 134 + const result = renderMarkdown('- [X] done item'); 135 + assert.ok(result.includes('checked'), `Expected checked for uppercase X in: ${result}`); 136 + }); 137 + 138 + it('renders mixed checkboxes in a list', () => { 139 + const result = renderMarkdown('- [ ] first\n- [x] second\n- [ ] third'); 140 + const uncheckedCount = (result.match(/checkbox-item/g) || []).length; 141 + const checkedCount = (result.match(/checkbox-checked/g) || []).length; 142 + assert.equal(uncheckedCount, 3, `Expected 3 checkbox-item classes (got ${uncheckedCount}) in: ${result}`); 143 + assert.equal(checkedCount, 1, `Expected 1 checkbox-checked (got ${checkedCount}) in: ${result}`); 144 + }); 145 + 146 + it('does not affect regular list items', () => { 147 + const result = renderMarkdown('- regular item\n- another item'); 148 + assert.ok(!result.includes('checkbox-item'), `Regular items should not get checkbox class: ${result}`); 149 + assert.ok(!result.includes('type="checkbox"'), `Regular items should not get checkbox input: ${result}`); 150 + }); 151 + }); 152 + 153 + describe('CSS: checkbox styles', () => { 154 + it('has styles for checkbox-item class', () => { 155 + assert.ok( 156 + cssSource.includes('.note-reader-content li.checkbox-item'), 157 + 'CSS must include styles for checkbox list items' 158 + ); 159 + }); 160 + 161 + it('has styles for checkbox-checked class', () => { 162 + assert.ok( 163 + cssSource.includes('.note-reader-content li.checkbox-checked'), 164 + 'CSS must include styles for checked checkbox items' 165 + ); 166 + }); 167 + 168 + it('has dark mode styles for checked checkboxes', () => { 169 + assert.ok( 170 + cssSource.includes('body.dark .note-reader-content li.checkbox-checked'), 171 + 'CSS must include dark mode styles for checked checkboxes' 172 + ); 99 173 }); 100 174 }); 101 175
+463 -1764
backend/tauri-mobile/yarn.lock
··· 1 - # This file is generated by running "yarn install" inside your project. 2 - # Manual changes might be lost - proceed with caution! 1 + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 + # yarn lockfile v1 3 3 4 - __metadata: 5 - version: 8 6 - cacheKey: 10c0 7 4 8 - "@babel/code-frame@npm:^7.27.1": 9 - version: 7.27.1 10 - resolution: "@babel/code-frame@npm:7.27.1" 5 + "@babel/code-frame@^7.27.1": 6 + version "7.27.1" 7 + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" 8 + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== 11 9 dependencies: 12 - "@babel/helper-validator-identifier": "npm:^7.27.1" 13 - js-tokens: "npm:^4.0.0" 14 - picocolors: "npm:^1.1.1" 15 - checksum: 10c0/5dd9a18baa5fce4741ba729acc3a3272c49c25cb8736c4b18e113099520e7ef7b545a4096a26d600e4416157e63e87d66db46aa3fbf0a5f2286da2705c12da00 16 - languageName: node 17 - linkType: hard 10 + "@babel/helper-validator-identifier" "^7.27.1" 11 + js-tokens "^4.0.0" 12 + picocolors "^1.1.1" 18 13 19 - "@babel/compat-data@npm:^7.27.2": 20 - version: 7.28.5 21 - resolution: "@babel/compat-data@npm:7.28.5" 22 - checksum: 10c0/702a25de73087b0eba325c1d10979eed7c9b6662677386ba7b5aa6eace0fc0676f78343bae080a0176ae26f58bd5535d73b9d0fbb547fef377692e8b249353a7 23 - languageName: node 24 - linkType: hard 14 + "@babel/compat-data@^7.27.2": 15 + version "7.28.5" 16 + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz" 17 + integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== 25 18 26 - "@babel/core@npm:^7.28.0": 27 - version: 7.28.5 28 - resolution: "@babel/core@npm:7.28.5" 19 + "@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.28.0": 20 + version "7.28.5" 21 + resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz" 22 + integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== 29 23 dependencies: 30 - "@babel/code-frame": "npm:^7.27.1" 31 - "@babel/generator": "npm:^7.28.5" 32 - "@babel/helper-compilation-targets": "npm:^7.27.2" 33 - "@babel/helper-module-transforms": "npm:^7.28.3" 34 - "@babel/helpers": "npm:^7.28.4" 35 - "@babel/parser": "npm:^7.28.5" 36 - "@babel/template": "npm:^7.27.2" 37 - "@babel/traverse": "npm:^7.28.5" 38 - "@babel/types": "npm:^7.28.5" 39 - "@jridgewell/remapping": "npm:^2.3.5" 40 - convert-source-map: "npm:^2.0.0" 41 - debug: "npm:^4.1.0" 42 - gensync: "npm:^1.0.0-beta.2" 43 - json5: "npm:^2.2.3" 44 - semver: "npm:^6.3.1" 45 - checksum: 10c0/535f82238027621da6bdffbdbe896ebad3558b311d6f8abc680637a9859b96edbf929ab010757055381570b29cf66c4a295b5618318d27a4273c0e2033925e72 46 - languageName: node 47 - linkType: hard 24 + "@babel/code-frame" "^7.27.1" 25 + "@babel/generator" "^7.28.5" 26 + "@babel/helper-compilation-targets" "^7.27.2" 27 + "@babel/helper-module-transforms" "^7.28.3" 28 + "@babel/helpers" "^7.28.4" 29 + "@babel/parser" "^7.28.5" 30 + "@babel/template" "^7.27.2" 31 + "@babel/traverse" "^7.28.5" 32 + "@babel/types" "^7.28.5" 33 + "@jridgewell/remapping" "^2.3.5" 34 + convert-source-map "^2.0.0" 35 + debug "^4.1.0" 36 + gensync "^1.0.0-beta.2" 37 + json5 "^2.2.3" 38 + semver "^6.3.1" 48 39 49 - "@babel/generator@npm:^7.28.5": 50 - version: 7.28.5 51 - resolution: "@babel/generator@npm:7.28.5" 40 + "@babel/generator@^7.28.5": 41 + version "7.28.5" 42 + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz" 43 + integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== 52 44 dependencies: 53 - "@babel/parser": "npm:^7.28.5" 54 - "@babel/types": "npm:^7.28.5" 55 - "@jridgewell/gen-mapping": "npm:^0.3.12" 56 - "@jridgewell/trace-mapping": "npm:^0.3.28" 57 - jsesc: "npm:^3.0.2" 58 - checksum: 10c0/9f219fe1d5431b6919f1a5c60db8d5d34fe546c0d8f5a8511b32f847569234ffc8032beb9e7404649a143f54e15224ecb53a3d11b6bb85c3203e573d91fca752 59 - languageName: node 60 - linkType: hard 45 + "@babel/parser" "^7.28.5" 46 + "@babel/types" "^7.28.5" 47 + "@jridgewell/gen-mapping" "^0.3.12" 48 + "@jridgewell/trace-mapping" "^0.3.28" 49 + jsesc "^3.0.2" 61 50 62 - "@babel/helper-compilation-targets@npm:^7.27.2": 63 - version: 7.27.2 64 - resolution: "@babel/helper-compilation-targets@npm:7.27.2" 51 + "@babel/helper-compilation-targets@^7.27.2": 52 + version "7.27.2" 53 + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" 54 + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== 65 55 dependencies: 66 - "@babel/compat-data": "npm:^7.27.2" 67 - "@babel/helper-validator-option": "npm:^7.27.1" 68 - browserslist: "npm:^4.24.0" 69 - lru-cache: "npm:^5.1.1" 70 - semver: "npm:^6.3.1" 71 - checksum: 10c0/f338fa00dcfea931804a7c55d1a1c81b6f0a09787e528ec580d5c21b3ecb3913f6cb0f361368973ce953b824d910d3ac3e8a8ee15192710d3563826447193ad1 72 - languageName: node 73 - linkType: hard 56 + "@babel/compat-data" "^7.27.2" 57 + "@babel/helper-validator-option" "^7.27.1" 58 + browserslist "^4.24.0" 59 + lru-cache "^5.1.1" 60 + semver "^6.3.1" 74 61 75 - "@babel/helper-globals@npm:^7.28.0": 76 - version: 7.28.0 77 - resolution: "@babel/helper-globals@npm:7.28.0" 78 - checksum: 10c0/5a0cd0c0e8c764b5f27f2095e4243e8af6fa145daea2b41b53c0c1414fe6ff139e3640f4e2207ae2b3d2153a1abd346f901c26c290ee7cb3881dd922d4ee9232 79 - languageName: node 80 - linkType: hard 62 + "@babel/helper-globals@^7.28.0": 63 + version "7.28.0" 64 + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" 65 + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== 81 66 82 - "@babel/helper-module-imports@npm:^7.27.1": 83 - version: 7.27.1 84 - resolution: "@babel/helper-module-imports@npm:7.27.1" 67 + "@babel/helper-module-imports@^7.27.1": 68 + version "7.27.1" 69 + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" 70 + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== 85 71 dependencies: 86 - "@babel/traverse": "npm:^7.27.1" 87 - "@babel/types": "npm:^7.27.1" 88 - checksum: 10c0/e00aace096e4e29290ff8648455c2bc4ed982f0d61dbf2db1b5e750b9b98f318bf5788d75a4f974c151bd318fd549e81dbcab595f46b14b81c12eda3023f51e8 89 - languageName: node 90 - linkType: hard 72 + "@babel/traverse" "^7.27.1" 73 + "@babel/types" "^7.27.1" 91 74 92 - "@babel/helper-module-transforms@npm:^7.28.3": 93 - version: 7.28.3 94 - resolution: "@babel/helper-module-transforms@npm:7.28.3" 75 + "@babel/helper-module-transforms@^7.28.3": 76 + version "7.28.3" 77 + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz" 78 + integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== 95 79 dependencies: 96 - "@babel/helper-module-imports": "npm:^7.27.1" 97 - "@babel/helper-validator-identifier": "npm:^7.27.1" 98 - "@babel/traverse": "npm:^7.28.3" 99 - peerDependencies: 100 - "@babel/core": ^7.0.0 101 - checksum: 10c0/549be62515a6d50cd4cfefcab1b005c47f89bd9135a22d602ee6a5e3a01f27571868ada10b75b033569f24dc4a2bb8d04bfa05ee75c16da7ade2d0db1437fcdb 102 - languageName: node 103 - linkType: hard 80 + "@babel/helper-module-imports" "^7.27.1" 81 + "@babel/helper-validator-identifier" "^7.27.1" 82 + "@babel/traverse" "^7.28.3" 104 83 105 - "@babel/helper-plugin-utils@npm:^7.27.1": 106 - version: 7.27.1 107 - resolution: "@babel/helper-plugin-utils@npm:7.27.1" 108 - checksum: 10c0/94cf22c81a0c11a09b197b41ab488d416ff62254ce13c57e62912c85700dc2e99e555225787a4099ff6bae7a1812d622c80fbaeda824b79baa10a6c5ac4cf69b 109 - languageName: node 110 - linkType: hard 84 + "@babel/helper-plugin-utils@^7.27.1": 85 + version "7.27.1" 86 + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" 87 + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== 111 88 112 - "@babel/helper-string-parser@npm:^7.27.1": 113 - version: 7.27.1 114 - resolution: "@babel/helper-string-parser@npm:7.27.1" 115 - checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 116 - languageName: node 117 - linkType: hard 89 + "@babel/helper-string-parser@^7.27.1": 90 + version "7.27.1" 91 + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" 92 + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== 118 93 119 - "@babel/helper-validator-identifier@npm:^7.27.1, @babel/helper-validator-identifier@npm:^7.28.5": 120 - version: 7.28.5 121 - resolution: "@babel/helper-validator-identifier@npm:7.28.5" 122 - checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 123 - languageName: node 124 - linkType: hard 94 + "@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": 95 + version "7.28.5" 96 + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz" 97 + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== 125 98 126 - "@babel/helper-validator-option@npm:^7.27.1": 127 - version: 7.27.1 128 - resolution: "@babel/helper-validator-option@npm:7.27.1" 129 - checksum: 10c0/6fec5f006eba40001a20f26b1ef5dbbda377b7b68c8ad518c05baa9af3f396e780bdfded24c4eef95d14bb7b8fd56192a6ed38d5d439b97d10efc5f1a191d148 130 - languageName: node 131 - linkType: hard 99 + "@babel/helper-validator-option@^7.27.1": 100 + version "7.27.1" 101 + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" 102 + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== 132 103 133 - "@babel/helpers@npm:^7.28.4": 134 - version: 7.28.4 135 - resolution: "@babel/helpers@npm:7.28.4" 104 + "@babel/helpers@^7.28.4": 105 + version "7.28.4" 106 + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz" 107 + integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== 136 108 dependencies: 137 - "@babel/template": "npm:^7.27.2" 138 - "@babel/types": "npm:^7.28.4" 139 - checksum: 10c0/aaa5fb8098926dfed5f223adf2c5e4c7fbba4b911b73dfec2d7d3083f8ba694d201a206db673da2d9b3ae8c01793e795767654558c450c8c14b4c2175b4fcb44 140 - languageName: node 141 - linkType: hard 109 + "@babel/template" "^7.27.2" 110 + "@babel/types" "^7.28.4" 142 111 143 - "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.5": 144 - version: 7.28.5 145 - resolution: "@babel/parser@npm:7.28.5" 112 + "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": 113 + version "7.28.5" 114 + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz" 115 + integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== 146 116 dependencies: 147 - "@babel/types": "npm:^7.28.5" 148 - bin: 149 - parser: ./bin/babel-parser.js 150 - checksum: 10c0/5bbe48bf2c79594ac02b490a41ffde7ef5aa22a9a88ad6bcc78432a6ba8a9d638d531d868bd1f104633f1f6bba9905746e15185b8276a3756c42b765d131b1ef 151 - languageName: node 152 - linkType: hard 117 + "@babel/types" "^7.28.5" 153 118 154 - "@babel/plugin-transform-react-jsx-self@npm:^7.27.1": 155 - version: 7.27.1 156 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" 119 + "@babel/plugin-transform-react-jsx-self@^7.27.1": 120 + version "7.27.1" 121 + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz" 122 + integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== 157 123 dependencies: 158 - "@babel/helper-plugin-utils": "npm:^7.27.1" 159 - peerDependencies: 160 - "@babel/core": ^7.0.0-0 161 - checksum: 10c0/00a4f917b70a608f9aca2fb39aabe04a60aa33165a7e0105fd44b3a8531630eb85bf5572e9f242f51e6ad2fa38c2e7e780902176c863556c58b5ba6f6e164031 162 - languageName: node 163 - linkType: hard 124 + "@babel/helper-plugin-utils" "^7.27.1" 164 125 165 - "@babel/plugin-transform-react-jsx-source@npm:^7.27.1": 166 - version: 7.27.1 167 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.27.1" 126 + "@babel/plugin-transform-react-jsx-source@^7.27.1": 127 + version "7.27.1" 128 + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz" 129 + integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== 168 130 dependencies: 169 - "@babel/helper-plugin-utils": "npm:^7.27.1" 170 - peerDependencies: 171 - "@babel/core": ^7.0.0-0 172 - checksum: 10c0/5e67b56c39c4d03e59e03ba80692b24c5a921472079b63af711b1d250fc37c1733a17069b63537f750f3e937ec44a42b1ee6a46cd23b1a0df5163b17f741f7f2 173 - languageName: node 174 - linkType: hard 131 + "@babel/helper-plugin-utils" "^7.27.1" 175 132 176 - "@babel/template@npm:^7.27.2": 177 - version: 7.27.2 178 - resolution: "@babel/template@npm:7.27.2" 133 + "@babel/template@^7.27.2": 134 + version "7.27.2" 135 + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" 136 + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== 179 137 dependencies: 180 - "@babel/code-frame": "npm:^7.27.1" 181 - "@babel/parser": "npm:^7.27.2" 182 - "@babel/types": "npm:^7.27.1" 183 - checksum: 10c0/ed9e9022651e463cc5f2cc21942f0e74544f1754d231add6348ff1b472985a3b3502041c0be62dc99ed2d12cfae0c51394bf827452b98a2f8769c03b87aadc81 184 - languageName: node 185 - linkType: hard 138 + "@babel/code-frame" "^7.27.1" 139 + "@babel/parser" "^7.27.2" 140 + "@babel/types" "^7.27.1" 186 141 187 - "@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.3, @babel/traverse@npm:^7.28.5": 188 - version: 7.28.5 189 - resolution: "@babel/traverse@npm:7.28.5" 142 + "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5": 143 + version "7.28.5" 144 + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz" 145 + integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== 190 146 dependencies: 191 - "@babel/code-frame": "npm:^7.27.1" 192 - "@babel/generator": "npm:^7.28.5" 193 - "@babel/helper-globals": "npm:^7.28.0" 194 - "@babel/parser": "npm:^7.28.5" 195 - "@babel/template": "npm:^7.27.2" 196 - "@babel/types": "npm:^7.28.5" 197 - debug: "npm:^4.3.1" 198 - checksum: 10c0/f6c4a595993ae2b73f2d4cd9c062f2e232174d293edd4abe1d715bd6281da8d99e47c65857e8d0917d9384c65972f4acdebc6749a7c40a8fcc38b3c7fb3e706f 199 - languageName: node 200 - linkType: hard 201 - 202 - "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.4, @babel/types@npm:^7.28.5": 203 - version: 7.28.5 204 - resolution: "@babel/types@npm:7.28.5" 205 - dependencies: 206 - "@babel/helper-string-parser": "npm:^7.27.1" 207 - "@babel/helper-validator-identifier": "npm:^7.28.5" 208 - checksum: 10c0/a5a483d2100befbf125793640dec26b90b95fd233a94c19573325898a5ce1e52cdfa96e495c7dcc31b5eca5b66ce3e6d4a0f5a4a62daec271455959f208ab08a 209 - languageName: node 210 - linkType: hard 211 - 212 - "@esbuild/aix-ppc64@npm:0.25.12": 213 - version: 0.25.12 214 - resolution: "@esbuild/aix-ppc64@npm:0.25.12" 215 - conditions: os=aix & cpu=ppc64 216 - languageName: node 217 - linkType: hard 218 - 219 - "@esbuild/android-arm64@npm:0.25.12": 220 - version: 0.25.12 221 - resolution: "@esbuild/android-arm64@npm:0.25.12" 222 - conditions: os=android & cpu=arm64 223 - languageName: node 224 - linkType: hard 225 - 226 - "@esbuild/android-arm@npm:0.25.12": 227 - version: 0.25.12 228 - resolution: "@esbuild/android-arm@npm:0.25.12" 229 - conditions: os=android & cpu=arm 230 - languageName: node 231 - linkType: hard 232 - 233 - "@esbuild/android-x64@npm:0.25.12": 234 - version: 0.25.12 235 - resolution: "@esbuild/android-x64@npm:0.25.12" 236 - conditions: os=android & cpu=x64 237 - languageName: node 238 - linkType: hard 239 - 240 - "@esbuild/darwin-arm64@npm:0.25.12": 241 - version: 0.25.12 242 - resolution: "@esbuild/darwin-arm64@npm:0.25.12" 243 - conditions: os=darwin & cpu=arm64 244 - languageName: node 245 - linkType: hard 246 - 247 - "@esbuild/darwin-x64@npm:0.25.12": 248 - version: 0.25.12 249 - resolution: "@esbuild/darwin-x64@npm:0.25.12" 250 - conditions: os=darwin & cpu=x64 251 - languageName: node 252 - linkType: hard 253 - 254 - "@esbuild/freebsd-arm64@npm:0.25.12": 255 - version: 0.25.12 256 - resolution: "@esbuild/freebsd-arm64@npm:0.25.12" 257 - conditions: os=freebsd & cpu=arm64 258 - languageName: node 259 - linkType: hard 260 - 261 - "@esbuild/freebsd-x64@npm:0.25.12": 262 - version: 0.25.12 263 - resolution: "@esbuild/freebsd-x64@npm:0.25.12" 264 - conditions: os=freebsd & cpu=x64 265 - languageName: node 266 - linkType: hard 267 - 268 - "@esbuild/linux-arm64@npm:0.25.12": 269 - version: 0.25.12 270 - resolution: "@esbuild/linux-arm64@npm:0.25.12" 271 - conditions: os=linux & cpu=arm64 272 - languageName: node 273 - linkType: hard 274 - 275 - "@esbuild/linux-arm@npm:0.25.12": 276 - version: 0.25.12 277 - resolution: "@esbuild/linux-arm@npm:0.25.12" 278 - conditions: os=linux & cpu=arm 279 - languageName: node 280 - linkType: hard 281 - 282 - "@esbuild/linux-ia32@npm:0.25.12": 283 - version: 0.25.12 284 - resolution: "@esbuild/linux-ia32@npm:0.25.12" 285 - conditions: os=linux & cpu=ia32 286 - languageName: node 287 - linkType: hard 288 - 289 - "@esbuild/linux-loong64@npm:0.25.12": 290 - version: 0.25.12 291 - resolution: "@esbuild/linux-loong64@npm:0.25.12" 292 - conditions: os=linux & cpu=loong64 293 - languageName: node 294 - linkType: hard 295 - 296 - "@esbuild/linux-mips64el@npm:0.25.12": 297 - version: 0.25.12 298 - resolution: "@esbuild/linux-mips64el@npm:0.25.12" 299 - conditions: os=linux & cpu=mips64el 300 - languageName: node 301 - linkType: hard 302 - 303 - "@esbuild/linux-ppc64@npm:0.25.12": 304 - version: 0.25.12 305 - resolution: "@esbuild/linux-ppc64@npm:0.25.12" 306 - conditions: os=linux & cpu=ppc64 307 - languageName: node 308 - linkType: hard 309 - 310 - "@esbuild/linux-riscv64@npm:0.25.12": 311 - version: 0.25.12 312 - resolution: "@esbuild/linux-riscv64@npm:0.25.12" 313 - conditions: os=linux & cpu=riscv64 314 - languageName: node 315 - linkType: hard 316 - 317 - "@esbuild/linux-s390x@npm:0.25.12": 318 - version: 0.25.12 319 - resolution: "@esbuild/linux-s390x@npm:0.25.12" 320 - conditions: os=linux & cpu=s390x 321 - languageName: node 322 - linkType: hard 323 - 324 - "@esbuild/linux-x64@npm:0.25.12": 325 - version: 0.25.12 326 - resolution: "@esbuild/linux-x64@npm:0.25.12" 327 - conditions: os=linux & cpu=x64 328 - languageName: node 329 - linkType: hard 330 - 331 - "@esbuild/netbsd-arm64@npm:0.25.12": 332 - version: 0.25.12 333 - resolution: "@esbuild/netbsd-arm64@npm:0.25.12" 334 - conditions: os=netbsd & cpu=arm64 335 - languageName: node 336 - linkType: hard 337 - 338 - "@esbuild/netbsd-x64@npm:0.25.12": 339 - version: 0.25.12 340 - resolution: "@esbuild/netbsd-x64@npm:0.25.12" 341 - conditions: os=netbsd & cpu=x64 342 - languageName: node 343 - linkType: hard 344 - 345 - "@esbuild/openbsd-arm64@npm:0.25.12": 346 - version: 0.25.12 347 - resolution: "@esbuild/openbsd-arm64@npm:0.25.12" 348 - conditions: os=openbsd & cpu=arm64 349 - languageName: node 350 - linkType: hard 351 - 352 - "@esbuild/openbsd-x64@npm:0.25.12": 353 - version: 0.25.12 354 - resolution: "@esbuild/openbsd-x64@npm:0.25.12" 355 - conditions: os=openbsd & cpu=x64 356 - languageName: node 357 - linkType: hard 358 - 359 - "@esbuild/openharmony-arm64@npm:0.25.12": 360 - version: 0.25.12 361 - resolution: "@esbuild/openharmony-arm64@npm:0.25.12" 362 - conditions: os=openharmony & cpu=arm64 363 - languageName: node 364 - linkType: hard 365 - 366 - "@esbuild/sunos-x64@npm:0.25.12": 367 - version: 0.25.12 368 - resolution: "@esbuild/sunos-x64@npm:0.25.12" 369 - conditions: os=sunos & cpu=x64 370 - languageName: node 371 - linkType: hard 147 + "@babel/code-frame" "^7.27.1" 148 + "@babel/generator" "^7.28.5" 149 + "@babel/helper-globals" "^7.28.0" 150 + "@babel/parser" "^7.28.5" 151 + "@babel/template" "^7.27.2" 152 + "@babel/types" "^7.28.5" 153 + debug "^4.3.1" 372 154 373 - "@esbuild/win32-arm64@npm:0.25.12": 374 - version: 0.25.12 375 - resolution: "@esbuild/win32-arm64@npm:0.25.12" 376 - conditions: os=win32 & cpu=arm64 377 - languageName: node 378 - linkType: hard 379 - 380 - "@esbuild/win32-ia32@npm:0.25.12": 381 - version: 0.25.12 382 - resolution: "@esbuild/win32-ia32@npm:0.25.12" 383 - conditions: os=win32 & cpu=ia32 384 - languageName: node 385 - linkType: hard 386 - 387 - "@esbuild/win32-x64@npm:0.25.12": 388 - version: 0.25.12 389 - resolution: "@esbuild/win32-x64@npm:0.25.12" 390 - conditions: os=win32 & cpu=x64 391 - languageName: node 392 - linkType: hard 393 - 394 - "@isaacs/balanced-match@npm:^4.0.1": 395 - version: 4.0.1 396 - resolution: "@isaacs/balanced-match@npm:4.0.1" 397 - checksum: 10c0/7da011805b259ec5c955f01cee903da72ad97c5e6f01ca96197267d3f33103d5b2f8a1af192140f3aa64526c593c8d098ae366c2b11f7f17645d12387c2fd420 398 - languageName: node 399 - linkType: hard 400 - 401 - "@isaacs/brace-expansion@npm:^5.0.1": 402 - version: 5.0.1 403 - resolution: "@isaacs/brace-expansion@npm:5.0.1" 155 + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5": 156 + version "7.28.5" 157 + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz" 158 + integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== 404 159 dependencies: 405 - "@isaacs/balanced-match": "npm:^4.0.1" 406 - checksum: 10c0/e5d67c7bbf1f17b88132a35bc638af306d48acbb72810d48fa6e6edd8ab375854773108e8bf70f021f7ef6a8273455a6d1f0c3b5aa2aff06ce7894049ab77fb8 407 - languageName: node 408 - linkType: hard 160 + "@babel/helper-string-parser" "^7.27.1" 161 + "@babel/helper-validator-identifier" "^7.28.5" 409 162 410 - "@isaacs/fs-minipass@npm:^4.0.0": 411 - version: 4.0.1 412 - resolution: "@isaacs/fs-minipass@npm:4.0.1" 413 - dependencies: 414 - minipass: "npm:^7.0.4" 415 - checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 416 - languageName: node 417 - linkType: hard 163 + "@esbuild/darwin-arm64@0.25.12": 164 + version "0.25.12" 165 + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz" 166 + integrity sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg== 418 167 419 - "@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": 420 - version: 0.3.13 421 - resolution: "@jridgewell/gen-mapping@npm:0.3.13" 168 + "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": 169 + version "0.3.13" 170 + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" 171 + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== 422 172 dependencies: 423 - "@jridgewell/sourcemap-codec": "npm:^1.5.0" 424 - "@jridgewell/trace-mapping": "npm:^0.3.24" 425 - checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b 426 - languageName: node 427 - linkType: hard 173 + "@jridgewell/sourcemap-codec" "^1.5.0" 174 + "@jridgewell/trace-mapping" "^0.3.24" 428 175 429 - "@jridgewell/remapping@npm:^2.3.5": 430 - version: 2.3.5 431 - resolution: "@jridgewell/remapping@npm:2.3.5" 176 + "@jridgewell/remapping@^2.3.5": 177 + version "2.3.5" 178 + resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" 179 + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== 432 180 dependencies: 433 - "@jridgewell/gen-mapping": "npm:^0.3.5" 434 - "@jridgewell/trace-mapping": "npm:^0.3.24" 435 - checksum: 10c0/3de494219ffeb2c5c38711d0d7bb128097edf91893090a2dbc8ee0b55d092bb7347b1fd0f478486c5eab010e855c73927b1666f2107516d472d24a73017d1194 436 - languageName: node 437 - linkType: hard 438 - 439 - "@jridgewell/resolve-uri@npm:^3.1.0": 440 - version: 3.1.2 441 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" 442 - checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e 443 - languageName: node 444 - linkType: hard 445 - 446 - "@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": 447 - version: 1.5.5 448 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" 449 - checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 450 - languageName: node 451 - linkType: hard 181 + "@jridgewell/gen-mapping" "^0.3.5" 182 + "@jridgewell/trace-mapping" "^0.3.24" 452 183 453 - "@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28": 454 - version: 0.3.31 455 - resolution: "@jridgewell/trace-mapping@npm:0.3.31" 456 - dependencies: 457 - "@jridgewell/resolve-uri": "npm:^3.1.0" 458 - "@jridgewell/sourcemap-codec": "npm:^1.4.14" 459 - checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 460 - languageName: node 461 - linkType: hard 184 + "@jridgewell/resolve-uri@^3.1.0": 185 + version "3.1.2" 186 + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" 187 + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 462 188 463 - "@npmcli/agent@npm:^4.0.0": 464 - version: 4.0.0 465 - resolution: "@npmcli/agent@npm:4.0.0" 466 - dependencies: 467 - agent-base: "npm:^7.1.0" 468 - http-proxy-agent: "npm:^7.0.0" 469 - https-proxy-agent: "npm:^7.0.1" 470 - lru-cache: "npm:^11.2.1" 471 - socks-proxy-agent: "npm:^8.0.3" 472 - checksum: 10c0/f7b5ce0f3dd42c3f8c6546e8433573d8049f67ef11ec22aa4704bc41483122f68bf97752e06302c455ead667af5cb753e6a09bff06632bc465c1cfd4c4b75a53 473 - languageName: node 474 - linkType: hard 189 + "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": 190 + version "1.5.5" 191 + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" 192 + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== 475 193 476 - "@npmcli/fs@npm:^5.0.0": 477 - version: 5.0.0 478 - resolution: "@npmcli/fs@npm:5.0.0" 194 + "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": 195 + version "0.3.31" 196 + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" 197 + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== 479 198 dependencies: 480 - semver: "npm:^7.3.5" 481 - checksum: 10c0/26e376d780f60ff16e874a0ac9bc3399186846baae0b6e1352286385ac134d900cc5dafaded77f38d77f86898fc923ae1cee9d7399f0275b1aa24878915d722b 482 - languageName: node 483 - linkType: hard 484 - 485 - "@rolldown/pluginutils@npm:1.0.0-beta.27": 486 - version: 1.0.0-beta.27 487 - resolution: "@rolldown/pluginutils@npm:1.0.0-beta.27" 488 - checksum: 10c0/9658f235b345201d4f6bfb1f32da9754ca164f892d1cb68154fe5f53c1df42bd675ecd409836dff46884a7847d6c00bdc38af870f7c81e05bba5c2645eb4ab9c 489 - languageName: node 490 - linkType: hard 491 - 492 - "@rollup/rollup-android-arm-eabi@npm:4.53.2": 493 - version: 4.53.2 494 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.53.2" 495 - conditions: os=android & cpu=arm 496 - languageName: node 497 - linkType: hard 498 - 499 - "@rollup/rollup-android-arm64@npm:4.53.2": 500 - version: 4.53.2 501 - resolution: "@rollup/rollup-android-arm64@npm:4.53.2" 502 - conditions: os=android & cpu=arm64 503 - languageName: node 504 - linkType: hard 505 - 506 - "@rollup/rollup-darwin-arm64@npm:4.53.2": 507 - version: 4.53.2 508 - resolution: "@rollup/rollup-darwin-arm64@npm:4.53.2" 509 - conditions: os=darwin & cpu=arm64 510 - languageName: node 511 - linkType: hard 199 + "@jridgewell/resolve-uri" "^3.1.0" 200 + "@jridgewell/sourcemap-codec" "^1.4.14" 512 201 513 - "@rollup/rollup-darwin-x64@npm:4.53.2": 514 - version: 4.53.2 515 - resolution: "@rollup/rollup-darwin-x64@npm:4.53.2" 516 - conditions: os=darwin & cpu=x64 517 - languageName: node 518 - linkType: hard 202 + "@rolldown/pluginutils@1.0.0-beta.27": 203 + version "1.0.0-beta.27" 204 + resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz" 205 + integrity sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA== 519 206 520 - "@rollup/rollup-freebsd-arm64@npm:4.53.2": 521 - version: 4.53.2 522 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.53.2" 523 - conditions: os=freebsd & cpu=arm64 524 - languageName: node 525 - linkType: hard 207 + "@rollup/rollup-darwin-arm64@4.53.2": 208 + version "4.53.2" 209 + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.2.tgz" 210 + integrity sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ== 526 211 527 - "@rollup/rollup-freebsd-x64@npm:4.53.2": 528 - version: 4.53.2 529 - resolution: "@rollup/rollup-freebsd-x64@npm:4.53.2" 530 - conditions: os=freebsd & cpu=x64 531 - languageName: node 532 - linkType: hard 212 + "@tauri-apps/api@^2.10.1", "@tauri-apps/api@^2.8.0": 213 + version "2.10.1" 214 + resolved "https://registry.npmjs.org/@tauri-apps/api/-/api-2.10.1.tgz" 215 + integrity sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw== 533 216 534 - "@rollup/rollup-linux-arm-gnueabihf@npm:4.53.2": 535 - version: 4.53.2 536 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.53.2" 537 - conditions: os=linux & cpu=arm & libc=glibc 538 - languageName: node 539 - linkType: hard 217 + "@tauri-apps/cli-darwin-arm64@2.10.1": 218 + version "2.10.1" 219 + resolved "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.10.1.tgz" 220 + integrity sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ== 540 221 541 - "@rollup/rollup-linux-arm-musleabihf@npm:4.53.2": 542 - version: 4.53.2 543 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.53.2" 544 - conditions: os=linux & cpu=arm & libc=musl 545 - languageName: node 546 - linkType: hard 222 + "@tauri-apps/cli@^2.10.1": 223 + version "2.10.1" 224 + resolved "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.10.1.tgz" 225 + integrity sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g== 226 + optionalDependencies: 227 + "@tauri-apps/cli-darwin-arm64" "2.10.1" 228 + "@tauri-apps/cli-darwin-x64" "2.10.1" 229 + "@tauri-apps/cli-linux-arm-gnueabihf" "2.10.1" 230 + "@tauri-apps/cli-linux-arm64-gnu" "2.10.1" 231 + "@tauri-apps/cli-linux-arm64-musl" "2.10.1" 232 + "@tauri-apps/cli-linux-riscv64-gnu" "2.10.1" 233 + "@tauri-apps/cli-linux-x64-gnu" "2.10.1" 234 + "@tauri-apps/cli-linux-x64-musl" "2.10.1" 235 + "@tauri-apps/cli-win32-arm64-msvc" "2.10.1" 236 + "@tauri-apps/cli-win32-ia32-msvc" "2.10.1" 237 + "@tauri-apps/cli-win32-x64-msvc" "2.10.1" 547 238 548 - "@rollup/rollup-linux-arm64-gnu@npm:4.53.2": 549 - version: 4.53.2 550 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.53.2" 551 - conditions: os=linux & cpu=arm64 & libc=glibc 552 - languageName: node 553 - linkType: hard 554 - 555 - "@rollup/rollup-linux-arm64-musl@npm:4.53.2": 556 - version: 4.53.2 557 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.53.2" 558 - conditions: os=linux & cpu=arm64 & libc=musl 559 - languageName: node 560 - linkType: hard 561 - 562 - "@rollup/rollup-linux-loong64-gnu@npm:4.53.2": 563 - version: 4.53.2 564 - resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.53.2" 565 - conditions: os=linux & cpu=loong64 & libc=glibc 566 - languageName: node 567 - linkType: hard 568 - 569 - "@rollup/rollup-linux-ppc64-gnu@npm:4.53.2": 570 - version: 4.53.2 571 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.53.2" 572 - conditions: os=linux & cpu=ppc64 & libc=glibc 573 - languageName: node 574 - linkType: hard 575 - 576 - "@rollup/rollup-linux-riscv64-gnu@npm:4.53.2": 577 - version: 4.53.2 578 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.53.2" 579 - conditions: os=linux & cpu=riscv64 & libc=glibc 580 - languageName: node 581 - linkType: hard 582 - 583 - "@rollup/rollup-linux-riscv64-musl@npm:4.53.2": 584 - version: 4.53.2 585 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.53.2" 586 - conditions: os=linux & cpu=riscv64 & libc=musl 587 - languageName: node 588 - linkType: hard 589 - 590 - "@rollup/rollup-linux-s390x-gnu@npm:4.53.2": 591 - version: 4.53.2 592 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.53.2" 593 - conditions: os=linux & cpu=s390x & libc=glibc 594 - languageName: node 595 - linkType: hard 596 - 597 - "@rollup/rollup-linux-x64-gnu@npm:4.53.2": 598 - version: 4.53.2 599 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.53.2" 600 - conditions: os=linux & cpu=x64 & libc=glibc 601 - languageName: node 602 - linkType: hard 603 - 604 - "@rollup/rollup-linux-x64-musl@npm:4.53.2": 605 - version: 4.53.2 606 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.53.2" 607 - conditions: os=linux & cpu=x64 & libc=musl 608 - languageName: node 609 - linkType: hard 610 - 611 - "@rollup/rollup-openharmony-arm64@npm:4.53.2": 612 - version: 4.53.2 613 - resolution: "@rollup/rollup-openharmony-arm64@npm:4.53.2" 614 - conditions: os=openharmony & cpu=arm64 615 - languageName: node 616 - linkType: hard 617 - 618 - "@rollup/rollup-win32-arm64-msvc@npm:4.53.2": 619 - version: 4.53.2 620 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.53.2" 621 - conditions: os=win32 & cpu=arm64 622 - languageName: node 623 - linkType: hard 624 - 625 - "@rollup/rollup-win32-ia32-msvc@npm:4.53.2": 626 - version: 4.53.2 627 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.53.2" 628 - conditions: os=win32 & cpu=ia32 629 - languageName: node 630 - linkType: hard 631 - 632 - "@rollup/rollup-win32-x64-gnu@npm:4.53.2": 633 - version: 4.53.2 634 - resolution: "@rollup/rollup-win32-x64-gnu@npm:4.53.2" 635 - conditions: os=win32 & cpu=x64 636 - languageName: node 637 - linkType: hard 638 - 639 - "@rollup/rollup-win32-x64-msvc@npm:4.53.2": 640 - version: 4.53.2 641 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.53.2" 642 - conditions: os=win32 & cpu=x64 643 - languageName: node 644 - linkType: hard 645 - 646 - "@tauri-apps/api@npm:^2.10.1": 647 - version: 2.10.1 648 - resolution: "@tauri-apps/api@npm:2.10.1" 649 - checksum: 10c0/f3c0b2ba67a0b887440a7faa1e0589e847760ee30ec29b964f22573a46b817cb3af2199d6f5f7dfdda54d65b465ebaaa280454c610a5c53d808a0911fa15e45d 650 - languageName: node 651 - linkType: hard 652 - 653 - "@tauri-apps/api@npm:^2.8.0": 654 - version: 2.9.1 655 - resolution: "@tauri-apps/api@npm:2.9.1" 656 - checksum: 10c0/18c76ec58b579860bfde5cd5b5ea6c3b13019d356c17d436bf395cafdf15dd1f277364cacd24cc94e5d4aa3816f39698f231773d2a18625e98702295ab0c2c8f 657 - languageName: node 658 - linkType: hard 659 - 660 - "@tauri-apps/cli-darwin-arm64@npm:2.10.0": 661 - version: 2.10.0 662 - resolution: "@tauri-apps/cli-darwin-arm64@npm:2.10.0" 663 - conditions: os=darwin & cpu=arm64 664 - languageName: node 665 - linkType: hard 666 - 667 - "@tauri-apps/cli-darwin-x64@npm:2.10.0": 668 - version: 2.10.0 669 - resolution: "@tauri-apps/cli-darwin-x64@npm:2.10.0" 670 - conditions: os=darwin & cpu=x64 671 - languageName: node 672 - linkType: hard 673 - 674 - "@tauri-apps/cli-linux-arm-gnueabihf@npm:2.10.0": 675 - version: 2.10.0 676 - resolution: "@tauri-apps/cli-linux-arm-gnueabihf@npm:2.10.0" 677 - conditions: os=linux & cpu=arm 678 - languageName: node 679 - linkType: hard 680 - 681 - "@tauri-apps/cli-linux-arm64-gnu@npm:2.10.0": 682 - version: 2.10.0 683 - resolution: "@tauri-apps/cli-linux-arm64-gnu@npm:2.10.0" 684 - conditions: os=linux & cpu=arm64 & libc=glibc 685 - languageName: node 686 - linkType: hard 687 - 688 - "@tauri-apps/cli-linux-arm64-musl@npm:2.10.0": 689 - version: 2.10.0 690 - resolution: "@tauri-apps/cli-linux-arm64-musl@npm:2.10.0" 691 - conditions: os=linux & cpu=arm64 & libc=musl 692 - languageName: node 693 - linkType: hard 694 - 695 - "@tauri-apps/cli-linux-riscv64-gnu@npm:2.10.0": 696 - version: 2.10.0 697 - resolution: "@tauri-apps/cli-linux-riscv64-gnu@npm:2.10.0" 698 - conditions: os=linux & cpu=riscv64 & libc=glibc 699 - languageName: node 700 - linkType: hard 701 - 702 - "@tauri-apps/cli-linux-x64-gnu@npm:2.10.0": 703 - version: 2.10.0 704 - resolution: "@tauri-apps/cli-linux-x64-gnu@npm:2.10.0" 705 - conditions: os=linux & cpu=x64 & libc=glibc 706 - languageName: node 707 - linkType: hard 708 - 709 - "@tauri-apps/cli-linux-x64-musl@npm:2.10.0": 710 - version: 2.10.0 711 - resolution: "@tauri-apps/cli-linux-x64-musl@npm:2.10.0" 712 - conditions: os=linux & cpu=x64 & libc=musl 713 - languageName: node 714 - linkType: hard 715 - 716 - "@tauri-apps/cli-win32-arm64-msvc@npm:2.10.0": 717 - version: 2.10.0 718 - resolution: "@tauri-apps/cli-win32-arm64-msvc@npm:2.10.0" 719 - conditions: os=win32 & cpu=arm64 720 - languageName: node 721 - linkType: hard 722 - 723 - "@tauri-apps/cli-win32-ia32-msvc@npm:2.10.0": 724 - version: 2.10.0 725 - resolution: "@tauri-apps/cli-win32-ia32-msvc@npm:2.10.0" 726 - conditions: os=win32 & cpu=ia32 727 - languageName: node 728 - linkType: hard 729 - 730 - "@tauri-apps/cli-win32-x64-msvc@npm:2.10.0": 731 - version: 2.10.0 732 - resolution: "@tauri-apps/cli-win32-x64-msvc@npm:2.10.0" 733 - conditions: os=win32 & cpu=x64 734 - languageName: node 735 - linkType: hard 736 - 737 - "@tauri-apps/cli@npm:^2.10.0": 738 - version: 2.10.0 739 - resolution: "@tauri-apps/cli@npm:2.10.0" 239 + "@tauri-apps/plugin-opener@^2.5.3": 240 + version "2.5.3" 241 + resolved "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.3.tgz" 242 + integrity sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ== 740 243 dependencies: 741 - "@tauri-apps/cli-darwin-arm64": "npm:2.10.0" 742 - "@tauri-apps/cli-darwin-x64": "npm:2.10.0" 743 - "@tauri-apps/cli-linux-arm-gnueabihf": "npm:2.10.0" 744 - "@tauri-apps/cli-linux-arm64-gnu": "npm:2.10.0" 745 - "@tauri-apps/cli-linux-arm64-musl": "npm:2.10.0" 746 - "@tauri-apps/cli-linux-riscv64-gnu": "npm:2.10.0" 747 - "@tauri-apps/cli-linux-x64-gnu": "npm:2.10.0" 748 - "@tauri-apps/cli-linux-x64-musl": "npm:2.10.0" 749 - "@tauri-apps/cli-win32-arm64-msvc": "npm:2.10.0" 750 - "@tauri-apps/cli-win32-ia32-msvc": "npm:2.10.0" 751 - "@tauri-apps/cli-win32-x64-msvc": "npm:2.10.0" 752 - dependenciesMeta: 753 - "@tauri-apps/cli-darwin-arm64": 754 - optional: true 755 - "@tauri-apps/cli-darwin-x64": 756 - optional: true 757 - "@tauri-apps/cli-linux-arm-gnueabihf": 758 - optional: true 759 - "@tauri-apps/cli-linux-arm64-gnu": 760 - optional: true 761 - "@tauri-apps/cli-linux-arm64-musl": 762 - optional: true 763 - "@tauri-apps/cli-linux-riscv64-gnu": 764 - optional: true 765 - "@tauri-apps/cli-linux-x64-gnu": 766 - optional: true 767 - "@tauri-apps/cli-linux-x64-musl": 768 - optional: true 769 - "@tauri-apps/cli-win32-arm64-msvc": 770 - optional: true 771 - "@tauri-apps/cli-win32-ia32-msvc": 772 - optional: true 773 - "@tauri-apps/cli-win32-x64-msvc": 774 - optional: true 775 - bin: 776 - tauri: tauri.js 777 - checksum: 10c0/23b41ee1fe635a8b60f2a3011d50f3ca10aa8f86f885e9345acce899b0062833c139a26e0c41667a515888363de9ea5bfd29aea0721eeb61a75b45a125296f55 778 - languageName: node 779 - linkType: hard 244 + "@tauri-apps/api" "^2.8.0" 780 245 781 - "@tauri-apps/plugin-opener@npm:^2.5.3": 782 - version: 2.5.3 783 - resolution: "@tauri-apps/plugin-opener@npm:2.5.3" 246 + "@tauri-apps/plugin-store@^2.4.2": 247 + version "2.4.2" 248 + resolved "https://registry.npmjs.org/@tauri-apps/plugin-store/-/plugin-store-2.4.2.tgz" 249 + integrity sha512-0ClHS50Oq9HEvLPhNzTNFxbWVOqoAp3dRvtewQBeqfIQ0z5m3JRnOISIn2ZVPCrQC0MyGyhTS9DWhHjpigQE7A== 784 250 dependencies: 785 - "@tauri-apps/api": "npm:^2.8.0" 786 - checksum: 10c0/9ef2fae01e03f3bb16d8e55bfd921cf7c1d284e6459bd5b45777806304eb70ab0b50cbf03be76fc05e64ef70a37493e0cd90b0acc16eaee4a4fc2cfff7e43b71 787 - languageName: node 788 - linkType: hard 251 + "@tauri-apps/api" "^2.8.0" 789 252 790 - "@tauri-apps/plugin-store@npm:^2.4.2": 791 - version: 2.4.2 792 - resolution: "@tauri-apps/plugin-store@npm:2.4.2" 253 + "@types/babel__core@^7.20.5": 254 + version "7.20.5" 255 + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" 256 + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== 793 257 dependencies: 794 - "@tauri-apps/api": "npm:^2.8.0" 795 - checksum: 10c0/6892417dbd3e97c4a70e00ca437a196a65499831e7b3a5dc5b71646596a16c4030f23dedfa124ed853c73999a5b8e48de129fb0369e7af7c987142e060b58127 796 - languageName: node 797 - linkType: hard 798 - 799 - "@types/babel__core@npm:^7.20.5": 800 - version: 7.20.5 801 - resolution: "@types/babel__core@npm:7.20.5" 802 - dependencies: 803 - "@babel/parser": "npm:^7.20.7" 804 - "@babel/types": "npm:^7.20.7" 805 - "@types/babel__generator": "npm:*" 806 - "@types/babel__template": "npm:*" 807 - "@types/babel__traverse": "npm:*" 808 - checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff 809 - languageName: node 810 - linkType: hard 258 + "@babel/parser" "^7.20.7" 259 + "@babel/types" "^7.20.7" 260 + "@types/babel__generator" "*" 261 + "@types/babel__template" "*" 262 + "@types/babel__traverse" "*" 811 263 812 - "@types/babel__generator@npm:*": 813 - version: 7.27.0 814 - resolution: "@types/babel__generator@npm:7.27.0" 264 + "@types/babel__generator@*": 265 + version "7.27.0" 266 + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz" 267 + integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== 815 268 dependencies: 816 - "@babel/types": "npm:^7.0.0" 817 - checksum: 10c0/9f9e959a8792df208a9d048092fda7e1858bddc95c6314857a8211a99e20e6830bdeb572e3587ae8be5429e37f2a96fcf222a9f53ad232f5537764c9e13a2bbd 818 - languageName: node 819 - linkType: hard 269 + "@babel/types" "^7.0.0" 820 270 821 - "@types/babel__template@npm:*": 822 - version: 7.4.4 823 - resolution: "@types/babel__template@npm:7.4.4" 271 + "@types/babel__template@*": 272 + version "7.4.4" 273 + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" 274 + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== 824 275 dependencies: 825 - "@babel/parser": "npm:^7.1.0" 826 - "@babel/types": "npm:^7.0.0" 827 - checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b 828 - languageName: node 829 - linkType: hard 276 + "@babel/parser" "^7.1.0" 277 + "@babel/types" "^7.0.0" 830 278 831 - "@types/babel__traverse@npm:*": 832 - version: 7.28.0 833 - resolution: "@types/babel__traverse@npm:7.28.0" 279 + "@types/babel__traverse@*": 280 + version "7.28.0" 281 + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz" 282 + integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== 834 283 dependencies: 835 - "@babel/types": "npm:^7.28.2" 836 - checksum: 10c0/b52d7d4e8fc6a9018fe7361c4062c1c190f5778cf2466817cb9ed19d69fbbb54f9a85ffedeb748ed8062d2cf7d4cc088ee739848f47c57740de1c48cbf0d0994 837 - languageName: node 838 - linkType: hard 284 + "@babel/types" "^7.28.2" 839 285 840 - "@types/estree@npm:1.0.8": 841 - version: 1.0.8 842 - resolution: "@types/estree@npm:1.0.8" 843 - checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 844 - languageName: node 845 - linkType: hard 286 + "@types/estree@1.0.8": 287 + version "1.0.8" 288 + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" 289 + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== 846 290 847 - "@types/react-dom@npm:^19.1.6": 848 - version: 19.2.3 849 - resolution: "@types/react-dom@npm:19.2.3" 850 - peerDependencies: 851 - "@types/react": ^19.2.0 852 - checksum: 10c0/b486ebe0f4e2fb35e2e108df1d8fc0927ca5d6002d5771e8a739de11239fe62d0e207c50886185253c99eb9dedfeeb956ea7429e5ba17f6693c7acb4c02f8cd1 853 - languageName: node 854 - linkType: hard 291 + "@types/react-dom@^19.1.6": 292 + version "19.2.3" 293 + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz" 294 + integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== 855 295 856 - "@types/react@npm:^19.1.8": 857 - version: 19.2.5 858 - resolution: "@types/react@npm:19.2.5" 296 + "@types/react@^19.1.8", "@types/react@^19.2.0": 297 + version "19.2.5" 298 + resolved "https://registry.npmjs.org/@types/react/-/react-19.2.5.tgz" 299 + integrity sha512-keKxkZMqnDicuvFoJbzrhbtdLSPhj/rZThDlKWCDbgXmUg0rEUFtRssDXKYmtXluZlIqiC5VqkCgRwzuyLHKHw== 859 300 dependencies: 860 - csstype: "npm:^3.0.2" 861 - checksum: 10c0/1f9a92c73a5ea5b167f59cd0b5b9460fde65bd22b63b6d23bfaace8ad38537df127c97657418b4912a7a03a66e6451e82a41b84718d638ec1c8e4f0515d94793 862 - languageName: node 863 - linkType: hard 301 + csstype "^3.0.2" 864 302 865 - "@vitejs/plugin-react@npm:^4.6.0": 866 - version: 4.7.0 867 - resolution: "@vitejs/plugin-react@npm:4.7.0" 303 + "@vitejs/plugin-react@^4.6.0": 304 + version "4.7.0" 305 + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz" 306 + integrity sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA== 868 307 dependencies: 869 - "@babel/core": "npm:^7.28.0" 870 - "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" 871 - "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" 872 - "@rolldown/pluginutils": "npm:1.0.0-beta.27" 873 - "@types/babel__core": "npm:^7.20.5" 874 - react-refresh: "npm:^0.17.0" 875 - peerDependencies: 876 - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 877 - checksum: 10c0/692f23960972879485d647713663ec299c478222c96567d60285acf7c7dc5c178e71abfe9d2eefddef1eeb01514dacbc2ed68aad84628debf9c7116134734253 878 - languageName: node 879 - linkType: hard 308 + "@babel/core" "^7.28.0" 309 + "@babel/plugin-transform-react-jsx-self" "^7.27.1" 310 + "@babel/plugin-transform-react-jsx-source" "^7.27.1" 311 + "@rolldown/pluginutils" "1.0.0-beta.27" 312 + "@types/babel__core" "^7.20.5" 313 + react-refresh "^0.17.0" 880 314 881 - "abbrev@npm:^4.0.0": 882 - version: 4.0.0 883 - resolution: "abbrev@npm:4.0.0" 884 - checksum: 10c0/b4cc16935235e80702fc90192e349e32f8ef0ed151ef506aa78c81a7c455ec18375c4125414b99f84b2e055199d66383e787675f0bcd87da7a4dbd59f9eac1d5 885 - languageName: node 886 - linkType: hard 315 + baseline-browser-mapping@^2.8.25: 316 + version "2.8.28" 317 + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz" 318 + integrity sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ== 887 319 888 - "agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": 889 - version: 7.1.4 890 - resolution: "agent-base@npm:7.1.4" 891 - checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe 892 - languageName: node 893 - linkType: hard 894 - 895 - "baseline-browser-mapping@npm:^2.8.25": 896 - version: 2.8.28 897 - resolution: "baseline-browser-mapping@npm:2.8.28" 898 - bin: 899 - baseline-browser-mapping: dist/cli.js 900 - checksum: 10c0/d157d73de33bff69cf3413983dc1b2421063cd1c895e9edabc22dcb6667f7e17762b46ebeee5eee7496271351754c12750867c6ea5cb432f1bbe33dc5c62d1e6 901 - languageName: node 902 - linkType: hard 903 - 904 - "browserslist@npm:^4.24.0": 905 - version: 4.28.0 906 - resolution: "browserslist@npm:4.28.0" 320 + browserslist@^4.24.0, "browserslist@>= 4.21.0": 321 + version "4.28.0" 322 + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz" 323 + integrity sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ== 907 324 dependencies: 908 - baseline-browser-mapping: "npm:^2.8.25" 909 - caniuse-lite: "npm:^1.0.30001754" 910 - electron-to-chromium: "npm:^1.5.249" 911 - node-releases: "npm:^2.0.27" 912 - update-browserslist-db: "npm:^1.1.4" 913 - bin: 914 - browserslist: cli.js 915 - checksum: 10c0/4284fd568f7d40a496963083860d488cb2a89fb055b6affd316bebc59441fec938e090b3e62c0ee065eb0bc88cd1bc145f4300a16c75f3f565621c5823715ae1 916 - languageName: node 917 - linkType: hard 325 + baseline-browser-mapping "^2.8.25" 326 + caniuse-lite "^1.0.30001754" 327 + electron-to-chromium "^1.5.249" 328 + node-releases "^2.0.27" 329 + update-browserslist-db "^1.1.4" 918 330 919 - "cacache@npm:^20.0.1": 920 - version: 20.0.3 921 - resolution: "cacache@npm:20.0.3" 922 - dependencies: 923 - "@npmcli/fs": "npm:^5.0.0" 924 - fs-minipass: "npm:^3.0.0" 925 - glob: "npm:^13.0.0" 926 - lru-cache: "npm:^11.1.0" 927 - minipass: "npm:^7.0.3" 928 - minipass-collect: "npm:^2.0.1" 929 - minipass-flush: "npm:^1.0.5" 930 - minipass-pipeline: "npm:^1.2.4" 931 - p-map: "npm:^7.0.2" 932 - ssri: "npm:^13.0.0" 933 - unique-filename: "npm:^5.0.0" 934 - checksum: 10c0/c7da1ca694d20e8f8aedabd21dc11518f809a7d2b59aa76a1fc655db5a9e62379e465c157ddd2afe34b19230808882288effa6911b2de26a088a6d5645123462 935 - languageName: node 936 - linkType: hard 331 + caniuse-lite@^1.0.30001754: 332 + version "1.0.30001755" 333 + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001755.tgz" 334 + integrity sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA== 937 335 938 - "caniuse-lite@npm:^1.0.30001754": 939 - version: 1.0.30001755 940 - resolution: "caniuse-lite@npm:1.0.30001755" 941 - checksum: 10c0/7b8e32a4ec307b50f557d30176651cf69f20a0ea4de6f5f34149ea65a1f0cfcc0677b403484aea3661c7469ab11f2df6528027b9ec2d0265635ede9d5b517380 942 - languageName: node 943 - linkType: hard 944 - 945 - "chownr@npm:^3.0.0": 946 - version: 3.0.0 947 - resolution: "chownr@npm:3.0.0" 948 - checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 949 - languageName: node 950 - linkType: hard 951 - 952 - "convert-source-map@npm:^2.0.0": 953 - version: 2.0.0 954 - resolution: "convert-source-map@npm:2.0.0" 955 - checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b 956 - languageName: node 957 - linkType: hard 336 + convert-source-map@^2.0.0: 337 + version "2.0.0" 338 + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" 339 + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== 958 340 959 - "csstype@npm:^3.0.2": 960 - version: 3.2.2 961 - resolution: "csstype@npm:3.2.2" 962 - checksum: 10c0/ec45114093760c9944c84514615fe4080189276ee4980f52359426a4db5e4fdf0a60affac2c033b978d6c0fed275f37820952682aefa85aeec041d00fecff64d 963 - languageName: node 964 - linkType: hard 341 + csstype@^3.0.2: 342 + version "3.2.2" 343 + resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.2.tgz" 344 + integrity sha512-D80T+tiqkd/8B0xNlbstWDG4x6aqVfO52+OlSUNIdkTvmNw0uQpJLeos2J/2XvpyidAFuTPmpad+tUxLndwj6g== 965 345 966 - "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.4": 967 - version: 4.4.3 968 - resolution: "debug@npm:4.4.3" 346 + debug@^4.1.0, debug@^4.3.1: 347 + version "4.4.3" 348 + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" 349 + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== 969 350 dependencies: 970 - ms: "npm:^2.1.3" 971 - peerDependenciesMeta: 972 - supports-color: 973 - optional: true 974 - checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 975 - languageName: node 976 - linkType: hard 351 + ms "^2.1.3" 977 352 978 - "electron-to-chromium@npm:^1.5.249": 979 - version: 1.5.254 980 - resolution: "electron-to-chromium@npm:1.5.254" 981 - checksum: 10c0/a4db4124f7d1a44d13db14ea5b1137a50f21074694ca9463b4f541a0e8540ba8b619fdad1846b3ab4e53031bcfdea07618df8fe357c121a68d60fd44ffddd2ec 982 - languageName: node 983 - linkType: hard 353 + electron-to-chromium@^1.5.249: 354 + version "1.5.254" 355 + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.254.tgz" 356 + integrity sha512-DcUsWpVhv9svsKRxnSCZ86SjD+sp32SGidNB37KpqXJncp1mfUgKbHvBomE89WJDbfVKw1mdv5+ikrvd43r+Bg== 984 357 985 - "encoding@npm:^0.1.13": 986 - version: 0.1.13 987 - resolution: "encoding@npm:0.1.13" 988 - dependencies: 989 - iconv-lite: "npm:^0.6.2" 990 - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 991 - languageName: node 992 - linkType: hard 358 + esbuild@^0.25.0: 359 + version "0.25.12" 360 + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz" 361 + integrity sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg== 362 + optionalDependencies: 363 + "@esbuild/aix-ppc64" "0.25.12" 364 + "@esbuild/android-arm" "0.25.12" 365 + "@esbuild/android-arm64" "0.25.12" 366 + "@esbuild/android-x64" "0.25.12" 367 + "@esbuild/darwin-arm64" "0.25.12" 368 + "@esbuild/darwin-x64" "0.25.12" 369 + "@esbuild/freebsd-arm64" "0.25.12" 370 + "@esbuild/freebsd-x64" "0.25.12" 371 + "@esbuild/linux-arm" "0.25.12" 372 + "@esbuild/linux-arm64" "0.25.12" 373 + "@esbuild/linux-ia32" "0.25.12" 374 + "@esbuild/linux-loong64" "0.25.12" 375 + "@esbuild/linux-mips64el" "0.25.12" 376 + "@esbuild/linux-ppc64" "0.25.12" 377 + "@esbuild/linux-riscv64" "0.25.12" 378 + "@esbuild/linux-s390x" "0.25.12" 379 + "@esbuild/linux-x64" "0.25.12" 380 + "@esbuild/netbsd-arm64" "0.25.12" 381 + "@esbuild/netbsd-x64" "0.25.12" 382 + "@esbuild/openbsd-arm64" "0.25.12" 383 + "@esbuild/openbsd-x64" "0.25.12" 384 + "@esbuild/openharmony-arm64" "0.25.12" 385 + "@esbuild/sunos-x64" "0.25.12" 386 + "@esbuild/win32-arm64" "0.25.12" 387 + "@esbuild/win32-ia32" "0.25.12" 388 + "@esbuild/win32-x64" "0.25.12" 993 389 994 - "env-paths@npm:^2.2.0": 995 - version: 2.2.1 996 - resolution: "env-paths@npm:2.2.1" 997 - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 998 - languageName: node 999 - linkType: hard 390 + escalade@^3.2.0: 391 + version "3.2.0" 392 + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" 393 + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 1000 394 1001 - "err-code@npm:^2.0.2": 1002 - version: 2.0.3 1003 - resolution: "err-code@npm:2.0.3" 1004 - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 1005 - languageName: node 1006 - linkType: hard 395 + fdir@^6.5.0: 396 + version "6.5.0" 397 + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" 398 + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== 1007 399 1008 - "esbuild@npm:^0.25.0": 1009 - version: 0.25.12 1010 - resolution: "esbuild@npm:0.25.12" 1011 - dependencies: 1012 - "@esbuild/aix-ppc64": "npm:0.25.12" 1013 - "@esbuild/android-arm": "npm:0.25.12" 1014 - "@esbuild/android-arm64": "npm:0.25.12" 1015 - "@esbuild/android-x64": "npm:0.25.12" 1016 - "@esbuild/darwin-arm64": "npm:0.25.12" 1017 - "@esbuild/darwin-x64": "npm:0.25.12" 1018 - "@esbuild/freebsd-arm64": "npm:0.25.12" 1019 - "@esbuild/freebsd-x64": "npm:0.25.12" 1020 - "@esbuild/linux-arm": "npm:0.25.12" 1021 - "@esbuild/linux-arm64": "npm:0.25.12" 1022 - "@esbuild/linux-ia32": "npm:0.25.12" 1023 - "@esbuild/linux-loong64": "npm:0.25.12" 1024 - "@esbuild/linux-mips64el": "npm:0.25.12" 1025 - "@esbuild/linux-ppc64": "npm:0.25.12" 1026 - "@esbuild/linux-riscv64": "npm:0.25.12" 1027 - "@esbuild/linux-s390x": "npm:0.25.12" 1028 - "@esbuild/linux-x64": "npm:0.25.12" 1029 - "@esbuild/netbsd-arm64": "npm:0.25.12" 1030 - "@esbuild/netbsd-x64": "npm:0.25.12" 1031 - "@esbuild/openbsd-arm64": "npm:0.25.12" 1032 - "@esbuild/openbsd-x64": "npm:0.25.12" 1033 - "@esbuild/openharmony-arm64": "npm:0.25.12" 1034 - "@esbuild/sunos-x64": "npm:0.25.12" 1035 - "@esbuild/win32-arm64": "npm:0.25.12" 1036 - "@esbuild/win32-ia32": "npm:0.25.12" 1037 - "@esbuild/win32-x64": "npm:0.25.12" 1038 - dependenciesMeta: 1039 - "@esbuild/aix-ppc64": 1040 - optional: true 1041 - "@esbuild/android-arm": 1042 - optional: true 1043 - "@esbuild/android-arm64": 1044 - optional: true 1045 - "@esbuild/android-x64": 1046 - optional: true 1047 - "@esbuild/darwin-arm64": 1048 - optional: true 1049 - "@esbuild/darwin-x64": 1050 - optional: true 1051 - "@esbuild/freebsd-arm64": 1052 - optional: true 1053 - "@esbuild/freebsd-x64": 1054 - optional: true 1055 - "@esbuild/linux-arm": 1056 - optional: true 1057 - "@esbuild/linux-arm64": 1058 - optional: true 1059 - "@esbuild/linux-ia32": 1060 - optional: true 1061 - "@esbuild/linux-loong64": 1062 - optional: true 1063 - "@esbuild/linux-mips64el": 1064 - optional: true 1065 - "@esbuild/linux-ppc64": 1066 - optional: true 1067 - "@esbuild/linux-riscv64": 1068 - optional: true 1069 - "@esbuild/linux-s390x": 1070 - optional: true 1071 - "@esbuild/linux-x64": 1072 - optional: true 1073 - "@esbuild/netbsd-arm64": 1074 - optional: true 1075 - "@esbuild/netbsd-x64": 1076 - optional: true 1077 - "@esbuild/openbsd-arm64": 1078 - optional: true 1079 - "@esbuild/openbsd-x64": 1080 - optional: true 1081 - "@esbuild/openharmony-arm64": 1082 - optional: true 1083 - "@esbuild/sunos-x64": 1084 - optional: true 1085 - "@esbuild/win32-arm64": 1086 - optional: true 1087 - "@esbuild/win32-ia32": 1088 - optional: true 1089 - "@esbuild/win32-x64": 1090 - optional: true 1091 - bin: 1092 - esbuild: bin/esbuild 1093 - checksum: 10c0/c205357531423220a9de8e1e6c6514242bc9b1666e762cd67ccdf8fdfdc3f1d0bd76f8d9383958b97ad4c953efdb7b6e8c1f9ca5951cd2b7c5235e8755b34a6b 1094 - languageName: node 1095 - linkType: hard 400 + fsevents@~2.3.2, fsevents@~2.3.3: 401 + version "2.3.3" 402 + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" 403 + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 1096 404 1097 - "escalade@npm:^3.2.0": 1098 - version: 3.2.0 1099 - resolution: "escalade@npm:3.2.0" 1100 - checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 1101 - languageName: node 1102 - linkType: hard 405 + gensync@^1.0.0-beta.2: 406 + version "1.0.0-beta.2" 407 + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" 408 + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 1103 409 1104 - "exponential-backoff@npm:^3.1.1": 1105 - version: 3.1.3 1106 - resolution: "exponential-backoff@npm:3.1.3" 1107 - checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 1108 - languageName: node 1109 - linkType: hard 410 + js-tokens@^4.0.0: 411 + version "4.0.0" 412 + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 413 + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1110 414 1111 - "fdir@npm:^6.5.0": 1112 - version: 6.5.0 1113 - resolution: "fdir@npm:6.5.0" 1114 - peerDependencies: 1115 - picomatch: ^3 || ^4 1116 - peerDependenciesMeta: 1117 - picomatch: 1118 - optional: true 1119 - checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f 1120 - languageName: node 1121 - linkType: hard 415 + jsesc@^3.0.2: 416 + version "3.1.0" 417 + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" 418 + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== 1122 419 1123 - "fs-minipass@npm:^3.0.0": 1124 - version: 3.0.3 1125 - resolution: "fs-minipass@npm:3.0.3" 1126 - dependencies: 1127 - minipass: "npm:^7.0.3" 1128 - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 1129 - languageName: node 1130 - linkType: hard 420 + json5@^2.2.3: 421 + version "2.2.3" 422 + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" 423 + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 1131 424 1132 - "fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": 1133 - version: 2.3.3 1134 - resolution: "fsevents@npm:2.3.3" 425 + lru-cache@^5.1.1: 426 + version "5.1.1" 427 + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" 428 + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1135 429 dependencies: 1136 - node-gyp: "npm:latest" 1137 - checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 1138 - conditions: os=darwin 1139 - languageName: node 1140 - linkType: hard 430 + yallist "^3.0.2" 1141 431 1142 - "fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin<compat/fsevents>, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin<compat/fsevents>": 1143 - version: 2.3.3 1144 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin<compat/fsevents>::version=2.3.3&hash=df0bf1" 1145 - dependencies: 1146 - node-gyp: "npm:latest" 1147 - conditions: os=darwin 1148 - languageName: node 1149 - linkType: hard 432 + ms@^2.1.3: 433 + version "2.1.3" 434 + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 435 + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1150 436 1151 - "gensync@npm:^1.0.0-beta.2": 1152 - version: 1.0.0-beta.2 1153 - resolution: "gensync@npm:1.0.0-beta.2" 1154 - checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 1155 - languageName: node 1156 - linkType: hard 437 + nanoid@^3.3.11: 438 + version "3.3.11" 439 + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" 440 + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== 1157 441 1158 - "glob@npm:^13.0.0": 1159 - version: 13.0.1 1160 - resolution: "glob@npm:13.0.1" 1161 - dependencies: 1162 - minimatch: "npm:^10.1.2" 1163 - minipass: "npm:^7.1.2" 1164 - path-scurry: "npm:^2.0.0" 1165 - checksum: 10c0/af7b863dec8dff74f61d7d6e53104e1f6bbdd482157a196cade8ed857481e876ec35181b38a059b2a7b93ea3b08248f4ff0792fef6dc91814fd5097a716f48e4 1166 - languageName: node 1167 - linkType: hard 442 + node-releases@^2.0.27: 443 + version "2.0.27" 444 + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz" 445 + integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== 1168 446 1169 - "graceful-fs@npm:^4.2.6": 1170 - version: 4.2.11 1171 - resolution: "graceful-fs@npm:4.2.11" 1172 - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 1173 - languageName: node 1174 - linkType: hard 447 + picocolors@^1.1.1: 448 + version "1.1.1" 449 + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" 450 + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 1175 451 1176 - "http-cache-semantics@npm:^4.1.1": 1177 - version: 4.2.0 1178 - resolution: "http-cache-semantics@npm:4.2.0" 1179 - checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 1180 - languageName: node 1181 - linkType: hard 452 + "picomatch@^3 || ^4", picomatch@^4.0.3: 453 + version "4.0.3" 454 + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" 455 + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== 1182 456 1183 - "http-proxy-agent@npm:^7.0.0": 1184 - version: 7.0.2 1185 - resolution: "http-proxy-agent@npm:7.0.2" 457 + postcss@^8.5.6: 458 + version "8.5.6" 459 + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" 460 + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== 1186 461 dependencies: 1187 - agent-base: "npm:^7.1.0" 1188 - debug: "npm:^4.3.4" 1189 - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 1190 - languageName: node 1191 - linkType: hard 462 + nanoid "^3.3.11" 463 + picocolors "^1.1.1" 464 + source-map-js "^1.2.1" 1192 465 1193 - "https-proxy-agent@npm:^7.0.1": 1194 - version: 7.0.6 1195 - resolution: "https-proxy-agent@npm:7.0.6" 466 + react-dom@^19.1.0: 467 + version "19.2.0" 468 + resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz" 469 + integrity sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ== 1196 470 dependencies: 1197 - agent-base: "npm:^7.1.2" 1198 - debug: "npm:4" 1199 - checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac 1200 - languageName: node 1201 - linkType: hard 1202 - 1203 - "iconv-lite@npm:^0.6.2": 1204 - version: 0.6.3 1205 - resolution: "iconv-lite@npm:0.6.3" 1206 - dependencies: 1207 - safer-buffer: "npm:>= 2.1.2 < 3.0.0" 1208 - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 1209 - languageName: node 1210 - linkType: hard 1211 - 1212 - "imurmurhash@npm:^0.1.4": 1213 - version: 0.1.4 1214 - resolution: "imurmurhash@npm:0.1.4" 1215 - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 1216 - languageName: node 1217 - linkType: hard 1218 - 1219 - "ip-address@npm:^10.0.1": 1220 - version: 10.1.0 1221 - resolution: "ip-address@npm:10.1.0" 1222 - checksum: 10c0/0103516cfa93f6433b3bd7333fa876eb21263912329bfa47010af5e16934eeeff86f3d2ae700a3744a137839ddfad62b900c7a445607884a49b5d1e32a3d7566 1223 - languageName: node 1224 - linkType: hard 1225 - 1226 - "isexe@npm:^3.1.1": 1227 - version: 3.1.1 1228 - resolution: "isexe@npm:3.1.1" 1229 - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 1230 - languageName: node 1231 - linkType: hard 1232 - 1233 - "js-tokens@npm:^4.0.0": 1234 - version: 4.0.0 1235 - resolution: "js-tokens@npm:4.0.0" 1236 - checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed 1237 - languageName: node 1238 - linkType: hard 1239 - 1240 - "jsesc@npm:^3.0.2": 1241 - version: 3.1.0 1242 - resolution: "jsesc@npm:3.1.0" 1243 - bin: 1244 - jsesc: bin/jsesc 1245 - checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 1246 - languageName: node 1247 - linkType: hard 471 + scheduler "^0.27.0" 1248 472 1249 - "json5@npm:^2.2.3": 1250 - version: 2.2.3 1251 - resolution: "json5@npm:2.2.3" 1252 - bin: 1253 - json5: lib/cli.js 1254 - checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c 1255 - languageName: node 1256 - linkType: hard 473 + react-refresh@^0.17.0: 474 + version "0.17.0" 475 + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz" 476 + integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== 1257 477 1258 - "lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": 1259 - version: 11.2.5 1260 - resolution: "lru-cache@npm:11.2.5" 1261 - checksum: 10c0/cc98958d25dddf1c8a8cbdc49588bd3b24450e8dfa78f32168fd188a20d4a0331c7406d0f3250c86a46619ee288056fd7a1195e8df56dc8a9592397f4fbd8e1d 1262 - languageName: node 1263 - linkType: hard 478 + react@^19.1.0, react@^19.2.0: 479 + version "19.2.0" 480 + resolved "https://registry.npmjs.org/react/-/react-19.2.0.tgz" 481 + integrity sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ== 1264 482 1265 - "lru-cache@npm:^5.1.1": 1266 - version: 5.1.1 1267 - resolution: "lru-cache@npm:5.1.1" 483 + rollup@^4.43.0: 484 + version "4.53.2" 485 + resolved "https://registry.npmjs.org/rollup/-/rollup-4.53.2.tgz" 486 + integrity sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g== 1268 487 dependencies: 1269 - yallist: "npm:^3.0.2" 1270 - checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 1271 - languageName: node 1272 - linkType: hard 488 + "@types/estree" "1.0.8" 489 + optionalDependencies: 490 + "@rollup/rollup-android-arm-eabi" "4.53.2" 491 + "@rollup/rollup-android-arm64" "4.53.2" 492 + "@rollup/rollup-darwin-arm64" "4.53.2" 493 + "@rollup/rollup-darwin-x64" "4.53.2" 494 + "@rollup/rollup-freebsd-arm64" "4.53.2" 495 + "@rollup/rollup-freebsd-x64" "4.53.2" 496 + "@rollup/rollup-linux-arm-gnueabihf" "4.53.2" 497 + "@rollup/rollup-linux-arm-musleabihf" "4.53.2" 498 + "@rollup/rollup-linux-arm64-gnu" "4.53.2" 499 + "@rollup/rollup-linux-arm64-musl" "4.53.2" 500 + "@rollup/rollup-linux-loong64-gnu" "4.53.2" 501 + "@rollup/rollup-linux-ppc64-gnu" "4.53.2" 502 + "@rollup/rollup-linux-riscv64-gnu" "4.53.2" 503 + "@rollup/rollup-linux-riscv64-musl" "4.53.2" 504 + "@rollup/rollup-linux-s390x-gnu" "4.53.2" 505 + "@rollup/rollup-linux-x64-gnu" "4.53.2" 506 + "@rollup/rollup-linux-x64-musl" "4.53.2" 507 + "@rollup/rollup-openharmony-arm64" "4.53.2" 508 + "@rollup/rollup-win32-arm64-msvc" "4.53.2" 509 + "@rollup/rollup-win32-ia32-msvc" "4.53.2" 510 + "@rollup/rollup-win32-x64-gnu" "4.53.2" 511 + "@rollup/rollup-win32-x64-msvc" "4.53.2" 512 + fsevents "~2.3.2" 1273 513 1274 - "make-fetch-happen@npm:^15.0.0": 1275 - version: 15.0.3 1276 - resolution: "make-fetch-happen@npm:15.0.3" 1277 - dependencies: 1278 - "@npmcli/agent": "npm:^4.0.0" 1279 - cacache: "npm:^20.0.1" 1280 - http-cache-semantics: "npm:^4.1.1" 1281 - minipass: "npm:^7.0.2" 1282 - minipass-fetch: "npm:^5.0.0" 1283 - minipass-flush: "npm:^1.0.5" 1284 - minipass-pipeline: "npm:^1.2.4" 1285 - negotiator: "npm:^1.0.0" 1286 - proc-log: "npm:^6.0.0" 1287 - promise-retry: "npm:^2.0.1" 1288 - ssri: "npm:^13.0.0" 1289 - checksum: 10c0/525f74915660be60b616bcbd267c4a5b59481b073ba125e45c9c3a041bb1a47a2bd0ae79d028eb6f5f95bf9851a4158423f5068539c3093621abb64027e8e461 1290 - languageName: node 1291 - linkType: hard 514 + scheduler@^0.27.0: 515 + version "0.27.0" 516 + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz" 517 + integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== 1292 518 1293 - "minimatch@npm:^10.1.2": 1294 - version: 10.1.2 1295 - resolution: "minimatch@npm:10.1.2" 1296 - dependencies: 1297 - "@isaacs/brace-expansion": "npm:^5.0.1" 1298 - checksum: 10c0/0cccef3622201703de6ecf9d772c0be1d5513dcc038ed9feb866c20cf798243e678ac35605dac3f1a054650c28037486713fe9e9a34b184b9097959114daf086 1299 - languageName: node 1300 - linkType: hard 519 + semver@^6.3.1: 520 + version "6.3.1" 521 + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" 522 + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1301 523 1302 - "minipass-collect@npm:^2.0.1": 1303 - version: 2.0.1 1304 - resolution: "minipass-collect@npm:2.0.1" 1305 - dependencies: 1306 - minipass: "npm:^7.0.3" 1307 - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e 1308 - languageName: node 1309 - linkType: hard 524 + snarkdown@^2.0.0: 525 + version "2.0.0" 526 + resolved "https://registry.npmjs.org/snarkdown/-/snarkdown-2.0.0.tgz" 527 + integrity sha512-MgL/7k/AZdXCTJiNgrO7chgDqaB9FGM/1Tvlcenenb7div6obaDATzs16JhFyHHBGodHT3B7RzRc5qk8pFhg3A== 1310 528 1311 - "minipass-fetch@npm:^5.0.0": 1312 - version: 5.0.1 1313 - resolution: "minipass-fetch@npm:5.0.1" 1314 - dependencies: 1315 - encoding: "npm:^0.1.13" 1316 - minipass: "npm:^7.0.3" 1317 - minipass-sized: "npm:^2.0.0" 1318 - minizlib: "npm:^3.0.1" 1319 - dependenciesMeta: 1320 - encoding: 1321 - optional: true 1322 - checksum: 10c0/50bcf48c9841ebb25e29a2817468595219c72cfffc7c175a1d7327843c8bef9b72cb01778f46df7eca695dfe47ab98e6167af4cb026ddd80f660842919a5193c 1323 - languageName: node 1324 - linkType: hard 529 + source-map-js@^1.2.1: 530 + version "1.2.1" 531 + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" 532 + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== 1325 533 1326 - "minipass-flush@npm:^1.0.5": 1327 - version: 1.0.5 1328 - resolution: "minipass-flush@npm:1.0.5" 534 + tinyglobby@^0.2.15: 535 + version "0.2.15" 536 + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" 537 + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== 1329 538 dependencies: 1330 - minipass: "npm:^3.0.0" 1331 - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd 1332 - languageName: node 1333 - linkType: hard 539 + fdir "^6.5.0" 540 + picomatch "^4.0.3" 1334 541 1335 - "minipass-pipeline@npm:^1.2.4": 1336 - version: 1.2.4 1337 - resolution: "minipass-pipeline@npm:1.2.4" 1338 - dependencies: 1339 - minipass: "npm:^3.0.0" 1340 - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 1341 - languageName: node 1342 - linkType: hard 542 + typescript@~5.8.3: 543 + version "5.8.3" 544 + resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz" 545 + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== 1343 546 1344 - "minipass-sized@npm:^2.0.0": 1345 - version: 2.0.0 1346 - resolution: "minipass-sized@npm:2.0.0" 1347 - dependencies: 1348 - minipass: "npm:^7.1.2" 1349 - checksum: 10c0/f9201696a6f6d68610d04c9c83e3d2e5cb9c026aae1c8cbf7e17f386105cb79c1bb088dbc21bf0b1eb4f3fb5df384fd1e7aa3bf1f33868c416ae8c8a92679db8 1350 - languageName: node 1351 - linkType: hard 1352 - 1353 - "minipass@npm:^3.0.0": 1354 - version: 3.3.6 1355 - resolution: "minipass@npm:3.3.6" 1356 - dependencies: 1357 - yallist: "npm:^4.0.0" 1358 - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c 1359 - languageName: node 1360 - linkType: hard 1361 - 1362 - "minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": 1363 - version: 7.1.2 1364 - resolution: "minipass@npm:7.1.2" 1365 - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 1366 - languageName: node 1367 - linkType: hard 1368 - 1369 - "minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": 1370 - version: 3.1.0 1371 - resolution: "minizlib@npm:3.1.0" 1372 - dependencies: 1373 - minipass: "npm:^7.1.2" 1374 - checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec 1375 - languageName: node 1376 - linkType: hard 1377 - 1378 - "ms@npm:^2.1.3": 1379 - version: 2.1.3 1380 - resolution: "ms@npm:2.1.3" 1381 - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 1382 - languageName: node 1383 - linkType: hard 1384 - 1385 - "nanoid@npm:^3.3.11": 1386 - version: 3.3.11 1387 - resolution: "nanoid@npm:3.3.11" 1388 - bin: 1389 - nanoid: bin/nanoid.cjs 1390 - checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b 1391 - languageName: node 1392 - linkType: hard 1393 - 1394 - "negotiator@npm:^1.0.0": 1395 - version: 1.0.0 1396 - resolution: "negotiator@npm:1.0.0" 1397 - checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b 1398 - languageName: node 1399 - linkType: hard 1400 - 1401 - "node-gyp@npm:latest": 1402 - version: 12.2.0 1403 - resolution: "node-gyp@npm:12.2.0" 1404 - dependencies: 1405 - env-paths: "npm:^2.2.0" 1406 - exponential-backoff: "npm:^3.1.1" 1407 - graceful-fs: "npm:^4.2.6" 1408 - make-fetch-happen: "npm:^15.0.0" 1409 - nopt: "npm:^9.0.0" 1410 - proc-log: "npm:^6.0.0" 1411 - semver: "npm:^7.3.5" 1412 - tar: "npm:^7.5.4" 1413 - tinyglobby: "npm:^0.2.12" 1414 - which: "npm:^6.0.0" 1415 - bin: 1416 - node-gyp: bin/node-gyp.js 1417 - checksum: 10c0/3ed046746a5a7d90950cd8b0547332b06598443f31fe213ef4332a7174c7b7d259e1704835feda79b87d3f02e59d7791842aac60642ede4396ab25fdf0f8f759 1418 - languageName: node 1419 - linkType: hard 1420 - 1421 - "node-releases@npm:^2.0.27": 1422 - version: 2.0.27 1423 - resolution: "node-releases@npm:2.0.27" 1424 - checksum: 10c0/f1e6583b7833ea81880627748d28a3a7ff5703d5409328c216ae57befbced10ce2c991bea86434e8ec39003bd017f70481e2e5f8c1f7e0a7663241f81d6e00e2 1425 - languageName: node 1426 - linkType: hard 1427 - 1428 - "nopt@npm:^9.0.0": 1429 - version: 9.0.0 1430 - resolution: "nopt@npm:9.0.0" 1431 - dependencies: 1432 - abbrev: "npm:^4.0.0" 1433 - bin: 1434 - nopt: bin/nopt.js 1435 - checksum: 10c0/1822eb6f9b020ef6f7a7516d7b64a8036e09666ea55ac40416c36e4b2b343122c3cff0e2f085675f53de1d2db99a2a89a60ccea1d120bcd6a5347bf6ceb4a7fd 1436 - languageName: node 1437 - linkType: hard 1438 - 1439 - "p-map@npm:^7.0.2": 1440 - version: 7.0.4 1441 - resolution: "p-map@npm:7.0.4" 1442 - checksum: 10c0/a5030935d3cb2919d7e89454d1ce82141e6f9955413658b8c9403cfe379283770ed3048146b44cde168aa9e8c716505f196d5689db0ae3ce9a71521a2fef3abd 1443 - languageName: node 1444 - linkType: hard 1445 - 1446 - "path-scurry@npm:^2.0.0": 1447 - version: 2.0.1 1448 - resolution: "path-scurry@npm:2.0.1" 1449 - dependencies: 1450 - lru-cache: "npm:^11.0.0" 1451 - minipass: "npm:^7.1.2" 1452 - checksum: 10c0/2a16ed0e81fbc43513e245aa5763354e25e787dab0d539581a6c3f0f967461a159ed6236b2559de23aa5b88e7dc32b469b6c47568833dd142a4b24b4f5cd2620 1453 - languageName: node 1454 - linkType: hard 1455 - 1456 - "peek@workspace:.": 1457 - version: 0.0.0-use.local 1458 - resolution: "peek@workspace:." 1459 - dependencies: 1460 - "@tauri-apps/api": "npm:^2.10.1" 1461 - "@tauri-apps/cli": "npm:^2.10.0" 1462 - "@tauri-apps/plugin-opener": "npm:^2.5.3" 1463 - "@tauri-apps/plugin-store": "npm:^2.4.2" 1464 - "@types/react": "npm:^19.1.8" 1465 - "@types/react-dom": "npm:^19.1.6" 1466 - "@vitejs/plugin-react": "npm:^4.6.0" 1467 - react: "npm:^19.1.0" 1468 - react-dom: "npm:^19.1.0" 1469 - snarkdown: "npm:^2.0.0" 1470 - typescript: "npm:~5.8.3" 1471 - vite: "npm:^7.0.4" 1472 - languageName: unknown 1473 - linkType: soft 1474 - 1475 - "picocolors@npm:^1.1.1": 1476 - version: 1.1.1 1477 - resolution: "picocolors@npm:1.1.1" 1478 - checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 1479 - languageName: node 1480 - linkType: hard 1481 - 1482 - "picomatch@npm:^4.0.3": 1483 - version: 4.0.3 1484 - resolution: "picomatch@npm:4.0.3" 1485 - checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 1486 - languageName: node 1487 - linkType: hard 1488 - 1489 - "postcss@npm:^8.5.6": 1490 - version: 8.5.6 1491 - resolution: "postcss@npm:8.5.6" 1492 - dependencies: 1493 - nanoid: "npm:^3.3.11" 1494 - picocolors: "npm:^1.1.1" 1495 - source-map-js: "npm:^1.2.1" 1496 - checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 1497 - languageName: node 1498 - linkType: hard 1499 - 1500 - "proc-log@npm:^6.0.0": 1501 - version: 6.1.0 1502 - resolution: "proc-log@npm:6.1.0" 1503 - checksum: 10c0/4f178d4062733ead9d71a9b1ab24ebcecdfe2250916a5b1555f04fe2eda972a0ec76fbaa8df1ad9c02707add6749219d118a4fc46dc56bdfe4dde4b47d80bb82 1504 - languageName: node 1505 - linkType: hard 1506 - 1507 - "promise-retry@npm:^2.0.1": 1508 - version: 2.0.1 1509 - resolution: "promise-retry@npm:2.0.1" 1510 - dependencies: 1511 - err-code: "npm:^2.0.2" 1512 - retry: "npm:^0.12.0" 1513 - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 1514 - languageName: node 1515 - linkType: hard 1516 - 1517 - "react-dom@npm:^19.1.0": 1518 - version: 19.2.0 1519 - resolution: "react-dom@npm:19.2.0" 1520 - dependencies: 1521 - scheduler: "npm:^0.27.0" 1522 - peerDependencies: 1523 - react: ^19.2.0 1524 - checksum: 10c0/fa2cae05248d01288e91523b590ce4e7635b1e13f1344e225f850d722a8da037bf0782f63b1c1d46353334e0c696909b82e582f8cad607948fde6f7646cc18d9 1525 - languageName: node 1526 - linkType: hard 1527 - 1528 - "react-refresh@npm:^0.17.0": 1529 - version: 0.17.0 1530 - resolution: "react-refresh@npm:0.17.0" 1531 - checksum: 10c0/002cba940384c9930008c0bce26cac97a9d5682bc623112c2268ba0c155127d9c178a9a5cc2212d560088d60dfd503edd808669a25f9b377f316a32361d0b23c 1532 - languageName: node 1533 - linkType: hard 1534 - 1535 - "react@npm:^19.1.0": 1536 - version: 19.2.0 1537 - resolution: "react@npm:19.2.0" 1538 - checksum: 10c0/1b6d64eacb9324725bfe1e7860cb7a6b8a34bc89a482920765ebff5c10578eb487e6b46b2f0df263bd27a25edbdae2c45e5ea5d81ae61404301c1a7192c38330 1539 - languageName: node 1540 - linkType: hard 1541 - 1542 - "retry@npm:^0.12.0": 1543 - version: 0.12.0 1544 - resolution: "retry@npm:0.12.0" 1545 - checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe 1546 - languageName: node 1547 - linkType: hard 1548 - 1549 - "rollup@npm:^4.43.0": 1550 - version: 4.53.2 1551 - resolution: "rollup@npm:4.53.2" 1552 - dependencies: 1553 - "@rollup/rollup-android-arm-eabi": "npm:4.53.2" 1554 - "@rollup/rollup-android-arm64": "npm:4.53.2" 1555 - "@rollup/rollup-darwin-arm64": "npm:4.53.2" 1556 - "@rollup/rollup-darwin-x64": "npm:4.53.2" 1557 - "@rollup/rollup-freebsd-arm64": "npm:4.53.2" 1558 - "@rollup/rollup-freebsd-x64": "npm:4.53.2" 1559 - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.53.2" 1560 - "@rollup/rollup-linux-arm-musleabihf": "npm:4.53.2" 1561 - "@rollup/rollup-linux-arm64-gnu": "npm:4.53.2" 1562 - "@rollup/rollup-linux-arm64-musl": "npm:4.53.2" 1563 - "@rollup/rollup-linux-loong64-gnu": "npm:4.53.2" 1564 - "@rollup/rollup-linux-ppc64-gnu": "npm:4.53.2" 1565 - "@rollup/rollup-linux-riscv64-gnu": "npm:4.53.2" 1566 - "@rollup/rollup-linux-riscv64-musl": "npm:4.53.2" 1567 - "@rollup/rollup-linux-s390x-gnu": "npm:4.53.2" 1568 - "@rollup/rollup-linux-x64-gnu": "npm:4.53.2" 1569 - "@rollup/rollup-linux-x64-musl": "npm:4.53.2" 1570 - "@rollup/rollup-openharmony-arm64": "npm:4.53.2" 1571 - "@rollup/rollup-win32-arm64-msvc": "npm:4.53.2" 1572 - "@rollup/rollup-win32-ia32-msvc": "npm:4.53.2" 1573 - "@rollup/rollup-win32-x64-gnu": "npm:4.53.2" 1574 - "@rollup/rollup-win32-x64-msvc": "npm:4.53.2" 1575 - "@types/estree": "npm:1.0.8" 1576 - fsevents: "npm:~2.3.2" 1577 - dependenciesMeta: 1578 - "@rollup/rollup-android-arm-eabi": 1579 - optional: true 1580 - "@rollup/rollup-android-arm64": 1581 - optional: true 1582 - "@rollup/rollup-darwin-arm64": 1583 - optional: true 1584 - "@rollup/rollup-darwin-x64": 1585 - optional: true 1586 - "@rollup/rollup-freebsd-arm64": 1587 - optional: true 1588 - "@rollup/rollup-freebsd-x64": 1589 - optional: true 1590 - "@rollup/rollup-linux-arm-gnueabihf": 1591 - optional: true 1592 - "@rollup/rollup-linux-arm-musleabihf": 1593 - optional: true 1594 - "@rollup/rollup-linux-arm64-gnu": 1595 - optional: true 1596 - "@rollup/rollup-linux-arm64-musl": 1597 - optional: true 1598 - "@rollup/rollup-linux-loong64-gnu": 1599 - optional: true 1600 - "@rollup/rollup-linux-ppc64-gnu": 1601 - optional: true 1602 - "@rollup/rollup-linux-riscv64-gnu": 1603 - optional: true 1604 - "@rollup/rollup-linux-riscv64-musl": 1605 - optional: true 1606 - "@rollup/rollup-linux-s390x-gnu": 1607 - optional: true 1608 - "@rollup/rollup-linux-x64-gnu": 1609 - optional: true 1610 - "@rollup/rollup-linux-x64-musl": 1611 - optional: true 1612 - "@rollup/rollup-openharmony-arm64": 1613 - optional: true 1614 - "@rollup/rollup-win32-arm64-msvc": 1615 - optional: true 1616 - "@rollup/rollup-win32-ia32-msvc": 1617 - optional: true 1618 - "@rollup/rollup-win32-x64-gnu": 1619 - optional: true 1620 - "@rollup/rollup-win32-x64-msvc": 1621 - optional: true 1622 - fsevents: 1623 - optional: true 1624 - bin: 1625 - rollup: dist/bin/rollup 1626 - checksum: 10c0/427216da71c1ce7fefb0bef75f94c301afd858ac27e35898e098c2da5977325fa54c2edda867caf9675c8abfa8d8d94efa99c482fa04f5cd91f3a740112d4f4f 1627 - languageName: node 1628 - linkType: hard 1629 - 1630 - "safer-buffer@npm:>= 2.1.2 < 3.0.0": 1631 - version: 2.1.2 1632 - resolution: "safer-buffer@npm:2.1.2" 1633 - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 1634 - languageName: node 1635 - linkType: hard 1636 - 1637 - "scheduler@npm:^0.27.0": 1638 - version: 0.27.0 1639 - resolution: "scheduler@npm:0.27.0" 1640 - checksum: 10c0/4f03048cb05a3c8fddc45813052251eca00688f413a3cee236d984a161da28db28ba71bd11e7a3dd02f7af84ab28d39fb311431d3b3772fed557945beb00c452 1641 - languageName: node 1642 - linkType: hard 1643 - 1644 - "semver@npm:^6.3.1": 1645 - version: 6.3.1 1646 - resolution: "semver@npm:6.3.1" 1647 - bin: 1648 - semver: bin/semver.js 1649 - checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d 1650 - languageName: node 1651 - linkType: hard 1652 - 1653 - "semver@npm:^7.3.5": 1654 - version: 7.7.3 1655 - resolution: "semver@npm:7.7.3" 1656 - bin: 1657 - semver: bin/semver.js 1658 - checksum: 10c0/4afe5c986567db82f44c8c6faef8fe9df2a9b1d98098fc1721f57c696c4c21cebd572f297fc21002f81889492345b8470473bc6f4aff5fb032a6ea59ea2bc45e 1659 - languageName: node 1660 - linkType: hard 1661 - 1662 - "smart-buffer@npm:^4.2.0": 1663 - version: 4.2.0 1664 - resolution: "smart-buffer@npm:4.2.0" 1665 - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 1666 - languageName: node 1667 - linkType: hard 1668 - 1669 - "snarkdown@npm:^2.0.0": 1670 - version: 2.0.0 1671 - resolution: "snarkdown@npm:2.0.0" 1672 - checksum: 10c0/2e1645924041f0a69804b2d0eac3eef0403d1d769da374c73102f1f8a401401990c79e6dd1ee0ea302585ecea232e358c11134781b389b0afffb987f4db5b36d 1673 - languageName: node 1674 - linkType: hard 1675 - 1676 - "socks-proxy-agent@npm:^8.0.3": 1677 - version: 8.0.5 1678 - resolution: "socks-proxy-agent@npm:8.0.5" 1679 - dependencies: 1680 - agent-base: "npm:^7.1.2" 1681 - debug: "npm:^4.3.4" 1682 - socks: "npm:^2.8.3" 1683 - checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 1684 - languageName: node 1685 - linkType: hard 1686 - 1687 - "socks@npm:^2.8.3": 1688 - version: 2.8.7 1689 - resolution: "socks@npm:2.8.7" 1690 - dependencies: 1691 - ip-address: "npm:^10.0.1" 1692 - smart-buffer: "npm:^4.2.0" 1693 - checksum: 10c0/2805a43a1c4bcf9ebf6e018268d87b32b32b06fbbc1f9282573583acc155860dc361500f89c73bfbb157caa1b4ac78059eac0ef15d1811eb0ca75e0bdadbc9d2 1694 - languageName: node 1695 - linkType: hard 1696 - 1697 - "source-map-js@npm:^1.2.1": 1698 - version: 1.2.1 1699 - resolution: "source-map-js@npm:1.2.1" 1700 - checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf 1701 - languageName: node 1702 - linkType: hard 1703 - 1704 - "ssri@npm:^13.0.0": 1705 - version: 13.0.0 1706 - resolution: "ssri@npm:13.0.0" 1707 - dependencies: 1708 - minipass: "npm:^7.0.3" 1709 - checksum: 10c0/405f3a531cd98b013cecb355d63555dca42fd12c7bc6671738aaa9a82882ff41cdf0ef9a2b734ca4f9a760338f114c29d01d9238a65db3ccac27929bd6e6d4b2 1710 - languageName: node 1711 - linkType: hard 1712 - 1713 - "tar@npm:^7.5.4": 1714 - version: 7.5.7 1715 - resolution: "tar@npm:7.5.7" 1716 - dependencies: 1717 - "@isaacs/fs-minipass": "npm:^4.0.0" 1718 - chownr: "npm:^3.0.0" 1719 - minipass: "npm:^7.1.2" 1720 - minizlib: "npm:^3.1.0" 1721 - yallist: "npm:^5.0.0" 1722 - checksum: 10c0/51f261afc437e1112c3e7919478d6176ea83f7f7727864d8c2cce10f0b03a631d1911644a567348c3063c45abdae39718ba97abb073d22aa3538b9a53ae1e31c 1723 - languageName: node 1724 - linkType: hard 1725 - 1726 - "tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15": 1727 - version: 0.2.15 1728 - resolution: "tinyglobby@npm:0.2.15" 1729 - dependencies: 1730 - fdir: "npm:^6.5.0" 1731 - picomatch: "npm:^4.0.3" 1732 - checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 1733 - languageName: node 1734 - linkType: hard 1735 - 1736 - "typescript@npm:~5.8.3": 1737 - version: 5.8.3 1738 - resolution: "typescript@npm:5.8.3" 1739 - bin: 1740 - tsc: bin/tsc 1741 - tsserver: bin/tsserver 1742 - checksum: 10c0/5f8bb01196e542e64d44db3d16ee0e4063ce4f3e3966df6005f2588e86d91c03e1fb131c2581baf0fb65ee79669eea6e161cd448178986587e9f6844446dbb48 1743 - languageName: node 1744 - linkType: hard 1745 - 1746 - "typescript@patch:typescript@npm%3A~5.8.3#optional!builtin<compat/typescript>": 1747 - version: 5.8.3 1748 - resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin<compat/typescript>::version=5.8.3&hash=5786d5" 1749 - bin: 1750 - tsc: bin/tsc 1751 - tsserver: bin/tsserver 1752 - checksum: 10c0/39117e346ff8ebd87ae1510b3a77d5d92dae5a89bde588c747d25da5c146603a99c8ee588c7ef80faaf123d89ed46f6dbd918d534d641083177d5fac38b8a1cb 1753 - languageName: node 1754 - linkType: hard 1755 - 1756 - "unique-filename@npm:^5.0.0": 1757 - version: 5.0.0 1758 - resolution: "unique-filename@npm:5.0.0" 547 + update-browserslist-db@^1.1.4: 548 + version "1.1.4" 549 + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz" 550 + integrity sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A== 1759 551 dependencies: 1760 - unique-slug: "npm:^6.0.0" 1761 - checksum: 10c0/afb897e9cf4c2fb622ea716f7c2bb462001928fc5f437972213afdf1cc32101a230c0f1e9d96fc91ee5185eca0f2feb34127145874975f347be52eb91d6ccc2c 1762 - languageName: node 1763 - linkType: hard 552 + escalade "^3.2.0" 553 + picocolors "^1.1.1" 1764 554 1765 - "unique-slug@npm:^6.0.0": 1766 - version: 6.0.0 1767 - resolution: "unique-slug@npm:6.0.0" 555 + "vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", vite@^7.0.4: 556 + version "7.2.2" 557 + resolved "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz" 558 + integrity sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ== 1768 559 dependencies: 1769 - imurmurhash: "npm:^0.1.4" 1770 - checksum: 10c0/da7ade4cb04eb33ad0499861f82fe95ce9c7c878b7139dc54d140ecfb6a6541c18a5c8dac16188b8b379fe62c0c1f1b710814baac910cde5f4fec06212126c6a 1771 - languageName: node 1772 - linkType: hard 1773 - 1774 - "update-browserslist-db@npm:^1.1.4": 1775 - version: 1.1.4 1776 - resolution: "update-browserslist-db@npm:1.1.4" 1777 - dependencies: 1778 - escalade: "npm:^3.2.0" 1779 - picocolors: "npm:^1.1.1" 1780 - peerDependencies: 1781 - browserslist: ">= 4.21.0" 1782 - bin: 1783 - update-browserslist-db: cli.js 1784 - checksum: 10c0/db0c9aaecf1258a6acda5e937fc27a7996ccca7a7580a1b4aa8bba6a9b0e283e5e65c49ebbd74ec29288ef083f1b88d4da13e3d4d326c1e5fc55bf72d7390702 1785 - languageName: node 1786 - linkType: hard 560 + esbuild "^0.25.0" 561 + fdir "^6.5.0" 562 + picomatch "^4.0.3" 563 + postcss "^8.5.6" 564 + rollup "^4.43.0" 565 + tinyglobby "^0.2.15" 566 + optionalDependencies: 567 + fsevents "~2.3.3" 1787 568 1788 - "vite@npm:^7.0.4": 1789 - version: 7.2.2 1790 - resolution: "vite@npm:7.2.2" 1791 - dependencies: 1792 - esbuild: "npm:^0.25.0" 1793 - fdir: "npm:^6.5.0" 1794 - fsevents: "npm:~2.3.3" 1795 - picomatch: "npm:^4.0.3" 1796 - postcss: "npm:^8.5.6" 1797 - rollup: "npm:^4.43.0" 1798 - tinyglobby: "npm:^0.2.15" 1799 - peerDependencies: 1800 - "@types/node": ^20.19.0 || >=22.12.0 1801 - jiti: ">=1.21.0" 1802 - less: ^4.0.0 1803 - lightningcss: ^1.21.0 1804 - sass: ^1.70.0 1805 - sass-embedded: ^1.70.0 1806 - stylus: ">=0.54.8" 1807 - sugarss: ^5.0.0 1808 - terser: ^5.16.0 1809 - tsx: ^4.8.1 1810 - yaml: ^2.4.2 1811 - dependenciesMeta: 1812 - fsevents: 1813 - optional: true 1814 - peerDependenciesMeta: 1815 - "@types/node": 1816 - optional: true 1817 - jiti: 1818 - optional: true 1819 - less: 1820 - optional: true 1821 - lightningcss: 1822 - optional: true 1823 - sass: 1824 - optional: true 1825 - sass-embedded: 1826 - optional: true 1827 - stylus: 1828 - optional: true 1829 - sugarss: 1830 - optional: true 1831 - terser: 1832 - optional: true 1833 - tsx: 1834 - optional: true 1835 - yaml: 1836 - optional: true 1837 - bin: 1838 - vite: bin/vite.js 1839 - checksum: 10c0/9c76ee441f8dbec645ddaecc28d1f9cf35670ffa91cff69af7b1d5081545331603f0b1289d437b2fa8dc43cdc77b4d96b5bd9c9aed66310f490cb1a06f9c814c 1840 - languageName: node 1841 - linkType: hard 1842 - 1843 - "which@npm:^6.0.0": 1844 - version: 6.0.0 1845 - resolution: "which@npm:6.0.0" 1846 - dependencies: 1847 - isexe: "npm:^3.1.1" 1848 - bin: 1849 - node-which: bin/which.js 1850 - checksum: 10c0/fe9d6463fe44a76232bb6e3b3181922c87510a5b250a98f1e43a69c99c079b3f42ddeca7e03d3e5f2241bf2d334f5a7657cfa868b97c109f3870625842f4cc15 1851 - languageName: node 1852 - linkType: hard 1853 - 1854 - "yallist@npm:^3.0.2": 1855 - version: 3.1.1 1856 - resolution: "yallist@npm:3.1.1" 1857 - checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 1858 - languageName: node 1859 - linkType: hard 1860 - 1861 - "yallist@npm:^4.0.0": 1862 - version: 4.0.0 1863 - resolution: "yallist@npm:4.0.0" 1864 - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a 1865 - languageName: node 1866 - linkType: hard 1867 - 1868 - "yallist@npm:^5.0.0": 1869 - version: 5.0.0 1870 - resolution: "yallist@npm:5.0.0" 1871 - checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 1872 - languageName: node 1873 - linkType: hard 569 + yallist@^3.0.2: 570 + version "3.1.1" 571 + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" 572 + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+1
package.json
··· 77 77 "mobile:ios:sim:status": "DEVICE_ID=$(xcrun simctl list devices booted -j | grep -oE '[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}' | head -1); APP_GROUP=$(grep -rl peek-mobile \"$HOME/Library/Developer/CoreSimulator/Devices/$DEVICE_ID/data/Containers/Shared/AppGroup/\"*/.com.apple.mobile_container_manager.metadata.plist 2>/dev/null | head -1 | xargs dirname); echo \"AppGroup: $APP_GROUP\"; echo '=== profiles.json ==='; cat \"$APP_GROUP/profiles.json\" 2>/dev/null || echo '(not found)'; echo ''; echo '=== Databases ==='; ls -la \"$APP_GROUP/\"*.db 2>/dev/null || echo '(none)'", 78 78 "mobile:ios:sim:build-fresh": "yarn mobile:ios:xcodebuild:full && yarn mobile:ios:sim:fresh", 79 79 "mobile:ios:test": "cd backend/tauri-mobile && ./dev-setup.sh", 80 + "mobile:both:dev": "cd backend/tauri-mobile && npm run dev:both", 80 81 "mobile:android:init": "cd backend/tauri-mobile/src-tauri && cargo tauri android init", 81 82 "mobile:android:dev": "cd backend/tauri-mobile/src-tauri && cargo tauri android dev", 82 83 "mobile:android:build": "cd backend/tauri-mobile/src-tauri && cargo tauri android build",