diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 000000000..cede2a17c --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,69 @@ +name: Deploy VitePress site to GitHub Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: + - master + paths: + - 'docs/**' + - '.github/workflows/deploy-docs.yml' + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Not needed if lastUpdated is not enabled + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: docs/package-lock.json + + - name: Setup Pages + uses: actions/configure-pages@v4 + + - name: Install dependencies + run: cd docs && npm ci + + - name: Build with VitePress + run: cd docs && npm run docs:build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: docs/.vitepress/dist + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + name: Deploy + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.maestro/README.md b/.maestro/README.md new file mode 100644 index 000000000..626fb9711 --- /dev/null +++ b/.maestro/README.md @@ -0,0 +1,133 @@ +# Maestro Test Flows for Screenshot Generation + +This directory contains Maestro test flows for automatically generating screenshots of the apps for documentation purposes. + +## About Maestro + +[Maestro](https://maestro.mobile.dev/) is a mobile UI testing framework that allows you to automate app interactions and capture screenshots. + +## Installation + +Install Maestro: + +```bash +# On macOS or Linux +curl -Ls "https://get.maestro.mobile.dev" | bash + +# On Windows +powershell -c "iwr https://get.maestro.mobile.dev/win | iex" +``` + +## Available Flows + +### Document Scanner + +- `screenshot_document_scanner_main.yaml` - Captures the main document list screen +- `screenshot_document_scanner_camera.yaml` - Captures the camera scanning view +- `screenshot_document_scanner_detail.yaml` - Captures a document detail view + +### Card Wallet + +- `screenshot_card_wallet_main.yaml` - Captures the main card list screen +- `screenshot_card_wallet_camera.yaml` - Captures the camera scanning view for cards +- `screenshot_card_wallet_detail.yaml` - Captures a card detail view with barcode + +## Usage + +### Prerequisites + +1. Build and install the app on a connected device or emulator +2. Ensure Maestro is installed +3. Ensure the device/emulator is running + +### Running Flows + +To run a single flow: + +```bash +# For Document Scanner +maestro test .maestro/screenshot_document_scanner_main.yaml + +# For Card Wallet +maestro test .maestro/screenshot_card_wallet_main.yaml +``` + +To run all flows for an app: + +```bash +# Document Scanner flows +maestro test .maestro/screenshot_document_scanner_*.yaml + +# Card Wallet flows +maestro test .maestro/screenshot_card_wallet_*.yaml +``` + +### Capturing Screenshots + +Screenshots are automatically saved by Maestro. By default, they are stored in: +- `~/.maestro/tests//screenshots/` + +To specify a custom output directory: + +```bash +maestro test --output /path/to/output .maestro/screenshot_document_scanner_main.yaml +``` + +### Updating Documentation Screenshots + +After running the flows and capturing screenshots: + +1. Review the generated screenshots +2. Copy the desired screenshots to the documentation: + ```bash + # For Document Scanner + cp ~/.maestro/tests//screenshots/*.png docs/public/scanner-images/phoneScreenshots/ + + # For Card Wallet + cp ~/.maestro/tests//screenshots/*.png docs/public/wallet-images/phoneScreenshots/ + ``` +3. Update the image references in the documentation if needed + +## Customizing Flows + +You can customize the flows to capture different screens or interactions: + +1. Edit the YAML files +2. Use Maestro's [flow reference](https://maestro.mobile.dev/api-reference/commands) for available commands +3. Test the modified flows + +## Tips + +- Ensure the app has sample data for better screenshots +- Use a clean device/emulator state for consistent results +- Consider different screen sizes and orientations +- Test flows on both Android and iOS + +## Troubleshooting + +### Flow fails to find elements + +- Check the element IDs in the app code +- Use Maestro Studio for interactive debugging: `maestro studio` +- Add longer timeouts if the app is slow to load + +### Screenshots are blank or incomplete + +- Increase `waitForAnimationToEnd` timeouts +- Ensure the device screen is unlocked +- Check device/emulator display settings + +### Camera permission issues + +- Grant camera permissions manually before running flows +- Add permission grant commands to the flow if needed + +## CI/CD Integration + +These flows can be integrated into CI/CD pipelines to automatically generate screenshots for different app versions or languages. See the GitHub Actions workflow in `.github/workflows/` for an example. + +## Resources + +- [Maestro Documentation](https://maestro.mobile.dev/) +- [Maestro Flow Reference](https://maestro.mobile.dev/api-reference/commands) +- [Maestro Studio](https://maestro.mobile.dev/getting-started/maestro-studio) diff --git a/.maestro/screenshot_card_wallet_camera.yaml b/.maestro/screenshot_card_wallet_camera.yaml new file mode 100644 index 000000000..328866fa2 --- /dev/null +++ b/.maestro/screenshot_card_wallet_camera.yaml @@ -0,0 +1,26 @@ +appId: com.akylas.cardwallet +--- +# Card Wallet - Camera View Screenshot +# This flow captures the camera scanning screen for cards + +- launchApp +- waitForAnimationToEnd + +# Wait for the app to load +- waitForAnimationToEnd: + timeout: 3000 + +# Tap the camera button to open camera +- tapOn: + id: ".*camera.*" + timeout: 5000 + +# Wait for camera to initialize +- waitForAnimationToEnd: + timeout: 3000 + +# Take screenshot of camera view +- takeScreenshot: screenshot_card_wallet_camera + +# Go back to main screen +- back diff --git a/.maestro/screenshot_card_wallet_detail.yaml b/.maestro/screenshot_card_wallet_detail.yaml new file mode 100644 index 000000000..de0b1f914 --- /dev/null +++ b/.maestro/screenshot_card_wallet_detail.yaml @@ -0,0 +1,28 @@ +appId: com.akylas.cardwallet +--- +# Card Wallet - Card Detail Screenshot +# This flow captures a card detail view with barcode + +- launchApp +- waitForAnimationToEnd + +# Wait for the app to load +- waitForAnimationToEnd: + timeout: 3000 + +# Tap on the first card (if exists) +- tapOn: + id: ".*card.*" + index: 0 + optional: true + timeout: 5000 + +# Wait for card to open +- waitForAnimationToEnd: + timeout: 2000 + +# Take screenshot of card view +- takeScreenshot: screenshot_card_wallet_detail + +# Go back to main screen +- back diff --git a/.maestro/screenshot_card_wallet_main.yaml b/.maestro/screenshot_card_wallet_main.yaml new file mode 100644 index 000000000..37ad28b11 --- /dev/null +++ b/.maestro/screenshot_card_wallet_main.yaml @@ -0,0 +1,17 @@ +appId: com.akylas.cardwallet +--- +# Card Wallet - Main Screen Screenshot +# This flow captures the main card list screen + +- launchApp +- waitForAnimationToEnd + +# Wait for the app to fully load +- waitForAnimationToEnd: + timeout: 5000 + +# Take screenshot of main screen +- takeScreenshot: screenshot_card_wallet_main + +# Optional: Ensure we're on the main screen +- assertVisible: "Cards" diff --git a/.maestro/screenshot_document_scanner_camera.yaml b/.maestro/screenshot_document_scanner_camera.yaml new file mode 100644 index 000000000..953166a85 --- /dev/null +++ b/.maestro/screenshot_document_scanner_camera.yaml @@ -0,0 +1,26 @@ +appId: com.akylas.documentscanner +--- +# Document Scanner - Camera View Screenshot +# This flow captures the camera scanning screen + +- launchApp +- waitForAnimationToEnd + +# Wait for the app to load +- waitForAnimationToEnd: + timeout: 3000 + +# Tap the camera button to open camera +- tapOn: + id: ".*camera.*" + timeout: 5000 + +# Wait for camera to initialize +- waitForAnimationToEnd: + timeout: 3000 + +# Take screenshot of camera view +- takeScreenshot: screenshot_document_scanner_camera + +# Go back to main screen +- back diff --git a/.maestro/screenshot_document_scanner_detail.yaml b/.maestro/screenshot_document_scanner_detail.yaml new file mode 100644 index 000000000..805b270f3 --- /dev/null +++ b/.maestro/screenshot_document_scanner_detail.yaml @@ -0,0 +1,28 @@ +appId: com.akylas.documentscanner +--- +# Document Scanner - Document View Screenshot +# This flow captures a document detail view + +- launchApp +- waitForAnimationToEnd + +# Wait for the app to load +- waitForAnimationToEnd: + timeout: 3000 + +# Tap on the first document (if exists) +- tapOn: + id: ".*document.*" + index: 0 + optional: true + timeout: 5000 + +# Wait for document to open +- waitForAnimationToEnd: + timeout: 2000 + +# Take screenshot of document view +- takeScreenshot: screenshot_document_scanner_detail + +# Go back to main screen +- back diff --git a/.maestro/screenshot_document_scanner_main.yaml b/.maestro/screenshot_document_scanner_main.yaml new file mode 100644 index 000000000..8872fc518 --- /dev/null +++ b/.maestro/screenshot_document_scanner_main.yaml @@ -0,0 +1,17 @@ +appId: com.akylas.documentscanner +--- +# Document Scanner - Main Screen Screenshot +# This flow captures the main document list screen + +- launchApp +- waitForAnimationToEnd + +# Wait for the app to fully load +- waitForAnimationToEnd: + timeout: 5000 + +# Take screenshot of main screen +- takeScreenshot: screenshot_document_scanner_main + +# Optional: Ensure we're on the main screen +- assertVisible: "Documents" diff --git a/Readme.md b/Readme.md index ac93619e0..d4679a7b6 100644 --- a/Readme.md +++ b/Readme.md @@ -17,6 +17,12 @@ This repository is now the home of 2 apps [![Small translation badge](https://hosted.weblate.org/widgets/oss-document-scanner/-/svg-badge.svg)](https://hosted.weblate.org/engage/oss-document-scanner/?utm_source=widget) +## ๐Ÿ“š Documentation + +For detailed information about the apps, features, and usage guides, visit our documentation website: + +๐ŸŒ **[https://akylas.github.io/OSS-DocumentScanner/](https://akylas.github.io/OSS-DocumentScanner/)** + ## Installation diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..75871b314 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,16 @@ +node_modules +.vitepress/dist +.vitepress/cache +.DS_Store +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 000000000..4e2ebf6f6 --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,58 @@ +import { defineConfig } from 'vitepress' + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: "OSS Document Scanner & Card Wallet", + description: "Open Source Document Scanner and Card Wallet Apps", + base: '/OSS-DocumentScanner/', + + themeConfig: { + logo: '/icon.png', + + nav: [ + { text: 'Home', link: '/' }, + { text: 'Document Scanner', link: '/document-scanner/' }, + { text: 'Card Wallet', link: '/card-wallet/' }, + { text: 'Download', link: '/download' }, + { text: 'Support', link: '/support' } + ], + + sidebar: { + '/document-scanner/': [ + { + text: 'Document Scanner', + items: [ + { text: 'Overview', link: '/document-scanner/' }, + { text: 'Features', link: '/document-scanner/features' }, + { text: 'Getting Started', link: '/document-scanner/getting-started' }, + { text: 'Screenshots', link: '/document-scanner/screenshots' } + ] + } + ], + '/card-wallet/': [ + { + text: 'Card Wallet', + items: [ + { text: 'Overview', link: '/card-wallet/' }, + { text: 'Features', link: '/card-wallet/features' }, + { text: 'Getting Started', link: '/card-wallet/getting-started' }, + { text: 'Screenshots', link: '/card-wallet/screenshots' } + ] + } + ] + }, + + socialLinks: [ + { icon: 'github', link: 'https://github.com/Akylas/OSS-DocumentScanner' } + ], + + footer: { + message: 'Released under the MIT License.', + copyright: 'Copyright ยฉ 2024-present Akylas' + } + }, + + head: [ + ['link', { rel: 'icon', type: 'image/png', href: '/OSS-DocumentScanner/icon.png' }] + ] +}) diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..46d2c1abb --- /dev/null +++ b/docs/README.md @@ -0,0 +1,229 @@ +# OSS Document Scanner & Card Wallet - Documentation Website + +This directory contains the official documentation website for OSS Document Scanner and OSS Card Wallet, built with [VitePress](https://vitepress.dev/). + +## ๐ŸŒ Website + +The website is hosted at: [https://akylas.github.io/OSS-DocumentScanner/](https://akylas.github.io/OSS-DocumentScanner/) + +## ๐Ÿ“ Structure + +``` +docs/ +โ”œโ”€โ”€ .vitepress/ +โ”‚ โ”œโ”€โ”€ config.mts # VitePress configuration +โ”‚ โ””โ”€โ”€ dist/ # Build output (generated) +โ”œโ”€โ”€ public/ # Static assets +โ”‚ โ”œโ”€โ”€ icon.png # App icons +โ”‚ โ”œโ”€โ”€ scanner-images/ # Document Scanner screenshots +โ”‚ โ””โ”€โ”€ wallet-images/ # Card Wallet screenshots +โ”œโ”€โ”€ document-scanner/ # Document Scanner documentation +โ”‚ โ”œโ”€โ”€ index.md +โ”‚ โ”œโ”€โ”€ features.md +โ”‚ โ”œโ”€โ”€ getting-started.md +โ”‚ โ””โ”€โ”€ screenshots.md +โ”œโ”€โ”€ card-wallet/ # Card Wallet documentation +โ”‚ โ”œโ”€โ”€ index.md +โ”‚ โ”œโ”€โ”€ features.md +โ”‚ โ”œโ”€โ”€ getting-started.md +โ”‚ โ””โ”€โ”€ screenshots.md +โ”œโ”€โ”€ index.md # Homepage +โ”œโ”€โ”€ download.md # Download page +โ”œโ”€โ”€ support.md # Support & donation page +โ””โ”€โ”€ package.json +``` + +## ๐Ÿš€ Development + +### Prerequisites + +- Node.js 18+ +- npm or yarn + +### Setup + +```bash +cd docs +npm install +``` + +### Development Server + +Start the local development server: + +```bash +npm run docs:dev +``` + +The site will be available at `http://localhost:5173/OSS-DocumentScanner/` + +### Build + +Build the static site: + +```bash +npm run docs:build +``` + +The built site will be in `.vitepress/dist/` + +### Preview Build + +Preview the built site locally: + +```bash +npm run docs:preview +``` + +## ๐Ÿ“ Content Guidelines + +### Adding New Pages + +1. Create a new `.md` file in the appropriate directory +2. Add front matter if needed +3. Update the sidebar in `.vitepress/config.mts` +4. Write content in Markdown + +### Using Images + +Images are sourced from: +- Root directory badges and icons +- `fastlane/metadata/` for app store images +- These are copied to `public/` directory + +To update images: +```bash +# Copy from root +cp ../icon.png public/ + +# Copy from fastlane +cp -r ../fastlane/metadata/com.akylas.documentscanner/android/en-US/images public/scanner-images/ +cp -r ../fastlane/metadata/com.akylas.cardwallet/android/en-US/images public/wallet-images/ +``` + +### Markdown Features + +VitePress supports: +- Standard Markdown +- GitHub Flavored Markdown +- Custom containers +- Code highlighting +- Vue components in Markdown + +See [VitePress Markdown Guide](https://vitepress.dev/guide/markdown) for details. + +## ๐Ÿšข Deployment + +The site is automatically deployed to GitHub Pages when changes are pushed to the `master` branch. + +### GitHub Actions Workflow + +The deployment workflow: +1. Triggers on push to `master` (for `docs/**` changes) +2. Builds the VitePress site +3. Deploys to GitHub Pages + +See `.github/workflows/deploy-docs.yml` for configuration. + +### Manual Deployment + +You can also trigger deployment manually: +1. Go to Actions tab on GitHub +2. Select "Deploy VitePress site to GitHub Pages" +3. Click "Run workflow" + +## ๐ŸŽจ Customization + +### Theme Configuration + +Edit `.vitepress/config.mts` to customize: +- Site title and description +- Navigation menu +- Sidebar structure +- Footer +- Social links +- Logo and icons + +### Styling + +Custom CSS can be added in `.vitepress/theme/` directory. See [VitePress Theme Guide](https://vitepress.dev/guide/custom-theme) for details. + +## ๐Ÿ“ธ Screenshots + +Screenshots are managed in two ways: + +1. **Manual**: Place screenshots in `public/scanner-images/` and `public/wallet-images/` +2. **Automated**: Use Maestro scripts in `../.maestro/` directory + +### Updating Screenshots with Maestro + +```bash +# Run Maestro flows +cd .. +maestro test .maestro/screenshot_document_scanner_main.yaml + +# Copy generated screenshots +cp ~/.maestro/tests//screenshots/*.png docs/public/scanner-images/phoneScreenshots/ +``` + +See `../.maestro/README.md` for detailed instructions. + +## ๐Ÿ”— Links and Badges + +The site uses badges and links from: +- GitHub repository stats (stars, downloads, releases) +- Play Store and App Store badges +- Weblate translation status +- Sponsor graphics + +These are automatically updated as they reference external URLs. + +## ๐ŸŒ Internationalization + +Currently, the documentation is in English. To add more languages: + +1. Create language directories (e.g., `fr/`, `de/`) +2. Translate content files +3. Update config for i18n +4. See [VitePress i18n Guide](https://vitepress.dev/guide/i18n) + +## ๐Ÿ› Troubleshooting + +### Build Warnings + +The TypeScript config warning can be ignored - it's related to the parent project's config. + +### Port Already in Use + +If port 5173 is in use: +```bash +npm run docs:dev -- --port 5174 +``` + +### Images Not Loading + +Ensure: +- Images are in `public/` directory +- Paths start with `/` (e.g., `/icon.png`) +- Base URL is configured in config.mts + +## ๐Ÿ“š Resources + +- [VitePress Documentation](https://vitepress.dev/) +- [Markdown Guide](https://www.markdownguide.org/) +- [GitHub Pages](https://pages.github.com/) +- [Maestro Mobile Testing](https://maestro.mobile.dev/) + +## ๐Ÿค Contributing + +To contribute to the documentation: + +1. Fork the repository +2. Create a feature branch +3. Make your changes in the `docs/` directory +4. Test locally with `npm run docs:dev` +5. Submit a pull request + +## ๐Ÿ“„ License + +The documentation is part of the OSS-DocumentScanner repository and is released under the MIT License. diff --git a/docs/card-wallet/features.md b/docs/card-wallet/features.md new file mode 100644 index 000000000..02714f249 --- /dev/null +++ b/docs/card-wallet/features.md @@ -0,0 +1,213 @@ +# Features + +OSS Card Wallet provides everything you need to digitize and manage your physical cards. + +## Card Scanning + +### Camera Scanning +- **Real-time Detection**: Automatic card boundary detection +- **Barcode Recognition**: Instantly detect and extract barcodes/QR codes +- **Auto-crop**: Automatically crop and straighten cards +- **Manual Capture**: Full manual control when needed + +### Card Import +- Import from photo library +- Support for various image formats +- Bulk import multiple cards +- Import from other apps + +## Barcode Support + +### Automatic Detection +The app supports various barcode and QR code formats: +- **QR Codes**: Full QR code support +- **EAN/UPC**: Standard product barcodes +- **Code 128**: Common in retail +- **Code 39**: Industrial and logistics +- **PDF417**: Driver licenses, boarding passes +- **Data Matrix**: Small items encoding +- **And many more**: Comprehensive barcode support + +### Manual Entry +- Create cards without scanning +- Add barcodes manually by typing +- Generate QR codes from text +- Edit existing barcodes + +### Barcode Options +- Force white background for QR codes (better readability for some scanners) +- Adjust barcode size and display +- Full-screen barcode view +- Brightness boost for scanning in low light + +## Card Management + +### Organization +- Create folders for different card types +- Rename cards and folders +- Search cards by name or content +- Sort by name, date, or custom order +- Add extra fields to cards for additional information + +### Extra Fields +Create custom fields for your cards: +- Card numbers +- Expiration dates +- Phone numbers +- Notes and descriptions +- Any custom data you need + +### Quick Access +- **Recent Cards**: Recently used cards appear first +- **Shortcuts**: Create device shortcuts for specific cards +- **Favorites**: Mark cards as favorites for quick access +- **Search**: Quick search through all cards + +## OCR & Text Recognition + +Extract text from your cards: +- Automatic text detection +- Copy text to clipboard +- Search within extracted text +- Store card details from OCR + +**Use Cases:** +- Extract card numbers +- Store cardholder names +- Capture expiration dates +- Any text on the card + +## Display & Sharing + +### Barcode Display +- **Full-screen Mode**: Maximum brightness for easy scanning +- **Quick Display**: One-tap access to barcode +- **Multiple Formats**: Display in various sizes +- **White Background**: Optional for better contrast + +### Export Options +- **PDF Export**: Single or multiple cards +- **Image Export**: Export as JPEG or PNG +- **Batch Export**: Export many cards at once +- **Print**: Direct printing support + +### Sharing +- Share via email, messaging apps +- Send to cloud storage +- Share with other card wallet apps +- Export for backup + +## Security & Privacy + +### Biometric Protection +- Fingerprint authentication +- Face unlock (on supported devices) +- PIN code fallback +- Auto-lock after inactivity + +### Data Security +- **Local Storage**: All data on your device by default +- **Encrypted Storage**: Optional encryption +- **No Cloud Required**: Works fully offline +- **Optional WebDAV Sync**: Your choice of cloud storage + +### Privacy +- **No Tracking**: Zero analytics or tracking +- **No Ads**: Completely ad-free +- **Open Source**: Fully transparent code +- **No Account Required**: Use immediately, no signup + +## Synchronization + +### WebDAV Support +Sync your cards across devices: +- **Nextcloud**: Full integration +- **ownCloud**: Compatible +- **Generic WebDAV**: Any WebDAV server + +### Sync Features +- Automatic background sync +- Conflict resolution +- Sync status indicators +- Manual sync trigger +- Selective sync options + +## Customization + +### Display Settings +- **View Style**: Grid or list view +- **Card Size**: Adjust preview size +- **Theme**: Light and dark mode +- **Layout**: Customize card display + +### Card Settings +- **Image Format**: JPEG or PNG +- **Image Quality**: Compression settings +- **Default Folder**: Set save location +- **Naming Format**: Customize card names + +### Barcode Settings +- White background option +- Barcode size threshold +- Display brightness +- Default barcode type + +## Advanced Features + +### PKPass Support +- Import Apple Wallet passes +- Extract pass data +- Display pass barcodes +- Maintain pass metadata + +### Card Creation +- Create cards from name and barcode alone (no image needed) +- Generate QR codes from text +- Batch card creation +- Template-based creation + +### Batch Operations +- Select multiple cards +- Apply actions to selection +- Bulk export/delete +- Folder operations + +### Integration +- System intents for card sharing +- Widget support (where available) +- Shortcuts integration +- Deep linking + +## Image Editing + +### Enhancement Tools +- **Crop & Rotate**: Adjust card boundaries +- **Filters**: Color, grayscale, black & white +- **Brightness/Contrast**: Fine-tune appearance +- **Perspective Correction**: Fix card angles + +### Quality Options +- Adjustable image compression +- Format selection (JPEG/PNG) +- Resolution settings +- Storage optimization + +## Additional Features + +### Multi-page Cards +- Store front and back of cards +- Multiple barcode support +- Page navigation +- Synchronized display + +### Barcode Verification +- Test barcode readability +- Preview before saving +- Quality check +- Format validation + +### Data Import/Export +- Backup all cards +- Restore from backup +- Migration tools +- Cross-platform support diff --git a/docs/card-wallet/getting-started.md b/docs/card-wallet/getting-started.md new file mode 100644 index 000000000..dbd9ff6f7 --- /dev/null +++ b/docs/card-wallet/getting-started.md @@ -0,0 +1,371 @@ +# Getting Started with OSS Card Wallet + +This guide will help you get started with OSS Card Wallet and digitize your physical cards. + +## Installation + +### From App Stores + +1. **Android**: Download from [Google Play Store](https://play.google.com/store/apps/details?id=com.akylas.cardwallet) or [IzzyOnDroid](https://apt.izzysoft.de/packages/com.akylas.cardwallet) +2. **iOS**: Download from [Apple App Store](https://apps.apple.com/app/oss-cardwallet/id6504414362) +3. **Direct APK**: Download from [GitHub Releases](https://github.com/Akylas/OSS-DocumentScanner/releases) + +### First Launch + +When you first open the app, you'll see an empty card list. The app is ready to use immediately - no registration required! + +## Scanning Your First Card + +### Using Camera + +1. Tap the **camera button** (usually at the bottom right) +2. Point your camera at a card +3. The app will automatically detect: + - Card boundaries + - Barcodes and QR codes +4. Once detected, tap capture or wait for auto-capture +5. Review the detected information +6. Add a name for your card +7. Tap **Save** + +**Tips:** +- Ensure good lighting +- Place card on a flat surface +- Keep the barcode clearly visible +- Use a contrasting background for best results + +### Manual Barcode Entry + +You can create a card without scanning: + +1. Tap **menu** โ†’ **New Card** +2. Select **Manual Entry** +3. Enter card name +4. Choose barcode type (QR, EAN, Code 128, etc.) +5. Enter barcode value +6. Optionally add an image +7. Tap **Save** + +### Importing from Gallery + +1. Tap **menu** โ†’ **Import** +2. Select an image from your gallery +3. The app will detect card and barcode +4. Review and edit if needed +5. Save the card + +## Working with Cards + +### Viewing a Card + +- Tap any card to open it +- View card details +- See barcode/QR code +- Swipe for multiple pages (if applicable) + +### Displaying Barcode for Scanning + +1. Open the card +2. Tap the barcode to enter full-screen mode +3. The screen brightness will increase automatically +4. Present to scanner +5. Tap again or press back to exit + +**Tips:** +- Hold device steady +- Ensure screen is clean +- Use white background option if scanner has trouble reading + +### Editing a Card + +1. Open the card +2. Tap **edit icon** or **menu** +3. Available options: + - **Edit Image**: Crop, rotate, apply filters + - **Edit Barcode**: Change barcode type or value + - **Add Fields**: Add custom fields + - **Rename**: Change card name + - **Delete**: Remove the card + +## Adding Extra Information + +### Custom Fields + +Add additional information to your cards: + +1. Open a card +2. Tap **menu** โ†’ **Add Field** +3. Choose field type: + - Text (card number, name, etc.) + - Date (expiration date) + - Phone number + - Email + - Note +4. Enter field value +5. Save + +**Examples:** +- Card number: `1234 5678 9012 3456` +- Expiration: `12/2025` +- Customer ID: `CUS123456` +- Phone: `1-800-555-0123` + +### Using OCR + +Extract text from your card image: + +1. Open a card +2. Tap **OCR** button +3. Wait for text recognition +4. Select detected text to copy +5. Add to custom fields if desired + +## Organizing Cards + +### Creating Folders + +Organize cards by type: + +1. Tap **menu** โ†’ **New Folder** +2. Name your folder (e.g., "Loyalty Cards", "Insurance", "Tickets") +3. Tap **Create** + +**Suggested Folders:** +- Loyalty Programs +- Insurance Cards +- Memberships +- Gift Cards +- Event Tickets +- Library Cards + +### Moving Cards + +1. Long press on a card +2. Tap **Move** +3. Select destination folder +4. Tap **Confirm** + +### Searching Cards + +Use the search function to quickly find cards: +1. Tap the **search icon** +2. Type card name, barcode, or any text +3. Results appear instantly + +## Using Quick Access + +### Recent Cards + +Recently used cards appear at the top of your list for easy access. + +### Creating Shortcuts + +Create device shortcuts for frequently used cards: + +1. Open a card +2. Tap **menu** โ†’ **Create Shortcut** +3. A shortcut appears on your home screen +4. Tap the shortcut to instantly open the card + +### Favorites + +Mark cards as favorites: +1. Open a card +2. Tap the **star icon** +3. Favorites appear prominently in your list + +## Exporting & Sharing + +### Share Single Card + +1. Open a card +2. Tap **share** button +3. Choose format: + - **PDF**: Include card image and barcode + - **Image**: Just the card image + - **Barcode**: Just the barcode +4. Select destination app + +### Export Multiple Cards + +1. Long press to enter selection mode +2. Select multiple cards +3. Tap **export** or **share** +4. Choose format and destination + +### Printing Cards + +1. Open a card (or select multiple) +2. Tap **menu** โ†’ **Print** +3. Select printer +4. Configure settings +5. Print + +## Security Setup + +### Enable Biometric Lock + +Protect your cards with fingerprint or face: + +1. Go to **Settings** โ†’ **Security** +2. Enable **Biometric Authentication** +3. Confirm with your biometric +4. App will now require authentication + +### Configure Auto-Lock + +Set timeout for automatic locking: + +1. **Settings** โ†’ **Security** โ†’ **Auto-lock** +2. Choose timeout: + - Immediately + - After 1 minute + - After 5 minutes + - After 30 minutes + +## Cloud Sync (WebDAV) + +### Setting Up Sync + +Backup and sync cards across devices: + +1. Go to **Settings** โ†’ **Synchronization** +2. Tap **Add Server** +3. Enter WebDAV details: + - Server URL + - Username + - Password +4. Test connection +5. Save + +**Nextcloud Example:** +``` +URL: https://your-nextcloud.com/remote.php/webdav/ +Username: your-username +Password: app-password +``` + +### Sync Options + +- **Auto Sync**: Enable for automatic background sync +- **Manual Sync**: Tap sync button when needed +- **Sync Conflicts**: App handles conflicts intelligently + +## Customizing Settings + +### Display Settings + +- **View Style**: Choose grid or list view +- **Card Size**: Adjust card preview size +- **Theme**: Switch between light and dark mode +- **Sort Order**: By name, date, or custom + +### Card Settings + +- **Image Format**: JPEG (smaller) or PNG (higher quality) +- **Compression**: Adjust quality vs. size +- **Default Folder**: Where new cards are saved +- **Naming Format**: How cards are named + +### Barcode Settings + +- **White Background**: Force white background for QR codes +- **Barcode Size**: Adjust display size +- **Full Screen Brightness**: Auto-brightness boost + +## Tips & Tricks + +### Scanning Best Practices + +- Clean your camera lens +- Use good lighting or flash +- Hold device steady +- Ensure barcode is clearly visible +- Try different angles if detection fails + +### Organization Tips + +- Create folders before adding many cards +- Use meaningful names +- Add extra fields for important info +- Regular backups via WebDAV or export + +### Quick Access Strategies + +- Create shortcuts for most-used cards +- Use recent cards feature +- Star your important cards +- Keep active cards at the top + +### Barcode Display Tips + +- Enable white background for difficult scanners +- Increase brightness manually if auto-boost insufficient +- Clean your screen before scanning +- Hold device steady at scanner + +## Troubleshooting + +### Barcode Not Detected + +- Ensure barcode is clear and visible +- Try better lighting +- Manually enter barcode as fallback +- Check barcode isn't damaged + +### Scanner Can't Read Barcode + +- Enable "force white background" option +- Increase screen brightness +- Clean your screen +- Try different display sizes +- Ensure barcode format is correct + +### Sync Issues + +- Verify server credentials +- Check internet connection +- Confirm server URL is correct +- Try manual sync first +- Check sync status in settings + +## Common Use Cases + +### Loyalty Cards at Checkout + +1. Open app (biometric unlock) +2. Card appears in recent list +3. Tap card to open +4. Tap barcode for full-screen +5. Present to scanner + +### Event Tickets + +1. Screenshot or save ticket email +2. Import into Card Wallet +3. Create shortcut on home screen +4. At event, tap shortcut โ†’ instant access + +### Insurance Cards + +1. Scan front and back of card +2. Add to "Insurance" folder +3. Use OCR to add policy number +4. Export PDF for sharing with providers + +### Gift Cards + +1. Scan card and barcode +2. Use OCR or add field for balance +3. Update balance in notes after use +4. Delete when depleted + +## Getting Help + +- **Report Issues**: [GitHub Issues](https://github.com/Akylas/OSS-DocumentScanner/issues) +- **Feature Requests**: Submit via GitHub +- **Contribute**: The app is open source! + +## Support Development + +If you find Card Wallet useful, consider [sponsoring the developer](https://github.com/sponsors/farfromrefug) to support continued development! diff --git a/docs/card-wallet/index.md b/docs/card-wallet/index.md new file mode 100644 index 000000000..9bd849443 --- /dev/null +++ b/docs/card-wallet/index.md @@ -0,0 +1,134 @@ +# OSS Card Wallet + +![Feature Graphic](/wallet-images/featureGraphic.png) + +**OSS Card Wallet** is an Open Source app to scan and store all your cards. You either scan using your camera or by importing an image. The app will automatically detect your cards and barcodes within the photo and will crop the image. + +## Quick Overview + +- ๐Ÿ’ณ **Store All Cards**: Credit cards, loyalty cards, membership cards, tickets, and more +- ๐Ÿ“ท **Camera Scanning**: Quick card scanning with auto-detection +- ๐Ÿ” **Barcode Detection**: Automatic barcode and QR code detection +- โœ๏ธ **Manual Entry**: Manually add barcodes without scanning +- ๐Ÿ” **Secure Storage**: Protect your cards with biometrics +- ๐Ÿ“„ **PDF Export**: Export cards as PDF or images +- ๐Ÿ–จ๏ธ **Print Support**: Print cards directly from your phone +- โšก **Quick Access**: Shortcuts for frequently used cards +- ๐ŸŽฏ **Easy Display**: Quickly display barcodes for scanning + +## Key Features + +### Automatic Barcode/QR Code Detection + +The app intelligently detects and extracts barcodes and QR codes from your cards: +- Supports multiple barcode formats +- Works with various card layouts +- Automatic cropping and enhancement +- Manual barcode entry available + +### OCR for Card Details + +Use OCR to store card information: +- Extract card numbers, names, and other details +- Easy copy and access +- Search through card data +- Organize by card information + +### Security First + +Your cards contain sensitive information, so security is paramount: +- **Biometric Lock**: Fingerprint or face authentication +- **Local Storage**: Data stays on your device +- **Optional Sync**: You control cloud storage +- **No Tracking**: Open source and privacy-focused + +### Quick Card Display + +Access your cards when you need them: +- Display barcode/QR code for scanning at checkout +- Recent cards for quick access +- Device shortcuts for favorite cards +- Full-screen barcode display + +### Flexible Export Options + +Share and backup your cards: +- Export as PDF with multiple cards +- Individual card images +- Batch export +- Direct printing + +## Use Cases + +### Loyalty & Membership Cards +- Store all your loyalty cards in one place +- Quick access at checkout +- Never forget your points again +- Reduce wallet clutter + +### Event Tickets +- Store concert, movie, and event tickets +- Display barcode when needed +- Keep ticket history +- Share tickets with others + +### Insurance Cards +- Health insurance cards +- Car insurance documents +- Easy access in emergencies +- Backup important cards + +### Library Cards +- Public library cards +- Membership IDs +- Student IDs +- Access cards + +## Installation + +### Android + +
+ +[![Google Play](https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png)](https://play.google.com/store/apps/details?id=com.akylas.cardwallet) + +[![IzzyOnDroid](https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png)](https://apt.izzysoft.de/packages/com.akylas.cardwallet) + +
+ +### iOS + +
+ +[![Download on the App Store](https://tools.applemediaservices.com/api/badges/download-on-the-app-store/black/en-us)](https://apps.apple.com/app/oss-cardwallet/id6504414362) + +
+ +### Direct Download + +Download APK files directly from [GitHub Releases](https://github.com/Akylas/OSS-DocumentScanner/releases) (filter releases containing "Card Wallet"). + +## Privacy & Security + +### Your Data, Your Control + +- **No Ads**: Clean, ad-free experience +- **No Tracking**: No analytics or data collection +- **Open Source**: Fully transparent and auditable +- **Local First**: All data stored locally by default +- **Optional Cloud**: WebDAV sync if you choose + +### Secure Your Cards + +- Biometric authentication (fingerprint/face) +- PIN code protection +- Auto-lock timeout +- Encrypted storage options + +## Getting Started + +Ready to digitize your wallet? Check out the [Getting Started Guide](./getting-started.md) to learn how to use all the features. + +## Support Development + +If you find OSS Card Wallet useful, please consider [supporting the development](https://github.com/sponsors/farfromrefug). Your support helps maintain and improve the app! diff --git a/docs/card-wallet/screenshots.md b/docs/card-wallet/screenshots.md new file mode 100644 index 000000000..a1aaa4fd0 --- /dev/null +++ b/docs/card-wallet/screenshots.md @@ -0,0 +1,71 @@ +# Screenshots + +See OSS Card Wallet in action! + +## Main Interface + +
+ +
+ +### Card List +![Card List](/wallet-images/phoneScreenshots/2_en-US.png) + +Browse all your cards in an organized, easy-to-navigate interface. + +
+ +
+ +### Barcode Display +![Barcode Display](/wallet-images/phoneScreenshots/5_en-US.png) + +Display barcodes in full-screen for easy scanning at checkout or entry points. + +
+ +
+ +### Card Details +![Card Details](/wallet-images/phoneScreenshots/3_en-US.png) + +View card information, add custom fields, and manage card details. + +
+ +
+ +## Feature Highlights + +![Feature Graphic](/wallet-images/featureGraphic.png) + +## Additional Screenshots + +Explore more features and views: + +- Barcode and QR code scanning +- Card editing and enhancement +- Folder organization +- Security features +- Export and sharing options + +## Supported Card Types + +OSS Card Wallet works with virtually any card: + +- ๐Ÿ’ณ **Loyalty Cards**: Store rewards, grocery, retail +- ๐ŸŽซ **Tickets**: Events, movies, concerts +- ๐Ÿฅ **Insurance Cards**: Health, dental, vision +- ๐Ÿ“š **Library Cards**: Public libraries, memberships +- ๐ŸŽ **Gift Cards**: Restaurant, retail, online +- ๐Ÿข **Membership Cards**: Gym, clubs, associations +- ๐ŸŽŸ๏ธ **Passes**: Transit, parking, access cards +- And many more! + +## Multi-Language Support + +The app supports multiple languages thanks to our translation contributors on [Weblate](https://hosted.weblate.org/engage/oss-document-scanner/). + +## Try It Yourself + +The best way to see all features is to [download the app](/card-wallet/#installation) and try it yourself! diff --git a/docs/document-scanner/features.md b/docs/document-scanner/features.md new file mode 100644 index 000000000..85431dbe4 --- /dev/null +++ b/docs/document-scanner/features.md @@ -0,0 +1,142 @@ +# Features + +OSS Document Scanner comes with a comprehensive set of features to help you digitize and manage your documents. + +## Document Scanning + +### Camera Scanning +- **Real-time Detection**: See document boundaries detected in real-time as you position your camera +- **Auto-capture**: Automatically capture when document is properly positioned +- **Manual Capture**: Take photos manually when needed +- **Flash Support**: Use device flash for low-light conditions + +### Document Import +- Import images from your photo library +- Support for various image formats (JPEG, PNG, etc.) +- Import from other apps +- Bulk import multiple documents + +## Image Processing + +### Automatic Document Detection +The app uses OpenCV to detect document boundaries: +- Works with documents at any angle +- Handles perspective distortion +- Detects rectangular shapes automatically +- Manual corner adjustment available + +### Image Enhancements +- **Filters**: Apply various filters (color, grayscale, black & white) +- **Brightness/Contrast**: Adjust image brightness and contrast +- **Crop & Rotate**: Manual cropping and rotation tools +- **Perspective Correction**: Automatic perspective correction +- **Image Quality**: Configurable compression and quality settings + +## OCR (Optical Character Recognition) + +Extract text from your scanned documents: +- **Multiple Languages**: Support for various languages +- **High Accuracy**: Uses Tesseract OCR engine +- **Copy Text**: Copy extracted text to clipboard +- **Search**: Search through extracted text +- **Export Text**: Export text alongside PDFs + +### OCR Configuration +- Select specific regions for OCR +- Choose OCR language +- Copy text with or without line breaks +- Run OCR on sync for cloud-stored documents + +## Document Organization + +### Folders +- Create folders to organize documents +- Move documents between folders +- Rename folders +- Nested folder support + +### Document Management +- Rename documents +- Add tags and labels +- Sort by date, name, or custom order +- Search documents by name or content +- Bulk operations (select multiple documents) + +## Export & Sharing + +### PDF Export +- **Single Document**: Export individual documents as PDF +- **Multiple Documents**: Combine multiple documents into one PDF +- **Page Selection**: Choose specific pages to export +- **Quality Settings**: Adjust PDF quality and compression +- **OCR in PDF**: Include OCR text layer in PDFs + +### Sharing Options +- Share via email, messaging apps, cloud storage +- Direct printing from your device +- Export as images (JPEG, PNG) +- Batch sharing multiple documents + +## Cloud Synchronization + +### WebDAV Support +Synchronize your documents with WebDAV servers: +- **Nextcloud**: Full Nextcloud integration +- **ownCloud**: Compatible with ownCloud +- **Generic WebDAV**: Works with any WebDAV server + +### Sync Features +- **Automatic Sync**: Background synchronization +- **Conflict Resolution**: Handle sync conflicts intelligently +- **Selective Sync**: Choose what to sync +- **Sync Status**: View sync progress and status +- **Manual Sync**: Trigger sync manually when needed + +## Security & Privacy + +### Biometric Protection +- Fingerprint authentication +- Face unlock (on supported devices) +- PIN code protection +- Auto-lock after inactivity + +### Data Privacy +- **Local First**: All data stored locally by default +- **No Tracking**: No analytics or tracking +- **Open Source**: Fully auditable code +- **Optional Cloud**: You control where data is stored + +## Customization + +### Settings +- **Image Format**: Choose between JPEG and PNG +- **Compression**: Adjust image compression levels +- **Document Naming**: Customize document naming format +- **Camera Settings**: Configure camera behavior +- **View Style**: Vertical or grid layout +- **Theme**: Light and dark mode support + +### Shortcuts +- Quick access to recently used documents +- Create device shortcuts for specific documents +- One-time scan via system intents + +## Additional Features + +### Import Documents into Another +Merge documents by importing pages from one document into another. + +### QR Code Support +- Force QR codes on white background for better scanning +- Create cards from barcodes without scanning images + +### Batch Operations +- Process multiple documents at once +- Apply filters to multiple pages +- Export multiple documents simultaneously + +### Advanced Options +- Start app in camera mode +- Customize scan behavior +- Configure export settings +- Set default folders diff --git a/docs/document-scanner/getting-started.md b/docs/document-scanner/getting-started.md new file mode 100644 index 000000000..3e5e03015 --- /dev/null +++ b/docs/document-scanner/getting-started.md @@ -0,0 +1,246 @@ +# Getting Started with OSS Document Scanner + +This guide will help you get started with OSS Document Scanner and make the most of its features. + +## Installation + +### From App Stores + +1. **Android**: Download from [Google Play Store](https://play.google.com/store/apps/details?id=com.akylas.documentscanner) or [IzzyOnDroid](https://apt.izzysoft.de/packages/com.akylas.documentscanner) +2. **iOS**: Download from [Apple App Store](https://apps.apple.com/us/app/oss-document-scanner/id6472918564) +3. **Direct APK**: Download from [GitHub Releases](https://github.com/Akylas/OSS-DocumentScanner/releases) + +### First Launch + +When you first open the app, you'll be greeted with the main document list. The app is ready to use immediately - no account or registration required! + +## Scanning Your First Document + +### Using Camera + +1. Tap the **camera button** (usually at the bottom right) +2. Point your camera at a document +3. The app will automatically detect the document boundaries (shown as a colored overlay) +4. Once detected, the app can auto-capture, or you can tap the capture button +5. Review the detected boundaries and adjust if needed +6. Tap **Save** or **โœ“** to save the document + +**Tips:** +- Ensure good lighting for best results +- Place the document on a contrasting background +- Keep the document flat and the camera steady +- The entire document should be visible in the frame + +### Importing from Gallery + +1. Tap the **menu button** or **+** button +2. Select **Import from Gallery** +3. Choose one or more images +4. The app will automatically detect and crop the document +5. Review and adjust if needed +6. Save the document + +## Working with Documents + +### Viewing a Document + +- Tap any document in the list to open it +- Swipe left/right to navigate between pages (if multiple pages) +- Pinch to zoom in/out +- Double-tap to fit to screen + +### Editing a Document + +1. Open the document +2. Tap the **edit icon** or **menu** +3. Available options: + - **Crop**: Adjust document boundaries + - **Rotate**: Rotate the page + - **Filters**: Apply color, grayscale, or black & white filters + - **Brightness/Contrast**: Adjust image settings + - **Delete Page**: Remove current page + +### Adding More Pages + +1. Open the document +2. Tap the **+ page button** +3. Choose to scan with camera or import from gallery +4. The new page will be added to the current document + +### Reordering Pages + +1. Open the document +2. Long press on the page indicator/thumbnail +3. Drag to reorder pages + +## Using OCR (Text Recognition) + +1. Open a document +2. Tap the **OCR button** (usually looks like "Aa" or text icon) +3. Wait for text recognition to complete +4. View extracted text +5. Options: + - **Copy**: Copy text to clipboard + - **Share**: Share text via other apps + - **Search**: Search within the text + +**OCR Tips:** +- Works best with clear, well-lit images +- Higher resolution = better accuracy +- Select document language in settings for best results +- Use black & white filter for text-heavy documents + +## Organizing Documents + +### Creating Folders + +1. Tap **menu** โ†’ **New Folder** +2. Enter folder name +3. Tap **Create** + +### Moving Documents to Folders + +1. Long press on a document +2. Tap **Move** +3. Select destination folder + +### Renaming Documents + +1. Long press on a document +2. Tap **Rename** +3. Enter new name +4. Tap **Save** + +## Exporting & Sharing + +### Export as PDF + +1. Open a document (or select multiple documents) +2. Tap **Share** or **Export** button +3. Select **PDF** +4. Choose export settings: + - Quality + - Include OCR text layer (if OCR was performed) + - Page range +5. Select destination (email, cloud storage, etc.) + +### Printing + +1. Open a document +2. Tap **menu** โ†’ **Print** +3. Select printer +4. Configure print settings +5. Tap **Print** + +## Cloud Synchronization (WebDAV) + +### Setting Up Sync + +1. Go to **Settings** โ†’ **Synchronization** +2. Tap **Add WebDAV Server** +3. Enter server details: + - Server URL (e.g., `https://nextcloud.example.com/remote.php/webdav/`) + - Username + - Password +4. Tap **Test Connection** +5. If successful, tap **Save** + +### Using Sync + +- **Manual Sync**: Tap sync button in settings +- **Auto Sync**: Enable in settings for background sync +- **Sync Status**: View sync status in notification/settings + +**Nextcloud Setup Example:** +``` +URL: https://your-nextcloud.com/remote.php/webdav/ +Username: your-username +Password: your-password or app-password +``` + +## Security Settings + +### Enable Biometric Lock + +1. Go to **Settings** โ†’ **Security** +2. Enable **Biometric Authentication** +3. Confirm with your fingerprint/face +4. The app will now require authentication to open + +### Auto-Lock + +Configure the app to auto-lock after inactivity: +1. **Settings** โ†’ **Security** โ†’ **Auto-lock** +2. Choose timeout period + +## Customizing Settings + +### Camera Settings + +- **Auto-capture**: Enable/disable automatic capture +- **Flash**: Configure flash behavior +- **Start in Camera Mode**: Launch directly to camera + +### Document Settings + +- **Default Format**: JPEG or PNG +- **Image Quality**: Compression level +- **Naming Format**: Customize document names +- **Default Folder**: Set default save location + +### Display Settings + +- **View Style**: Grid or vertical list +- **Theme**: Light or dark mode +- **Language**: Change app language + +## Tips & Tricks + +### Quick Document Access +- Long press on a document to see quick actions +- Use shortcuts for frequently accessed documents + +### Batch Operations +- Long press and select multiple documents +- Apply actions to all selected documents at once + +### Scanning Tips +- Use the black & white filter for text documents +- Use color filter for photos and colored documents +- Clean the camera lens for best results +- Use good lighting or enable flash in low light + +### Organization +- Use meaningful folder names +- Regularly export important documents as backup +- Use WebDAV sync for automatic backups + +## Troubleshooting + +### Document Not Detected +- Ensure good lighting +- Use a contrasting background +- Try manual corner adjustment +- Check if document is fully visible + +### OCR Not Working +- Ensure text is clear and readable +- Try applying black & white filter first +- Check OCR language settings +- Higher resolution images work better + +### Sync Issues +- Verify server URL and credentials +- Check internet connection +- Look for sync errors in settings +- Try manual sync first + +## Getting Help + +- **Report Issues**: [GitHub Issues](https://github.com/Akylas/OSS-DocumentScanner/issues) +- **Feature Requests**: Submit via GitHub +- **Contribute**: The app is open source on [GitHub](https://github.com/Akylas/OSS-DocumentScanner) + +## Support Development + +If you find this app useful, consider [sponsoring the developer](https://github.com/sponsors/farfromrefug) to support continued development and maintenance. diff --git a/docs/document-scanner/index.md b/docs/document-scanner/index.md new file mode 100644 index 000000000..53512d747 --- /dev/null +++ b/docs/document-scanner/index.md @@ -0,0 +1,86 @@ +# OSS Document Scanner + +![Feature Graphic](/scanner-images/featureGraphic.png) + +**OSS Document Scanner** is an Open Source app to scan all your documents. You either scan using your camera or by importing an image. The app will automatically detect your document within the photo and will crop the image. + +## Quick Overview + +- ๐Ÿ“ท **Camera Scanning**: Use your device camera to scan documents in real-time +- ๐Ÿ–ผ๏ธ **Image Import**: Import existing images from your photo library +- โœ‚๏ธ **Auto Crop**: Automatic document boundary detection and cropping +- ๐Ÿ” **OCR Support**: Extract text from your documents using OCR +- ๐Ÿ“„ **PDF Export**: Share documents as PDF files +- โ˜๏ธ **WebDAV Sync**: Synchronize with Nextcloud and other WebDAV servers +- ๐Ÿ“ **Folder Organization**: Organize documents in folders +- ๐ŸŽจ **Image Editing**: Apply filters, adjust brightness/contrast +- ๐Ÿ–จ๏ธ **Print Support**: Print documents directly from your device + +## Key Features + +### Smart Document Detection + +The app uses advanced computer vision algorithms to automatically detect document boundaries in photos. This means you can take a picture of a document at any angle, and the app will straighten and crop it automatically. + +### OCR Text Recognition + +Built-in OCR (Optical Character Recognition) allows you to extract text from your scanned documents. Once extracted, you can: +- Copy text to clipboard +- Search through your documents +- Share extracted text + +### PDF Export & Sharing + +Export your documents as high-quality PDFs: +- Single document export +- Batch export multiple documents +- Configurable PDF quality and settings +- Direct sharing to other apps + +### WebDAV Synchronization + +Keep your documents safe and accessible across devices: +- Sync with Nextcloud, ownCloud, or any WebDAV server +- Automatic synchronization +- Conflict resolution +- Never lose your documents + +### Privacy & Security + +- **Open Source**: Full transparency, no hidden tracking +- **No Ads**: Clean interface without advertisements +- **Local Storage**: Your data stays on your device +- **Biometric Protection**: Optional fingerprint/face unlock +- **Optional Cloud Sync**: You choose where your data goes + +## Installation + +### Android + +
+ +[![Google Play](https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png)](https://play.google.com/store/apps/details?id=com.akylas.documentscanner) + +[![IzzyOnDroid](https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png)](https://apt.izzysoft.de/packages/com.akylas.documentscanner) + +
+ +### iOS + +
+ +[![Download on the App Store](https://tools.applemediaservices.com/api/badges/download-on-the-app-store/black/en-us)](https://apps.apple.com/us/app/oss-document-scanner/id6472918564) + +
+ +### Direct Download + +Download APK files directly from [GitHub Releases](https://github.com/Akylas/OSS-DocumentScanner/releases) (filter releases containing "Document Scanner"). + +## Getting Started + +Ready to start scanning? Check out the [Getting Started Guide](./getting-started.md) to learn how to use all the features. + +## Support Development + +If you find OSS Document Scanner useful, please consider [supporting the development](https://github.com/sponsors/farfromrefug). Your support helps maintain and improve the app! diff --git a/docs/document-scanner/screenshots.md b/docs/document-scanner/screenshots.md new file mode 100644 index 000000000..f5351b429 --- /dev/null +++ b/docs/document-scanner/screenshots.md @@ -0,0 +1,56 @@ +# Screenshots + +Take a look at OSS Document Scanner in action! + +## Main Interface + +
+ +
+ +### Document List +![Document List](/scanner-images/phoneScreenshots/1_en-US.png) + +View all your scanned documents organized in an easy-to-navigate interface. + +
+ +
+ +### Document Editor +![Document Editor](/scanner-images/phoneScreenshots/2_en-US.png) + +Edit, enhance, and perfect your scanned documents with powerful tools. + +
+ +
+ +### OCR & Text Detection +![OCR](/scanner-images/phoneScreenshots/3_en-US.png) + +Extract text from documents using advanced OCR technology. + +
+ +
+ +## Feature Highlights + +![Feature Graphic](/scanner-images/featureGraphic.png) + +## More Screenshots + +Check out more screenshots in different languages and configurations: + +- View the app in multiple languages thanks to our [translation contributors](https://hosted.weblate.org/engage/oss-document-scanner/) +- Supports both light and dark themes +- Responsive design for tablets and different screen sizes + +## Video Demos + +Want to see the app in action? Check out our [releases on GitHub](https://github.com/Akylas/OSS-DocumentScanner/releases) for demo videos and detailed changelogs. + +## Try It Yourself + +The best way to see all features is to [download the app](/document-scanner/#installation) and try it yourself! diff --git a/docs/download.md b/docs/download.md new file mode 100644 index 000000000..7013ad9a1 --- /dev/null +++ b/docs/download.md @@ -0,0 +1,138 @@ +# Download + +Get OSS Document Scanner and OSS Card Wallet on your preferred platform. + +## OSS Document Scanner + +### Android + +
+ + + Get it on Google Play + + + + Get it on IzzyOnDroid + + + + Get it on GitHub + + +
+ +### iOS + +
+ + + Download on the App Store + + +
+ +### Version Info + +![Latest Release](https://img.shields.io/github/v/release/Akylas/OSS-DocumentScanner?display_name=release&filter=*scanner*) +![Downloads](https://img.shields.io/github/downloads/Akylas/OSS-DocumentScanner/total.svg) + +--- + +## OSS Card Wallet + +### Android + +
+ + + Get it on Google Play + + + + Get it on IzzyOnDroid + + + + Get it on GitHub + + +
+ +### iOS + +
+ + + Download on the App Store + + +
+ +### Version Info + +![Latest Release](https://img.shields.io/github/v/release/Akylas/OSS-DocumentScanner?display_name=release&filter=*wallet*) + +--- + +## GitHub Releases + +For direct APK downloads and detailed changelogs, visit: + +๐Ÿ“ฆ [GitHub Releases](https://github.com/Akylas/OSS-DocumentScanner/releases) + +**Document Scanner**: Look for releases containing "Document Scanner" in the title +**Card Wallet**: Look for releases containing "Card Wallet" in the title + +## Obtainium + +Get automatic updates using [Obtainium](https://github.com/ImranR98/Obtainium): + +### Document Scanner + + Get it on Obtainium + + +### Card Wallet + + Get it on Obtainium + + +## System Requirements + +### Android +- **Minimum**: Android 7.0 (API 24) +- **Recommended**: Android 10 or higher +- **Permissions**: Camera, Storage +- **Optional**: Biometric hardware for fingerprint/face unlock + +### iOS +- **Minimum**: iOS 13.0 +- **Recommended**: iOS 15 or higher +- **Compatible with**: iPhone, iPad + +## AppVerifier Hashes + +For security-conscious users, verify the app signature: + +**OSS Document Scanner**: +``` +com.akylas.documentscanner +0D:10:AA:10:E0:3A:7E:76:97:22:BE:43:88:BE:63:BD:15:7A:7B:7B:F1:96:FB:3C:EB:AB:87:37:F9:6C:A8:71 +``` + +**OSS Card Wallet**: +``` +com.akylas.cardwallet +0D:10:AA:10:E0:3A:7E:76:97:22:BE:43:88:BE:63:BD:15:7A:7B:7B:F1:96:FB:3C:EB:AB:87:37:F9:6C:A8:71 +``` + +## Source Code + +Both apps are fully open source: + +๐Ÿ”— [View on GitHub](https://github.com/Akylas/OSS-DocumentScanner) + +## License + +Released under the [MIT License](https://github.com/Akylas/OSS-DocumentScanner/blob/master/LICENSE) diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..3f394b4f5 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,108 @@ +--- +layout: home + +hero: + name: "OSS Document Scanner" + text: "& Card Wallet" + tagline: Open Source apps to scan all your documents and store your cards securely + image: + src: /documentscanner-icon.svg + alt: OSS Document Scanner + actions: + - theme: brand + text: Get Document Scanner + link: /document-scanner/ + - theme: alt + text: Get Card Wallet + link: /card-wallet/ + - theme: alt + text: View on GitHub + link: https://github.com/Akylas/OSS-DocumentScanner + +features: + - icon: ๐Ÿ“ท + title: Document Scanner + details: Scan documents using your camera or import images. Auto-detect document boundaries and crop automatically. + link: /document-scanner/ + - icon: ๐Ÿ’ณ + title: Card Wallet + details: Scan and store all your cards with automatic barcode/QR code detection. Secure your data with biometrics. + link: /card-wallet/ + - icon: ๐Ÿ” + title: OCR Support + details: Detect and extract text from your scanned documents and cards using powerful OCR technology. + - icon: ๐Ÿ“„ + title: PDF Export + details: Share your documents as PDFs. Export multiple documents at once and print directly from your phone. + - icon: โ˜๏ธ + title: WebDAV Sync + details: Synchronize your app data with WebDAV servers like Nextcloud to never lose anything. + - icon: ๐Ÿ”’ + title: Privacy Focused + details: Open Source, no ads, no tracking. Your data stays on your device or your chosen sync server. +--- + +
+ +## ๐Ÿ’– Support Development + +OSS Document Scanner and OSS Card Wallet are completely free and open source. If you find them useful, please consider supporting the development: + + + +

+Your support helps maintain and improve these apps. Developing open source applications takes a lot of time and effort. +

+ +
+ +## ๐Ÿ“ฑ Available On Multiple Platforms + +Both apps are available on Android and iOS through various distribution channels: + +
+ +
+ +### OSS Document Scanner + +- ๐Ÿค– [Google Play Store](https://play.google.com/store/apps/details?id=com.akylas.documentscanner) +- ๐ŸŽ [Apple App Store](https://apps.apple.com/us/app/oss-document-scanner/id6472918564) +- ๐Ÿ”ง [IzzyOnDroid](https://apt.izzysoft.de/packages/com.akylas.documentscanner) +- ๐Ÿ“ฆ [GitHub Releases](https://github.com/Akylas/OSS-DocumentScanner/releases) + +
+ +
+ +### OSS Card Wallet + +- ๐Ÿค– [Google Play Store](https://play.google.com/store/apps/details?id=com.akylas.cardwallet) +- ๐ŸŽ [Apple App Store](https://apps.apple.com/app/oss-cardwallet/id6504414362) +- ๐Ÿ”ง [IzzyOnDroid](https://apt.izzysoft.de/packages/com.akylas.cardwallet) +- ๐Ÿ“ฆ [GitHub Releases](https://github.com/Akylas/OSS-DocumentScanner/releases) + +
+ +
+ +## ๐ŸŒ Community & Translation + +![Translation Status](https://hosted.weblate.org/widgets/oss-document-scanner/-/svg-badge.svg) + +Help translate these apps into your language on [Weblate](https://hosted.weblate.org/engage/oss-document-scanner/). + +## ๐Ÿ“Š Project Stats + +![GitHub stars](https://img.shields.io/github/stars/Akylas/OSS-DocumentScanner?style=social) +![GitHub downloads](https://img.shields.io/github/downloads/Akylas/OSS-DocumentScanner/total.svg) +![GitHub release (Document Scanner)](https://img.shields.io/github/v/release/Akylas/OSS-DocumentScanner?display_name=release&filter=*scanner*) +![GitHub release (Card Wallet)](https://img.shields.io/github/v/release/Akylas/OSS-DocumentScanner?display_name=release&filter=*wallet*) + +## ๐Ÿ“„ License + +Both apps are released under the [MIT License](https://github.com/Akylas/OSS-DocumentScanner/blob/master/LICENSE). diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 000000000..183305fa4 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,2514 @@ +{ + "name": "oss-documentscanner-docs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "oss-documentscanner-docs", + "version": "1.0.0", + "devDependencies": { + "vitepress": "^1.0.0", + "vue": "^3.4.0" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.15.2.tgz", + "integrity": "sha512-rF7vRVE61E0QORw8e2NNdnttcl3jmFMWS9B4hhdga12COe+lMa26bQLfcBn/Nbp9/AF/8gXdaRCPsVns3CnjsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.49.2.tgz", + "integrity": "sha512-XyvKCm0RRmovMI/ChaAVjTwpZhXdbgt3iZofK914HeEHLqD1MUFFVLz7M0+Ou7F56UkHXwRbpHwb9xBDNopprQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.49.2.tgz", + "integrity": "sha512-jq/3qvtmj3NijZlhq7A1B0Cl41GfaBpjJxcwukGsYds6aMSCWrEAJ9pUqw/C9B3hAmILYKl7Ljz3N9SFvekD3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.49.2.tgz", + "integrity": "sha512-bn0biLequn3epobCfjUqCxlIlurLr4RHu7RaE4trgN+RDcUq6HCVC3/yqq1hwbNYpVtulnTOJzcaxYlSr1fnuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.49.2.tgz", + "integrity": "sha512-z14wfFs1T3eeYbCArC8pvntAWsPo9f6hnUGoj8IoRUJTwgJiiySECkm8bmmV47/x0oGHfsVn3kBdjMX0yq0sNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.49.2.tgz", + "integrity": "sha512-GpRf7yuuAX93+Qt0JGEJZwgtL0MFdjFO9n7dn8s2pA9mTjzl0Sc5+uTk1VPbIAuf7xhCP9Mve+URGb6J+EYxgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.49.2.tgz", + "integrity": "sha512-HZwApmNkp0DiAjZcLYdQLddcG4Agb88OkojiAHGgcm5DVXobT5uSZ9lmyrbw/tmQBJwgu2CNw4zTyXoIB7YbPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.2.tgz", + "integrity": "sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.49.2", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.49.2.tgz", + "integrity": "sha512-YYJRjaZ2bqk923HxE4um7j/Cm3/xoSkF2HC2ZweOF8cXL3sqnlndSUYmCaxHFjNPWLaSHk2IfssX6J/tdKTULw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.49.2", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.49.2.tgz", + "integrity": "sha512-9WgH+Dha39EQQyGKCHlGYnxW/7W19DIrEbCEbnzwAMpGAv1yTWCHMPXHxYa+LcL3eCp2V/5idD1zHNlIKmHRHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.49.2.tgz", + "integrity": "sha512-K7Gp5u+JtVYgaVpBxF5rGiM+Ia8SsMdcAJMTDV93rwh00DKNllC19o1g+PwrDjDvyXNrnTEbofzbTs2GLfFyKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.49.2.tgz", + "integrity": "sha512-3UhYCcWX6fbtN8ABcxZlhaQEwXFh3CsFtARyyadQShHMPe3mJV9Wel4FpJTa+seugRkbezFz0tt6aPTZSYTBuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.49.2.tgz", + "integrity": "sha512-G94VKSGbsr+WjsDDOBe5QDQ82QYgxvpxRGJfCHZBnYKYsy/jv9qGIDb93biza+LJWizQBUtDj7bZzp3QZyzhPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.49.2.tgz", + "integrity": "sha512-UuihBGHafG/ENsrcTGAn5rsOffrCIRuHMOsD85fZGLEY92ate+BMTUqxz60dv5zerh8ZumN4bRm8eW2z9L11jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.73", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.73.tgz", + "integrity": "sha512-nQZTwul4c2zBqH/aLP4zMOiElj93T6HawbrP+sFQKpxmBdS5x1duCK3cAnkj6dntHz84EYkzaQRM83V2pj4qxA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/algoliasearch": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.2.tgz", + "integrity": "sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.15.2", + "@algolia/client-abtesting": "5.49.2", + "@algolia/client-analytics": "5.49.2", + "@algolia/client-common": "5.49.2", + "@algolia/client-insights": "5.49.2", + "@algolia/client-personalization": "5.49.2", + "@algolia/client-query-suggestions": "5.49.2", + "@algolia/client-search": "5.49.2", + "@algolia/ingestion": "1.49.2", + "@algolia/monitoring": "1.49.2", + "@algolia/recommend": "5.49.2", + "@algolia/requester-browser-xhr": "5.49.2", + "@algolia/requester-fetch": "5.49.2", + "@algolia/requester-node-http": "5.49.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "dev": true, + "license": "MIT" + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.28.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.4.tgz", + "integrity": "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "dev": true, + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..b5bf18ac4 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,15 @@ +{ + "name": "oss-documentscanner-docs", + "version": "1.0.0", + "description": "Documentation site for OSS Document Scanner and OSS Card Wallet", + "type": "module", + "scripts": { + "docs:dev": "vitepress dev", + "docs:build": "vitepress build", + "docs:preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.0.0", + "vue": "^3.4.0" + } +} diff --git a/docs/public/badge_github.png b/docs/public/badge_github.png new file mode 100644 index 000000000..326d25476 Binary files /dev/null and b/docs/public/badge_github.png differ diff --git a/docs/public/cardwallet-icon.svg b/docs/public/cardwallet-icon.svg new file mode 100644 index 000000000..ab0a52843 --- /dev/null +++ b/docs/public/cardwallet-icon.svg @@ -0,0 +1,58 @@ + + + + + + + + + diff --git a/docs/public/documentscanner-icon.svg b/docs/public/documentscanner-icon.svg new file mode 100644 index 000000000..ab0a52843 --- /dev/null +++ b/docs/public/documentscanner-icon.svg @@ -0,0 +1,58 @@ + + + + + + + + + diff --git a/docs/public/icon.png b/docs/public/icon.png new file mode 100644 index 000000000..888f8bcb7 Binary files /dev/null and b/docs/public/icon.png differ diff --git a/docs/public/logo.png b/docs/public/logo.png new file mode 100644 index 000000000..d5c62bf03 Binary files /dev/null and b/docs/public/logo.png differ diff --git a/docs/public/scanner-images/featureGraphic.png b/docs/public/scanner-images/featureGraphic.png new file mode 100644 index 000000000..78b24322c Binary files /dev/null and b/docs/public/scanner-images/featureGraphic.png differ diff --git a/docs/public/scanner-images/icon.png b/docs/public/scanner-images/icon.png new file mode 100644 index 000000000..888f8bcb7 Binary files /dev/null and b/docs/public/scanner-images/icon.png differ diff --git a/docs/public/scanner-images/phoneScreenshots/1_en-US.png b/docs/public/scanner-images/phoneScreenshots/1_en-US.png new file mode 100644 index 000000000..781114d22 Binary files /dev/null and b/docs/public/scanner-images/phoneScreenshots/1_en-US.png differ diff --git a/docs/public/scanner-images/phoneScreenshots/2_en-US.png b/docs/public/scanner-images/phoneScreenshots/2_en-US.png new file mode 100644 index 000000000..30e9874cb Binary files /dev/null and b/docs/public/scanner-images/phoneScreenshots/2_en-US.png differ diff --git a/docs/public/scanner-images/phoneScreenshots/3_en-US.png b/docs/public/scanner-images/phoneScreenshots/3_en-US.png new file mode 100644 index 000000000..da9702973 Binary files /dev/null and b/docs/public/scanner-images/phoneScreenshots/3_en-US.png differ diff --git a/docs/public/wallet-images/featureGraphic.png b/docs/public/wallet-images/featureGraphic.png new file mode 100644 index 000000000..108276b5c Binary files /dev/null and b/docs/public/wallet-images/featureGraphic.png differ diff --git a/docs/public/wallet-images/icon.png b/docs/public/wallet-images/icon.png new file mode 100644 index 000000000..ca8ac2178 Binary files /dev/null and b/docs/public/wallet-images/icon.png differ diff --git a/docs/public/wallet-images/phoneScreenshots/1_en-US.png b/docs/public/wallet-images/phoneScreenshots/1_en-US.png new file mode 100644 index 000000000..131585304 Binary files /dev/null and b/docs/public/wallet-images/phoneScreenshots/1_en-US.png differ diff --git a/docs/public/wallet-images/phoneScreenshots/2_en-US.png b/docs/public/wallet-images/phoneScreenshots/2_en-US.png new file mode 100644 index 000000000..2e21ee7e2 Binary files /dev/null and b/docs/public/wallet-images/phoneScreenshots/2_en-US.png differ diff --git a/docs/public/wallet-images/phoneScreenshots/3_en-US.png b/docs/public/wallet-images/phoneScreenshots/3_en-US.png new file mode 100644 index 000000000..6d3e55617 Binary files /dev/null and b/docs/public/wallet-images/phoneScreenshots/3_en-US.png differ diff --git a/docs/public/wallet-images/phoneScreenshots/4_en-US.png b/docs/public/wallet-images/phoneScreenshots/4_en-US.png new file mode 100644 index 000000000..987969119 Binary files /dev/null and b/docs/public/wallet-images/phoneScreenshots/4_en-US.png differ diff --git a/docs/public/wallet-images/phoneScreenshots/5_en-US.png b/docs/public/wallet-images/phoneScreenshots/5_en-US.png new file mode 100644 index 000000000..499bdf2c3 Binary files /dev/null and b/docs/public/wallet-images/phoneScreenshots/5_en-US.png differ diff --git a/docs/public/wallet-images/phoneScreenshots/6_en-US.png b/docs/public/wallet-images/phoneScreenshots/6_en-US.png new file mode 100644 index 000000000..30fbcc721 Binary files /dev/null and b/docs/public/wallet-images/phoneScreenshots/6_en-US.png differ diff --git a/docs/public/wallet-images/phoneScreenshots/7_en-US.png b/docs/public/wallet-images/phoneScreenshots/7_en-US.png new file mode 100644 index 000000000..30fbcc721 Binary files /dev/null and b/docs/public/wallet-images/phoneScreenshots/7_en-US.png differ diff --git a/docs/public/wallet-images/phoneScreenshots/8_en-US.png b/docs/public/wallet-images/phoneScreenshots/8_en-US.png new file mode 100644 index 000000000..e309c76a1 Binary files /dev/null and b/docs/public/wallet-images/phoneScreenshots/8_en-US.png differ diff --git a/docs/support.md b/docs/support.md new file mode 100644 index 000000000..ee57314bd --- /dev/null +++ b/docs/support.md @@ -0,0 +1,117 @@ +# Support + +## ๐Ÿ’– Support Development + +OSS Document Scanner and OSS Card Wallet are completely free, open source, and ad-free. If you find these apps useful, please consider supporting the development: + +
+ + โค๏ธ Sponsor on GitHub + +
+ +Your support helps: +- ๐Ÿ”ง Maintain and improve the apps +- ๐Ÿ› Fix bugs and issues +- โœจ Add new features +- ๐Ÿ“ฑ Support more platforms +- ๐ŸŒ Improve translations +- ๐Ÿ“š Create better documentation + +Developing and maintaining open source applications takes significant time and effort. Every contribution, no matter how small, makes a difference! + +## ๐ŸŒŸ Current Sponsors + +Thank you to our amazing sponsors! + +

+ + + +

+ +## ๐Ÿ“ฃ Other Ways to Help + +### Share the Apps + +Help others discover these apps: +- โญ Star the [GitHub repository](https://github.com/Akylas/OSS-DocumentScanner) +- ๐Ÿ“ฑ Share with friends and family +- ๐Ÿ’ฌ Write reviews on app stores +- ๐Ÿฆ Share on social media + +### Contribute to Translation + +Help translate the apps into your language: + +![Translation Status](https://hosted.weblate.org/widgets/oss-document-scanner/-/multi-auto.svg) + +๐ŸŒ [Contribute on Weblate](https://hosted.weblate.org/engage/oss-document-scanner/) + +The apps are available in multiple languages thanks to community contributors! + +### Report Issues & Suggest Features + +- ๐Ÿ› [Report bugs](https://github.com/Akylas/OSS-DocumentScanner/issues) +- ๐Ÿ’ก [Request features](https://github.com/Akylas/OSS-DocumentScanner/issues) +- ๐Ÿ’ฌ Participate in discussions +- ๐Ÿ“– Improve documentation + +### Contribute Code + +The project welcomes contributions: +- ๐Ÿ” Browse [open issues](https://github.com/Akylas/OSS-DocumentScanner/issues) +- ๐Ÿ”€ Submit pull requests +- ๐Ÿ“ Improve documentation +- ๐Ÿงช Add tests + +See the [repository](https://github.com/Akylas/OSS-DocumentScanner) for development setup instructions. + +## ๐Ÿ“ž Get Help + +### Issues & Questions + +If you need help or found a bug: +1. Check existing [issues](https://github.com/Akylas/OSS-DocumentScanner/issues) +2. Search the documentation +3. Create a new issue with: + - Clear description + - Steps to reproduce + - Screenshots if applicable + - App version and device info + +### Community + +- ๐Ÿ“ง [GitHub Issues](https://github.com/Akylas/OSS-DocumentScanner/issues) - Bug reports and feature requests +- ๐Ÿ“– [Documentation](/document-scanner/getting-started) - Guides and tutorials +- ๐ŸŒ [Weblate](https://hosted.weblate.org/engage/oss-document-scanner/) - Translation discussions + +## ๐Ÿ“Š Project Stats + +![GitHub stars](https://img.shields.io/github/stars/Akylas/OSS-DocumentScanner?style=social) +![Contributors](https://img.shields.io/github/contributors/Akylas/OSS-DocumentScanner) +![Downloads](https://img.shields.io/github/downloads/Akylas/OSS-DocumentScanner/total.svg) +![License](https://img.shields.io/github/license/Akylas/OSS-DocumentScanner) + +## ๐Ÿ™ Thank You + +A huge thank you to: +- All sponsors and contributors +- Translation contributors on Weblate +- Everyone who reported issues and suggested features +- The open source community +- All users of the apps + +Your support makes these apps possible! + +## ๐Ÿ“œ Code of Conduct + +This project follows the [Contributor Covenant Code of Conduct](https://github.com/Akylas/OSS-DocumentScanner/blob/master/COC.md). Please be respectful and constructive in all interactions. + +## ๐Ÿ“„ License + +Both apps are released under the [MIT License](https://github.com/Akylas/OSS-DocumentScanner/blob/master/LICENSE), which means: +- โœ… Free to use +- โœ… Free to modify +- โœ… Free to distribute +- โœ… Commercial use allowed