diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 0000000..a5a3182 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,41 @@ +name: Deploy Docs + +on: + push: + branches: + - main + paths: + - "docs/**" + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: cd docs && npm ci + + - name: Build docs + run: cd docs && npm run docs:build + + # Primary: Cloudflare Pages + - name: Deploy to Cloudflare Pages + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy docs/.vitepress/dist --project-name=arandu-docs + + # Fallback: GitHub Pages + - name: Deploy to GitHub Pages (fallback) + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./docs/.vitepress/dist diff --git a/.gitignore b/.gitignore index 7d4a172..28693e5 100644 --- a/.gitignore +++ b/.gitignore @@ -101,3 +101,8 @@ yarn-error.log* # Examples (private reference files) examples/ + +# Docs +docs/.vitepress/dist +docs/.vitepress/cache +docs/node_modules diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts new file mode 100644 index 0000000..fdaf675 --- /dev/null +++ b/docs/.vitepress/config.ts @@ -0,0 +1,56 @@ +import { defineConfig } from 'vitepress' +import { ptBR } from './locales/pt-BR' +import { en } from './locales/en' + +export default defineConfig({ + title: 'Arandu', + description: 'Markdown viewer and AI workspace', + cleanUrls: true, + lastUpdated: true, + + head: [ + ['link', { rel: 'icon', type: 'image/svg+xml', href: '/icon.svg' }], + ['link', { rel: 'icon', type: 'image/png', sizes: '32x32', href: '/favicon-32x32.png' }], + ['link', { rel: 'apple-touch-icon', href: '/apple-touch-icon.png' }], + ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }], + ['link', { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' }], + [ + 'link', + { + rel: 'stylesheet', + href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap' + } + ], + ['meta', { name: 'theme-color', content: '#2D1B69' }], + ['meta', { property: 'og:type', content: 'website' }], + ['meta', { property: 'og:title', content: 'Arandu — Markdown viewer and AI workspace' }], + [ + 'meta', + { + property: 'og:description', + content: 'Markdown viewer and AI workspace for macOS, Linux, and Windows.' + } + ] + ], + + locales: { + root: { + label: 'Português', + lang: 'pt-BR', + ...ptBR + }, + en: { + label: 'English', + lang: 'en-US', + ...en + } + }, + + themeConfig: { + logo: '/icon.svg', + socialLinks: [{ icon: 'github', link: 'https://github.com/devitools/arandu' }], + search: { + provider: 'local' + } + } +}) diff --git a/docs/.vitepress/locales/en.ts b/docs/.vitepress/locales/en.ts new file mode 100644 index 0000000..7506703 --- /dev/null +++ b/docs/.vitepress/locales/en.ts @@ -0,0 +1,106 @@ +import type { DefaultTheme, LocaleSpecificConfig } from 'vitepress' + +export const en: LocaleSpecificConfig = { + title: 'Arandu', + description: 'Markdown viewer and AI workspace', + themeConfig: { + nav: [ + { text: 'Guide', link: '/en/guide/introduction', activeMatch: '/en/guide/' }, + { text: 'Features', link: '/en/features/markdown', activeMatch: '/en/features/' }, + { text: 'Reference', link: '/en/reference/cli', activeMatch: '/en/reference/' }, + { + text: 'Download', + link: 'https://github.com/devitools/arandu/releases/latest' + } + ], + sidebar: { + '/en/guide/': [ + { + text: 'Getting Started', + items: [ + { text: 'Introduction', link: '/en/guide/introduction' }, + { text: 'Installation', link: '/en/guide/installation' }, + { text: 'Quick Start', link: '/en/guide/quick-start' } + ] + }, + { + text: 'Essentials', + items: [ + { text: 'Viewing Markdown', link: '/en/guide/viewing-markdown' }, + { text: 'Navigation', link: '/en/guide/navigation' }, + { text: 'Themes', link: '/en/guide/themes' }, + { text: 'Keyboard Shortcuts', link: '/en/guide/shortcuts' } + ] + } + ], + '/en/features/': [ + { + text: 'Viewing', + items: [ + { text: 'Markdown', link: '/en/features/markdown' }, + { text: 'Live Reload', link: '/en/features/live-reload' }, + { text: 'Themes', link: '/en/features/themes' } + ] + }, + { + text: 'Voice', + items: [ + { text: 'Whisper', link: '/en/features/whisper' }, + { text: 'Whisper Configuration', link: '/en/features/whisper-config' } + ] + }, + { + text: 'Workspace', + items: [ + { text: 'Workspace', link: '/en/features/workspace' }, + { text: 'Sessions & Modes', link: '/en/features/sessions' }, + { text: 'Plan', link: '/en/features/plan' } + ] + }, + { + text: 'Review', + items: [ + { text: 'Comments', link: '/en/features/comments' }, + { text: 'Review', link: '/en/features/review' }, + { text: 'Integrations', link: '/en/features/integrations' } + ] + } + ], + '/en/reference/': [ + { + text: 'Reference', + items: [ + { text: 'CLI', link: '/en/reference/cli' }, + { text: 'IPC', link: '/en/reference/ipc' }, + { text: 'Settings', link: '/en/reference/settings' }, + { text: 'Languages', link: '/en/reference/languages' } + ] + } + ] + }, + editLink: { + pattern: 'https://github.com/devitools/arandu/edit/main/docs/:path', + text: 'Edit this page on GitHub' + }, + lastUpdated: { + text: 'Updated at', + formatOptions: { dateStyle: 'short' } + }, + docFooter: { + prev: 'Previous', + next: 'Next' + }, + outline: { + label: 'On this page' + }, + returnToTopLabel: 'Return to top', + sidebarMenuLabel: 'Menu', + darkModeSwitchLabel: 'Theme', + lightModeSwitchTitle: 'Switch to light mode', + darkModeSwitchTitle: 'Switch to dark mode', + footer: { + message: 'Released under the MIT License.', + copyright: 'Copyright © 2024 devitools' + } + } +} diff --git a/docs/.vitepress/locales/pt-BR.ts b/docs/.vitepress/locales/pt-BR.ts new file mode 100644 index 0000000..b2e50b2 --- /dev/null +++ b/docs/.vitepress/locales/pt-BR.ts @@ -0,0 +1,106 @@ +import type { DefaultTheme, LocaleSpecificConfig } from 'vitepress' + +export const ptBR: LocaleSpecificConfig = { + title: 'Arandu', + description: 'Visualizador de Markdown e workspace com IA', + themeConfig: { + nav: [ + { text: 'Guia', link: '/guia/introducao', activeMatch: '/guia/' }, + { text: 'Funcionalidades', link: '/funcionalidades/markdown', activeMatch: '/funcionalidades/' }, + { text: 'Referência', link: '/referencia/cli', activeMatch: '/referencia/' }, + { + text: 'Download', + link: 'https://github.com/devitools/arandu/releases/latest' + } + ], + sidebar: { + '/guia/': [ + { + text: 'Primeiros Passos', + items: [ + { text: 'Introdução', link: '/guia/introducao' }, + { text: 'Instalação', link: '/guia/instalacao' }, + { text: 'Início Rápido', link: '/guia/inicio-rapido' } + ] + }, + { + text: 'Essenciais', + items: [ + { text: 'Visualizando Markdown', link: '/guia/visualizando-markdown' }, + { text: 'Navegação', link: '/guia/navegacao' }, + { text: 'Temas', link: '/guia/temas' }, + { text: 'Atalhos de Teclado', link: '/guia/atalhos' } + ] + } + ], + '/funcionalidades/': [ + { + text: 'Visualização', + items: [ + { text: 'Markdown', link: '/funcionalidades/markdown' }, + { text: 'Live Reload', link: '/funcionalidades/live-reload' }, + { text: 'Temas', link: '/funcionalidades/temas' } + ] + }, + { + text: 'Voz', + items: [ + { text: 'Whisper', link: '/funcionalidades/whisper' }, + { text: 'Configuração do Whisper', link: '/funcionalidades/whisper-config' } + ] + }, + { + text: 'Workspace', + items: [ + { text: 'Workspace', link: '/funcionalidades/workspace' }, + { text: 'Sessões e Modos', link: '/funcionalidades/sessoes' }, + { text: 'Plano', link: '/funcionalidades/plano' } + ] + }, + { + text: 'Revisão', + items: [ + { text: 'Comentários', link: '/funcionalidades/comentarios' }, + { text: 'Review', link: '/funcionalidades/review' }, + { text: 'Integrações', link: '/funcionalidades/integracoes' } + ] + } + ], + '/referencia/': [ + { + text: 'Referência', + items: [ + { text: 'CLI', link: '/referencia/cli' }, + { text: 'IPC', link: '/referencia/ipc' }, + { text: 'Configurações', link: '/referencia/configuracoes' }, + { text: 'Idiomas', link: '/referencia/idiomas' } + ] + } + ] + }, + editLink: { + pattern: 'https://github.com/devitools/arandu/edit/main/docs/:path', + text: 'Editar esta página no GitHub' + }, + lastUpdated: { + text: 'Atualizado em', + formatOptions: { dateStyle: 'short' } + }, + docFooter: { + prev: 'Anterior', + next: 'Próximo' + }, + outline: { + label: 'Nesta página' + }, + returnToTopLabel: 'Voltar ao topo', + sidebarMenuLabel: 'Menu', + darkModeSwitchLabel: 'Tema', + lightModeSwitchTitle: 'Mudar para modo claro', + darkModeSwitchTitle: 'Mudar para modo escuro', + footer: { + message: 'Lançado sob a licença MIT.', + copyright: 'Copyright © 2024 devitools' + } + } +} diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css new file mode 100644 index 0000000..43115cf --- /dev/null +++ b/docs/.vitepress/theme/custom.css @@ -0,0 +1,51 @@ +:root { + --vp-font-family-base: 'Inter', sans-serif; + --vp-font-family-mono: 'JetBrains Mono', monospace; + + /* Brand colors - Light mode */ + --vp-c-brand-1: #2d1b69; + --vp-c-brand-2: #3d2689; + --vp-c-brand-3: #4d31a9; + --vp-c-brand-soft: rgba(45, 27, 105, 0.1); + + /* Tip/info colors - Gold accent */ + --vp-c-tip-1: #d4821e; + --vp-c-tip-2: #f4c430; + --vp-c-tip-soft: rgba(244, 196, 48, 0.1); +} + +.dark { + /* Brand colors - Dark mode */ + --vp-c-brand-1: #8b7bc7; + --vp-c-brand-2: #9d8fd4; + --vp-c-brand-3: #af9fd0; + --vp-c-brand-soft: rgba(139, 123, 199, 0.16); + + /* Tip/info colors - Gold accent */ + --vp-c-tip-1: #f4c430; + --vp-c-tip-2: #d4821e; + --vp-c-tip-soft: rgba(244, 196, 48, 0.16); +} + +/* Hero gradient on name */ +.VPHero .name .clip { + background: linear-gradient(135deg, #f4c430, #d4821e) !important; + -webkit-background-clip: text !important; + -webkit-text-fill-color: transparent !important; + background-clip: text !important; +} + +/* Pronunciation helper class */ +.pronunciation { + font-style: italic; + color: var(--vp-c-text-2); + font-size: 0.95em; +} + +.pronunciation .ipa { + font-family: var(--vp-font-family-mono); + background: var(--vp-c-bg-soft); + padding: 2px 6px; + border-radius: 4px; + font-style: normal; +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..42fe9a9 --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,4 @@ +import DefaultTheme from 'vitepress/theme' +import './custom.css' + +export default DefaultTheme diff --git a/docs/en/features/comments.md b/docs/en/features/comments.md new file mode 100644 index 0000000..93418d5 --- /dev/null +++ b/docs/en/features/comments.md @@ -0,0 +1,56 @@ +# Block Comments + +Arandu's comment system lets you add annotations to any block in a Markdown document — perfect for reviewing AI-generated plans. + +## How to add a comment + +**Cmd+Click** (macOS) or **Ctrl+Click** (Linux/Windows) on any block in the document: + +- Paragraph +- List item +- Code block +- Blockquote +- Heading + +A side panel opens with a text field for the comment. + +## Block ID system + +Each block receives a unique ID based on its type and position: + +| Type | ID format | +|------|-----------| +| Paragraph | `para-{hash}` | +| List | `list-{hash}` | +| Code | `code-{hash}` | +| Blockquote | `quote-{hash}` | +| Heading | `heading-{hash}` | + +This allows comments to be associated with the correct block even after minor document edits. + +## Visual indicators + +- Blocks with comments display a **badge** with the comment count +- The badge is visible without clicking +- Unresolved comments are highlighted in yellow + +## Resolving and unresolving + +Each comment can be marked as resolved: +- Click **✓ Resolve** on the comment +- The block's badge is updated +- Resolved comments are displayed with a distinct style + +## Staleness detection + +If the file is modified externally, Arandu compares the current file hash with the stored hash. Comments on blocks that have changed are marked as **stale**. + +## Persistence + +Comments are stored in SQLite: +- `~/.local/share/arandu/comments.db` (Linux/Windows) +- `~/Library/Application Support/com.devitools.arandu/comments.db` (macOS) + +## Review prompt + +The review panel aggregates all unresolved comments into a consolidated prompt, ready to send to the agent. See [Review](/en/features/review). diff --git a/docs/en/features/integrations.md b/docs/en/features/integrations.md new file mode 100644 index 0000000..48e875b --- /dev/null +++ b/docs/en/features/integrations.md @@ -0,0 +1,84 @@ +# Integrations + +## Shell aliases + +Configure aliases to integrate Arandu into your workflow: + +```bash +# Open project documentation +alias docs='arandu README.md' + +# Use Arandu as EDITOR for agents +alias claude='EDITOR=arandu claude' +``` + +## EDITOR variable + +Arandu can be used as the default editor (`$EDITOR`) for any application that opens files for editing: + +```bash +export EDITOR=arandu +``` + +## IPC (Inter-Process Communication) + +Arandu exposes two IPC interfaces for automation and integration: + +### Unix Socket (macOS/Linux) +``` +~/.arandu/arandu.sock +``` + +### TCP +``` +127.0.0.1:7474 +``` + +### Available commands + +| Command | Description | +|---------|-------------| +| `open ` | Opens a file in Arandu | +| `ping` | Health check | +| `show` | Brings Arandu to focus | + +### Usage example + +```bash +# Open file via TCP +echo '{"command":"open","args":["README.md"]}' | nc 127.0.0.1 7474 + +# Health check +echo '{"command":"ping"}' | nc 127.0.0.1 7474 +``` + +## Multi-window + +Arandu supports multiple simultaneous windows, each with its own file. This allows comparing documents side by side. + +## Editor integrations + +### VS Code +Use the integrated task to open the preview in Arandu: + +```json +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Preview in Arandu", + "type": "shell", + "command": "arandu ${file}" + } + ] +} +``` + +### Neovim + +```lua +-- Open current file in Arandu +vim.keymap.set('n', 'mp', function() + vim.fn.system('arandu ' .. vim.fn.expand('%')) +end) +``` diff --git a/docs/en/features/live-reload.md b/docs/en/features/live-reload.md new file mode 100644 index 0000000..8aad295 --- /dev/null +++ b/docs/en/features/live-reload.md @@ -0,0 +1,44 @@ +# Live Reload + +Arandu watches the open file and automatically updates the preview when the file is modified. + +## How it works + +1. You open a `.md` file in Arandu +2. Edit the file in any editor (VS Code, Vim, nano, etc.) +3. On save, Arandu detects the change and re-renders instantly + +No browser extension or special configuration is required. + +## Implementation + +File watching is implemented in the Rust backend using the [notify](https://docs.rs/notify/) crate. Arandu monitors the file via inotify (Linux), FSEvents (macOS), or ReadDirectoryChangesW (Windows). + +## Use cases + +### Editing with VS Code + +```bash +code my-document.md # open in VS Code +arandu my-document.md # open preview in Arandu +``` + +Edit in VS Code, see the result in Arandu in real time. + +### Pipeline with scripts + +```bash +# Generate Markdown and open preview +python generate-report.py > report.md +arandu report.md +``` + +### With AI agents + +When a coding agent is generating or editing a `.md` plan, Arandu displays the changes in real time. + +## Behavior + +- Scroll position is preserved after reload (when possible) +- If the file is deleted, Arandu displays a warning message +- Watching is automatically cancelled when the window is closed diff --git a/docs/en/features/markdown.md b/docs/en/features/markdown.md new file mode 100644 index 0000000..235a720 --- /dev/null +++ b/docs/en/features/markdown.md @@ -0,0 +1,48 @@ +# Markdown + +Arandu renders GitHub Flavored Markdown (GFM) using [comrak](https://github.com/kivikakk/comrak), the same library used by professional Markdown processing tools. + +## GitHub Flavored Markdown + +Full compliance with the GFM specification: + +- ✅ Tables +- ✅ Task lists +- ✅ Strikethrough (`~~text~~`) +- ✅ Autolinks (`https://...`) +- ✅ Footnotes +- ✅ Inline HTML (sanitized) +- ✅ Code blocks with language +- ✅ Blockquotes +- ✅ Horizontal rules +- ✅ Headings with anchors + +## Syntax highlighting + +Code blocks are automatically highlighted by [highlight.js](https://highlightjs.org/) with support for over 190 languages. The theme changes automatically with the interface's light/dark theme. + +### Example + +````markdown +```rust +fn main() { + println!("Hello, Arandu!"); +} +``` +```` + +## Extensions + +Beyond standard GFM, Arandu supports: + +- **Superscript**: `x^2^` +- **Footnotes**: `[^1]` +- **Table of contents**: automatically generated with the sidebar outline + +## Backend rendering + +Markdown is rendered in the Rust process (Tauri backend) and sent as HTML to the frontend. This ensures: + +- **Security**: Sanitized HTML, no script execution +- **Performance**: Fast rendering even for large documents +- **Fidelity**: Behavior identical to GitHub diff --git a/docs/en/features/plan.md b/docs/en/features/plan.md new file mode 100644 index 0000000..d1850a5 --- /dev/null +++ b/docs/en/features/plan.md @@ -0,0 +1,55 @@ +# Plan Workflow + +The plan workflow is a structured way to work with AI agents: generate a plan, review it with comments, and only then execute. + +## Phases + +The plan goes through four phases: + +``` +idle → planning → reviewing → executing +``` + +### idle +Initial state. No active plan in the session. + +### planning +The agent is generating the plan. The document is written in real time and displayed in Arandu via live reload. + +### reviewing +The plan has been generated. You can: +- Read the document in the view panel +- Add comments on specific blocks (`Cmd/Ctrl+Click`) +- See the consolidated review prompt +- Approve or request revisions + +### executing +The plan has been approved. The agent is executing the changes. + +## Plan file + +The plan is saved as a Markdown file in: +``` +~/.local/share/arandu/plans/{session_id}.md +``` + +You can open this file directly in Arandu for detailed review. + +## Commenting on the plan + +During the **reviewing** phase, use `Cmd/Ctrl+Click` on any plan block to add a comment. Comments are aggregated into a review prompt that can be sent back to the agent. + +## Approving and executing + +After reviewing: +1. Click **Approve Plan** to advance to the `executing` phase +2. The agent receives the approval signal and begins execution +3. Track progress in the session + +## Rejecting and revising + +If the plan needs improvement: +1. Add comments on the problematic blocks +2. Click **Request Revision** to send the review prompt to the agent +3. The agent generates a revised version +4. The workflow returns to the `reviewing` phase diff --git a/docs/en/features/review.md b/docs/en/features/review.md new file mode 100644 index 0000000..b9e2838 --- /dev/null +++ b/docs/en/features/review.md @@ -0,0 +1,70 @@ +# Review — Document Review + +Arandu works as a review tool for plans and documents generated by AI agents. + +## Two review modes + +### Comments mode +Lists all unresolved comments from the current document, organized by block. + +### Review mode +Generates a consolidated review prompt with all comments, ready to be sent to the agent. + +## Main use case: `EDITOR=arandu` + +Configure Arandu as your default editor when working with coding agents in the terminal: + +```bash +# ~/.bashrc or ~/.zshrc +alias claude='EDITOR=arandu ~/.local/bin/claude' +alias copilot='EDITOR=arandu gh copilot' +``` + +### Workflow + +``` +1. Agent generates plan → writes to .md file +2. Arandu opens automatically as EDITOR +3. You read the plan and add comments (Cmd/Ctrl+Click) +4. Click "Generate review prompt" +5. Copy the prompt and send to the agent +6. Agent revises and generates a new version +7. Repeat until approved +``` + +### Example with claude + +```bash +alias claude='EDITOR=arandu ~/.local/bin/claude' +claude "create an implementation plan for adding JWT authentication" +# Arandu opens automatically with the generated plan +# You review, comment, and send feedback +``` + +## Review prompt + +The generated prompt follows this format: + +``` +Plan review: {filename} + +Comments by block: + +[Block: "## Architecture"] +- The cache layer seems unnecessary for the MVP. Remove for now. + +[Block: "### Implementation"] +- Please add unit tests to the plan. + +Please revise the plan considering these points. +``` + +## Integration with the plan workflow + +The review system is integrated with the workspace plan workflow: + +1. `plan` mode → agent generates plan +2. `reviewing` phase → you comment +3. "Request Revision" → prompt sent to agent +4. `planning` phase again → agent revises +5. `reviewing` phase → approval or another round diff --git a/docs/en/features/sessions.md b/docs/en/features/sessions.md new file mode 100644 index 0000000..a74e502 --- /dev/null +++ b/docs/en/features/sessions.md @@ -0,0 +1,62 @@ +# Sessions & Interaction Modes + +## What are sessions + +A session is a persistent conversation with a coding agent within a workspace. Each session has: + +- Full message history +- Current interaction mode +- Associated plan (optional) +- Execution phase (idle, planning, reviewing, executing) + +Sessions are stored in SQLite and maintained between app restarts. + +## Interaction modes + +Arandu supports six interaction modes with the agent: + +### ask +Conversational mode for general questions. Ideal for: +- Exploring the codebase +- Understanding architectural decisions +- Getting technical answers + +### plan +Generates a structured plan document. The plan is saved as a Markdown file and displayed in Arandu for review. Ideal for: +- Planning new features +- Creating implementation roadmaps +- Defining architecture + +### code +Generates or modifies code. The agent has access to the project context and can: +- Create new files +- Modify existing code +- Refactor + +### edit +Applies targeted, surgical edits to files. More precise than `code` mode for specific changes. + +### agent +Autonomous multi-step execution. The agent decides the actions needed to complete the task. + +### autopilot +Fully automated execution. The agent completes the task without requesting intermediate confirmations. + +::: warning +Use `agent` and `autopilot` modes with care — they can make sweeping modifications to your project. +::: + +## Response streaming + +Agent responses are streamed in real time, with support for cancellation at any time. + +## Creating a session + +1. Open a workspace +2. Click **New Session** +3. Select the initial mode +4. Type your first prompt + +## Switching between sessions + +Use the workspace sidebar to navigate between existing sessions. Each session is identified by a name and creation date. diff --git a/docs/en/features/themes.md b/docs/en/features/themes.md new file mode 100644 index 0000000..cd20600 --- /dev/null +++ b/docs/en/features/themes.md @@ -0,0 +1,45 @@ +# Theme System + +Arandu uses a monochrome design system with HSL CSS variables, allowing smooth toggling between themes. + +## Theme modes + +### System +Automatically detects the operating system preference via `prefers-color-scheme`. If the system changes, Arandu follows. + +### Light +White/light gray background, dark text. Ideal for bright environments. + +### Dark +Dark gray/black background, light text. Reduces eye strain in low-light environments. + +## CSS variables + +The theme is implemented with CSS variables at the `` level: + +```css +:root { + --bg: hsl(0, 0%, 100%); + --text: hsl(0, 0%, 13%); + --border: hsl(0, 0%, 87%); + --code-bg: hsl(0, 0%, 95%); +} + +[data-theme="dark"] { + --bg: hsl(0, 0%, 10%); + --text: hsl(0, 0%, 93%); + --border: hsl(0, 0%, 25%); + --code-bg: hsl(0, 0%, 16%); +} +``` + +## Multi-window synchronization + +The selected theme is stored in `localStorage` and synchronized across all open windows via the `storage` event. The settings window and Whisper window follow the main window's theme. + +## Syntax highlighting + +Code highlighting also toggles between light and dark themes: + +- **Light**: GitHub Light +- **Dark**: GitHub Dark diff --git a/docs/en/features/whisper-config.md b/docs/en/features/whisper-config.md new file mode 100644 index 0000000..38327b4 --- /dev/null +++ b/docs/en/features/whisper-config.md @@ -0,0 +1,52 @@ +# Whisper Configuration + +Go to **Settings → Voice to Text** to configure Whisper. + +## Models + +### Download + +Models are not pre-installed. The first time, go to **Settings → Voice to Text → Download model** and choose the size: + +| Model | Size | RAM usage | Best for | +|-------|------|-----------|----------| +| tiny | ~75 MB | ~200 MB | Quick use, limited hardware | +| base | ~140 MB | ~300 MB | General use (recommended) | +| small | ~460 MB | ~600 MB | Technical content | +| medium | ~1.5 GB | ~2 GB | Maximum precision | + +### Switching models + +You can download multiple models and switch between them at any time. The active model is highlighted in settings. + +## Audio device + +By default, Arandu uses the system's default microphone. To use another device: + +1. Go to **Settings → Voice to Text → Audio device** +2. Select the desired device from the list +3. Test it by clicking **Test** + +## Recording shortcut + +The default shortcut is **Alt+Space**. To customize: + +1. Go to **Settings → Voice to Text → Recording Shortcut** +2. Click the field and press the desired combination +3. Save + +::: warning Shortcut conflicts +Make sure the chosen shortcut doesn't conflict with other system applications. +::: + +## Transcription language + +Whisper automatically detects the spoken language. To force a specific language, configure it in **Settings → Voice to Text → Language**. + +## Model storage + +Models are stored in: + +- **macOS**: `~/Library/Application Support/com.devitools.arandu/whisper-models/` +- **Linux**: `~/.local/share/com.devitools.arandu/whisper-models/` +- **Windows**: `%APPDATA%\com.devitools.arandu\whisper-models\` diff --git a/docs/en/features/whisper.md b/docs/en/features/whisper.md new file mode 100644 index 0000000..7adb76c --- /dev/null +++ b/docs/en/features/whisper.md @@ -0,0 +1,59 @@ +# Whisper — Voice to Text + +Arandu integrates [whisper.cpp](https://github.com/ggerganov/whisper.cpp) for offline voice transcription, directly on the device. + +## Why it matters + +Working with AI agents requires heavy typing. Formulating prompts, describing bugs, detailing requirements — all of this competes with the time you spend actually developing. + +Voice transcription changes this dynamic: + +- **Speed**: Speaking is 3x faster than typing +- **Context**: Easier to express nuances in natural language +- **Ergonomics**: Reduces strain on your wrists +- **Privacy**: Everything processes locally, no audio sent to the cloud + +## How it works + +Arandu includes compiled whisper.cpp — a C++ transcription engine that runs OpenAI's Whisper models directly on your hardware, without needing internet or API keys. + +## Using Whisper + +### Global shortcut + +Press **Alt+Space** (configurable) from anywhere in the system — even with Arandu in the background. The floating recording window appears. + +### Recording window + +1. The window appears at the top of the screen (always-on-top) +2. Click the microphone or wait for automatic start +3. Speak your text +4. Click to stop — the transcription is copied to the clipboard + +### Two output modes + +| Mode | Behavior | +|------|----------| +| **Field** | Text is inserted directly into the active text field | +| **Clipboard** | Text is copied — you paste wherever you want | + +## Available models + +| Model | Size | Speed | Recommendation | +|-------|------|-------|----------------| +| tiny | ~75 MB | Very fast | Quick notes, short commands | +| base | ~140 MB | Fast | General use — **recommended to start** | +| small | ~460 MB | Moderate | Technical content, variable names | +| medium | ~1.5 GB | Slow | Maximum precision, complex documentation | + +Models are downloaded automatically on first use (via **Settings → Voice to Text**). + +## Privacy + +- No audio is sent to external servers +- Models run entirely on the local CPU/GPU +- Audio files are processed in memory and discarded + +## Next steps + +- [Whisper Configuration](/en/features/whisper-config) — models, devices, shortcuts diff --git a/docs/en/features/workspace.md b/docs/en/features/workspace.md new file mode 100644 index 0000000..c84f748 --- /dev/null +++ b/docs/en/features/workspace.md @@ -0,0 +1,64 @@ +# Workspace + +A Workspace is a project directory connected to a coding agent via ACP (Agent Communication Protocol). + +## What is a Workspace + +When you open a folder in Arandu as a workspace, you're creating a work context where: + +1. **Sessions** are linked to the project directory +2. **An agent** (e.g., GitHub Copilot CLI) is connected via ACP +3. **Plans** are generated, reviewed, and executed within that context + +## Opening a Workspace + +1. On the home screen, click **Open Workspace** +2. Select the project directory +3. Click **Connect** to start a session with the agent + +Or via CLI: + +```bash +arandu /path/to/project +``` + +## How the ACP connection works + +Arandu communicates with coding agents via JSON-RPC 2.0 over stdin/stdout: + +``` +Arandu (frontend) → Tauri (Rust) → github-copilot --acp --stdio + ↑ stdin/stdout +``` + +The agent needs to support the ACP protocol. Currently, [GitHub Copilot CLI](https://github.com/github/gh-copilot) is the tested and supported agent. + +## Session management + +Each workspace can have multiple sessions, each with: + +- Full message history +- Current interaction mode +- Associated plan (if any) +- Plan phase (idle, planning, reviewing, executing) + +Sessions are persisted in SQLite and restored automatically. + +## Typical workflow + +``` +1. Open workspace (project directory) +2. Connect agent +3. Create session +4. Use "ask" mode to explore the context +5. Use "plan" mode to create an implementation plan +6. Review the plan with inline comments +7. Use "code" or "agent" mode to execute +``` + +## Supported agents + +| Agent | Status | +|-------|--------| +| GitHub Copilot CLI | ✅ Supported | +| Other ACP agents | 🔜 Planned | diff --git a/docs/en/guide/installation.md b/docs/en/guide/installation.md new file mode 100644 index 0000000..5cf3f1b --- /dev/null +++ b/docs/en/guide/installation.md @@ -0,0 +1,63 @@ +# Installation + +Arandu is available for macOS, Linux, and Windows. + +## macOS + +### Homebrew (recommended) + +```bash +brew install --cask devitools/arandu/arandu +``` + +This installs the application and configures the CLI automatically. + +### Manual download + +1. Go to the [releases page](https://github.com/devitools/arandu/releases/latest) +2. Download the correct file for your Mac: + - **Apple Silicon (M1/M2/M3)**: `arandu_VERSION_aarch64.dmg` + - **Intel**: `arandu_VERSION_x86_64.dmg` +3. Open the `.dmg` and drag Arandu to the Applications folder + +### Command line tool + +On first launch, Arandu offers to install the CLI automatically. You can also install it via the **Arandu → Install Command Line Tool…** menu. + +## Linux + +### Manual download + +1. Go to the [releases page](https://github.com/devitools/arandu/releases/latest) +2. Download the file for Linux x86_64: + - **AppImage** (universal): `arandu_VERSION_amd64.AppImage` + - **Debian/Ubuntu**: `arandu_VERSION_amd64.deb` + +#### AppImage + +```bash +chmod +x arandu_VERSION_amd64.AppImage +./arandu_VERSION_amd64.AppImage +``` + +#### .deb (Debian/Ubuntu) + +```bash +sudo dpkg -i arandu_VERSION_amd64.deb +``` + +## Windows + +1. Go to the [releases page](https://github.com/devitools/arandu/releases/latest) +2. Download `arandu_VERSION_x64-setup.exe` +3. Run the installer + +## Verifying the installation + +After installing, open a terminal and run: + +```bash +arandu --version +``` + +If the CLI is not in the PATH, open Arandu and use the **Arandu → Install Command Line Tool…** menu. diff --git a/docs/en/guide/introduction.md b/docs/en/guide/introduction.md new file mode 100644 index 0000000..cc06f41 --- /dev/null +++ b/docs/en/guide/introduction.md @@ -0,0 +1,34 @@ +# Introduction + +**Arandu** /a.ɾan.ˈdu/ is a Markdown viewer and AI workspace for macOS, Linux, and Windows. The name comes from Guarani and means *wisdom* — a reflection of its mission: to be a space where you read, think, and create with clarity. + +## The three pillars + +### 1. Markdown Viewer + +Arandu renders GitHub Flavored Markdown with full fidelity: tables, task lists, strikethrough, autolinks, code blocks with syntax highlighting. Open any `.md` file and it's displayed with clean typography and sidebar outline navigation. + +### 2. AI Workspace + +Connect GitHub Copilot (or another ACP-compatible agent) to a project directory. Work in structured sessions with six interaction modes: **ask**, **plan**, **code**, **edit**, **agent**, and **autopilot**. Review plans with inline comments before executing. + +### 3. Review Tool + +Use Arandu as your `$EDITOR` when working with coding agents. The agent generates a plan → Arandu opens as editor → you comment on blocks inline → generate a review prompt → feedback to the agent. + +## Design philosophy + +- **Monochrome**: The interface doesn't compete with the content. Neutral background, clear typography. +- **Reading-focused**: Maximum width, generous spacing, no distractions. +- **Offline-first**: Whisper runs on device. No cloud dependencies. +- **Terminal integration**: CLI, IPC via Unix socket and TCP. + +## Prerequisites + +- macOS 13+, Linux x86_64, or Windows x86_64 +- For the AI workspace: GitHub Copilot CLI installed locally + +## Next steps + +- [Installation](/en/guide/installation) — how to install via Homebrew or manual download +- [Quick Start](/en/guide/quick-start) — open your first file in 2 minutes diff --git a/docs/en/guide/navigation.md b/docs/en/guide/navigation.md new file mode 100644 index 0000000..4478e24 --- /dev/null +++ b/docs/en/guide/navigation.md @@ -0,0 +1,39 @@ +# Navigation + +## Sidebar outline + +The left panel automatically displays all headings from the open file. Use it to quickly navigate long documents. + +- **Click** any item to navigate with smooth scroll +- **Nested headings** are displayed with indentation (H1 > H2 > H3) +- The active item is highlighted as you scroll the document + +## Keyboard shortcuts + +| Shortcut | Action | +|----------|--------| +| `Cmd/Ctrl+O` | Open file | +| `Cmd/Ctrl+W` | Close current file | +| `Cmd/Ctrl+,` | Open settings | +| `Alt+Space` | Open voice recording (Whisper) | + +See all shortcuts in [Keyboard Shortcuts](/en/guide/shortcuts). + +## Multiple files + +Open multiple files with: + +```bash +arandu doc1.md doc2.md doc3.md +arandu *.md +``` + +Each file opens in its own window. + +## Home screen + +When Arandu is opened without a file, it displays the home screen with quick access to: + +- Recent files +- Workspace (project directory) +- Open file diff --git a/docs/en/guide/quick-start.md b/docs/en/guide/quick-start.md new file mode 100644 index 0000000..ec1789e --- /dev/null +++ b/docs/en/guide/quick-start.md @@ -0,0 +1,54 @@ +# Quick Start + +This guide takes you from zero to an open Markdown file in under 2 minutes. + +## 1. Install Arandu + +```bash +# macOS via Homebrew +brew install --cask devitools/arandu/arandu + +# Or download from github.com/devitools/arandu/releases/latest +``` + +## 2. Open a file + +### Via CLI + +```bash +arandu README.md +``` + +### Via the GUI + +Open Arandu and click **Open File** on the home screen, or drag a `.md` file onto the window. + +### Via file picker + +Run `arandu` without arguments to open the file picker. + +## 3. Explore the interface + +``` +┌──────────────────────────────────────┐ +│ [≡] Arandu — README.md [☀/☾] │ +├────────────┬─────────────────────────┤ +│ OUTLINE │ │ +│ │ # Title │ +│ > Title │ │ +│ Section │ Text paragraph... │ +│ Section │ │ +│ │ ## Section 1 │ +│ │ ... │ +└────────────┴─────────────────────────┘ +``` + +- **Sidebar outline**: click any heading to navigate +- **Theme button**: toggles between system/light/dark +- **Live reload**: save the file in another editor — Arandu updates automatically + +## 4. Next steps + +- [Viewing Markdown](/en/guide/viewing-markdown) — learn what's supported +- [AI Workspace](/en/features/workspace) — connect a coding agent +- [Whisper](/en/features/whisper) — set up voice to text diff --git a/docs/en/guide/shortcuts.md b/docs/en/guide/shortcuts.md new file mode 100644 index 0000000..b60251e --- /dev/null +++ b/docs/en/guide/shortcuts.md @@ -0,0 +1,35 @@ +# Keyboard Shortcuts + +## Main window + +| Shortcut | Action | +|----------|--------| +| `Cmd/Ctrl+O` | Open file | +| `Cmd/Ctrl+W` | Close window / go back | +| `Cmd/Ctrl+,` | Open settings | +| `Cmd/Ctrl+Shift+T` | Toggle theme | + +## Whisper (voice to text) + +| Shortcut | Action | +|----------|--------| +| `Alt+Space` | Open/close recording window (global) | + +The global shortcut works even when Arandu is not in focus. It can be customized in **Settings → Voice to Text**. + +## Block comments + +| Shortcut | Action | +|----------|--------| +| `Cmd/Ctrl+Click` | Add comment to block | + +## Workspace + +| Shortcut | Action | +|----------|--------| +| `Enter` | Send message to agent | +| `Shift+Enter` | New line in message | + +## Customizing shortcuts + +Global shortcuts (such as the Whisper shortcut) can be configured in **Settings → Voice to Text → Recording Shortcut**. diff --git a/docs/en/guide/themes.md b/docs/en/guide/themes.md new file mode 100644 index 0000000..a5c9cf5 --- /dev/null +++ b/docs/en/guide/themes.md @@ -0,0 +1,25 @@ +# Themes + +Arandu supports three theme modes: + +## Available modes + +| Mode | Description | +|------|-------------| +| **System** | Follows the operating system theme automatically | +| **Light** | Fixed light theme | +| **Dark** | Fixed dark theme | + +## How to switch + +Click the theme button in the top bar of the window. The icon toggles between ☀️ (light), 🌙 (dark), and 💻 (system). + +The selected theme is saved and restored on next launch. + +## Monochrome design + +Arandu uses a monochrome design system based on HSL CSS variables. The interface doesn't compete with the content — neutral grays, clear typography, no highlight colors that distract from reading. + +## Multi-window synchronization + +The theme is synchronized across all open windows (main window, settings, whisper) via localStorage. diff --git a/docs/en/guide/viewing-markdown.md b/docs/en/guide/viewing-markdown.md new file mode 100644 index 0000000..b6d22d3 --- /dev/null +++ b/docs/en/guide/viewing-markdown.md @@ -0,0 +1,61 @@ +# Viewing Markdown + +Arandu uses [comrak](https://github.com/kivikakk/comrak) to render GitHub Flavored Markdown (GFM) with full fidelity. + +## Supported elements + +### Text formatting + +| Syntax | Result | +|--------|--------| +| `**bold**` | **bold** | +| `*italic*` | *italic* | +| `~~strikethrough~~` | ~~strikethrough~~ | +| `` `inline code` `` | `inline code` | + +### Tables + +```markdown +| Column 1 | Column 2 | Column 3 | +|----------|----------|----------| +| value | value | value | +``` + +### Task lists + +```markdown +- [x] Completed task +- [ ] Pending task +``` + +### Code blocks + +Syntax highlighting support for over 190 languages via highlight.js: + +````markdown +```typescript +function greet(name: string): string { + return `Hello, ${name}!` +} +``` +```` + +### Autolinks + +URLs like `https://arandu.app` are automatically converted to clickable links. + +### Footnotes + +```markdown +Text with a footnote[^1]. + +[^1]: Footnote text. +``` + +## Syntax highlighting + +Arandu automatically applies syntax highlighting themes (light/dark) that follow the interface theme. Native support for TypeScript, Rust, Python, Go, Shell, SQL, and over 190 other languages. + +## Reading width + +Content is displayed with an optimized maximum reading width (~80 characters), centered in the window. diff --git a/docs/en/index.md b/docs/en/index.md new file mode 100644 index 0000000..448fb25 --- /dev/null +++ b/docs/en/index.md @@ -0,0 +1,55 @@ +--- +layout: home +title: Arandu +titleTemplate: Markdown viewer and AI workspace + +hero: + name: "Arandu" + text: "Markdown viewer and AI workspace" + tagline: "Read documentation beautifully. Collaborate with AI agents. Transcribe by voice. Cross-platform, built with Tauri." + image: + src: /icon.svg + alt: Arandu + actions: + - theme: brand + text: Get Started + link: /en/guide/introduction + - theme: alt + text: Download + link: https://github.com/devitools/arandu/releases/latest + - theme: alt + text: GitHub + link: https://github.com/devitools/arandu + +features: + - icon: 📖 + title: GitHub Flavored Markdown + details: Tables, task lists, strikethrough, autolinks — all rendered faithfully, just like on GitHub. + - icon: 🤖 + title: AI Workspace + details: Connect GitHub Copilot or another ACP-compatible agent. Work in structured sessions with ask, plan, code, edit, agent, and autopilot modes. + - icon: 🎙️ + title: Voice to Text + details: Offline transcription with whisper.cpp. No API keys, no cloud. Just press Alt+Space. + - icon: 💬 + title: Block Comments + details: Cmd/Ctrl+Click any Markdown block to add a comment. Perfect for reviewing AI-generated plans. + - icon: 🔄 + title: Live Reload + details: Arandu watches your file and updates automatically when you save from any editor. + - icon: 🌙 + title: Themes + details: Switch between system, light, and dark. Monochrome design focused on reading. +--- + +
+ +## About the name + +

+ arandu /a.ɾan.ˈdu/ — from Guarani, meaning wisdom, knowledge. +

+ +A name that reflects the mission: a space where you read, think, and create with clarity. + +
diff --git a/docs/en/reference/cli.md b/docs/en/reference/cli.md new file mode 100644 index 0000000..53716d6 --- /dev/null +++ b/docs/en/reference/cli.md @@ -0,0 +1,54 @@ +# CLI — Command Line Tool + +## Installation + +The CLI is installed automatically on first launch of Arandu (macOS), or can be installed via the **Arandu → Install Command Line Tool…** menu. + +Via Homebrew: +```bash +brew install --cask devitools/arandu/arandu +``` + +## Basic usage + +```bash +arandu # open the file picker +arandu README.md # open a file +arandu doc1.md doc2.md # open multiple files +arandu *.md # open all .md files in directory +arandu /path/to/project # open as workspace +``` + +## Flags + +| Flag | Description | +|------|-------------| +| `--version` | Display the installed version | +| `--help` | Display help | + +## Behavior + +- If Arandu is already running, files are opened via IPC (no new app window) +- If Arandu is not running, the app is launched automatically + +## Installation path + +| System | Path | +|--------|------| +| macOS | `/usr/local/bin/arandu` | +| Linux | `~/.local/bin/arandu` | + +## CLI script + +The CLI is a shell script that communicates with Arandu via IPC: + +```bash +#!/bin/bash +# Try via Unix socket, fallback to TCP +if [ -S "$HOME/.arandu/arandu.sock" ]; then + echo '{"command":"open","args":["'"$1"'"]}' \ + | socat - UNIX-CONNECT:$HOME/.arandu/arandu.sock +else + echo '{"command":"open","args":["'"$1"'"]}' | nc 127.0.0.1 7474 +fi +``` diff --git a/docs/en/reference/ipc.md b/docs/en/reference/ipc.md new file mode 100644 index 0000000..9b15d74 --- /dev/null +++ b/docs/en/reference/ipc.md @@ -0,0 +1,135 @@ +# IPC — Inter-Process Communication + +Arandu exposes an IPC interface for automation and integration with external tools. + +## Transports + +### Unix Domain Socket (macOS/Linux) + +``` +~/.arandu/arandu.sock +``` + +Available only when Arandu is running. + +### TCP + +``` +127.0.0.1:7474 +``` + +Available on all platforms. + +## Protocol + +Messages are newline-terminated JSON (`\n`): + +### Request + +```json +{ + "command": "open", + "args": ["/path/to/file.md"] +} +``` + +### Response + +```json +{ + "success": true +} +``` + +Or on error: + +```json +{ + "success": false, + "error": "File not found" +} +``` + +## Commands + +### open + +Opens a file in Arandu. + +```json +{ + "command": "open", + "args": ["/absolute/path/to/file.md"] +} +``` + +### ping + +Health check — verifies Arandu is running. + +```json +{ + "command": "ping" +} +``` + +Response: `{"success": true, "result": "pong"}` + +### show + +Brings the Arandu window to focus. + +```json +{ + "command": "show" +} +``` + +## Examples + +### Bash + +```bash +# Unix socket +echo '{"command":"open","args":["/home/user/docs/README.md"]}' \ + | socat - UNIX-CONNECT:$HOME/.arandu/arandu.sock + +# TCP +echo '{"command":"open","args":["/home/user/docs/README.md"]}' \ + | nc 127.0.0.1 7474 +``` + +### Python + +```python +import socket +import json + +def send_to_arandu(command, args=None): + msg = json.dumps({"command": command, "args": args or []}) + "\n" + with socket.create_connection(("127.0.0.1", 7474)) as s: + s.sendall(msg.encode()) + return json.loads(s.recv(1024)) + +send_to_arandu("open", ["/path/to/file.md"]) +``` + +### Node.js + +```javascript +const net = require('net'); + +function sendToArandu(command, args = []) { + return new Promise((resolve) => { + const client = net.createConnection(7474, '127.0.0.1', () => { + client.write(JSON.stringify({ command, args }) + '\n'); + }); + client.on('data', (data) => { + resolve(JSON.parse(data.toString())); + client.destroy(); + }); + }); +} + +await sendToArandu('open', ['/path/to/file.md']); +``` diff --git a/docs/en/reference/languages.md b/docs/en/reference/languages.md new file mode 100644 index 0000000..a92f995 --- /dev/null +++ b/docs/en/reference/languages.md @@ -0,0 +1,43 @@ +# Languages + +Arandu supports multiple interface languages. + +## Available languages + +| Language | Code | Status | +|----------|------|--------| +| Português (Brasil) | `pt-BR` | ✅ Default | +| English | `en` | ✅ Available | + +## Changing the language + +Go to **Settings → Language** and select the desired language. The change is applied immediately across all open windows and the system tray menu. + +## Translation files + +The translation files are located at: + +``` +apps/tauri/src/locales/ +├── pt-BR.json # Portuguese (Brazil) +└── en.json # English +``` + +## Contributing translations + +To add a new language or improve an existing translation: + +1. Fork the repository at [github.com/devitools/arandu](https://github.com/devitools/arandu) +2. Copy `apps/tauri/src/locales/en.json` as a base +3. Create the file `apps/tauri/src/locales/{code}.json` +4. Translate all values (keep the keys) +5. Add the language in `apps/tauri/src/lib/i18n.ts` +6. Open a Pull Request + +## Cross-window synchronization + +The language is stored in `localStorage('arandu-language')` and synchronized across all open windows via the `storage` event. The system tray menu is also updated via the `update_tray_labels` Tauri command. + +## Technical implementation + +Arandu uses [i18next](https://www.i18next.com/) with the `react-i18next` plugin. The configuration is in `apps/tauri/src/lib/i18n.ts`. diff --git a/docs/en/reference/settings.md b/docs/en/reference/settings.md new file mode 100644 index 0000000..6638a0e --- /dev/null +++ b/docs/en/reference/settings.md @@ -0,0 +1,51 @@ +# Settings + +Access settings via **Arandu → Preferences…** or `Cmd/Ctrl+,`. + +## Appearance + +### Theme +- **System**: follows the operating system theme +- **Light**: always light +- **Dark**: always dark + +## Voice to Text + +### Whisper Model +Download and select the transcription model: +- `tiny` (~75 MB) +- `base` (~140 MB) — recommended +- `small` (~460 MB) +- `medium` (~1.5 GB) + +### Audio Device +Select the microphone to use for recording. + +### Recording Shortcut +Global shortcut to open the recording window. Default: **Alt+Space**. + +### Language +Transcription language. Default: automatic detection. + +## Interface language + +- **Português (Brasil)**: Portuguese interface +- **English**: English interface + +The language is synchronized across all open windows and the system tray menu. + +## Data storage + +| Data | Location | +|------|----------| +| Settings | `~/.config/com.devitools.arandu/` | +| Comments and sessions | `~/.local/share/com.devitools.arandu/comments.db` | +| Plans | `~/.local/share/com.devitools.arandu/plans/` | +| Whisper models | `~/.local/share/com.devitools.arandu/whisper-models/` | +| File history | `~/.local/share/com.devitools.arandu/history.json` | + +*Paths are for Linux. On macOS, use `~/Library/Application Support/com.devitools.arandu/`.* + +## Resetting settings + +To reset all settings to defaults, remove the configuration directory and restart Arandu. diff --git a/docs/funcionalidades/comentarios.md b/docs/funcionalidades/comentarios.md new file mode 100644 index 0000000..dc48b09 --- /dev/null +++ b/docs/funcionalidades/comentarios.md @@ -0,0 +1,56 @@ +# Comentários em Blocos + +O sistema de comentários do Arandu permite adicionar anotações em qualquer bloco de um documento Markdown — perfeito para revisão de planos gerados por IA. + +## Como adicionar um comentário + +**Cmd+Clique** (macOS) ou **Ctrl+Clique** (Linux/Windows) em qualquer bloco do documento: + +- Parágrafo +- Item de lista +- Bloco de código +- Citação (blockquote) +- Heading + +Um painel lateral abre com um campo de texto para o comentário. + +## Sistema de IDs de bloco + +Cada bloco recebe um ID único baseado em seu tipo e posição: + +| Tipo | Formato de ID | +|------|---------------| +| Parágrafo | `para-{hash}` | +| Lista | `list-{hash}` | +| Código | `code-{hash}` | +| Citação | `quote-{hash}` | +| Heading | `heading-{hash}` | + +Isso permite que os comentários sejam associados ao bloco correto mesmo após edições menores no documento. + +## Indicadores visuais + +- Blocos com comentários exibem um **badge** com o número de comentários +- O badge é visível sem precisar clicar +- Comentários não resolvidos são destacados em amarelo + +## Resolver e desfazer resolução + +Cada comentário pode ser marcado como resolvido: +- Clique em **✓ Resolver** no comentário +- O badge do bloco é atualizado +- Comentários resolvidos são exibidos com estilo diferenciado + +## Detecção de obsolescência + +Se o arquivo for modificado externamente, o Arandu compara o hash do arquivo atual com o hash armazenado. Comentários em blocos que mudaram são marcados como **obsoletos** (stale). + +## Persistência + +Os comentários são armazenados em SQLite: +- `~/.local/share/arandu/comments.db` (Linux/Windows) +- `~/Library/Application Support/com.devitools.arandu/comments.db` (macOS) + +## Prompt de revisão + +O painel de revisão agrega todos os comentários não resolvidos em um prompt consolidado, pronto para ser enviado ao agente. Veja [Review](/funcionalidades/review). diff --git a/docs/funcionalidades/integracoes.md b/docs/funcionalidades/integracoes.md new file mode 100644 index 0000000..07d5a25 --- /dev/null +++ b/docs/funcionalidades/integracoes.md @@ -0,0 +1,84 @@ +# Integrações + +## Shell aliases + +Configure aliases para integrar o Arandu ao seu fluxo de trabalho: + +```bash +# Abrir documentação de um projeto +alias docs='arandu README.md' + +# Usar Arandu como EDITOR para agentes +alias claude='EDITOR=arandu claude' +``` + +## Variável EDITOR + +O Arandu pode ser usado como editor padrão (`$EDITOR`) para qualquer aplicativo que abre arquivos para edição: + +```bash +export EDITOR=arandu +``` + +## IPC (Inter-Process Communication) + +O Arandu expõe duas interfaces IPC para automação e integração: + +### Unix Socket (macOS/Linux) +``` +~/.arandu/arandu.sock +``` + +### TCP +``` +127.0.0.1:7474 +``` + +### Comandos disponíveis + +| Comando | Descrição | +|---------|-----------| +| `open ` | Abre um arquivo no Arandu | +| `ping` | Health check | +| `show` | Traz o Arandu para o foco | + +### Exemplo de uso + +```bash +# Abrir arquivo via TCP +echo '{"command":"open","args":["README.md"]}' | nc 127.0.0.1 7474 + +# Health check +echo '{"command":"ping"}' | nc 127.0.0.1 7474 +``` + +## Multi-janela + +O Arandu suporta múltiplas janelas simultâneas, cada uma com seu próprio arquivo. Isso permite comparar documentos lado a lado. + +## Integração com editores + +### VS Code +Use a tarefa integrada para abrir o preview no Arandu: + +```json +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Preview no Arandu", + "type": "shell", + "command": "arandu ${file}" + } + ] +} +``` + +### Neovim + +```lua +-- Abrir arquivo atual no Arandu +vim.keymap.set('n', 'mp', function() + vim.fn.system('arandu ' .. vim.fn.expand('%')) +end) +``` diff --git a/docs/funcionalidades/live-reload.md b/docs/funcionalidades/live-reload.md new file mode 100644 index 0000000..5ed7480 --- /dev/null +++ b/docs/funcionalidades/live-reload.md @@ -0,0 +1,44 @@ +# Live Reload + +O Arandu observa o arquivo aberto e atualiza automaticamente o preview quando o arquivo é modificado. + +## Como funciona + +1. Você abre um arquivo `.md` no Arandu +2. Edita o arquivo em qualquer editor (VS Code, Vim, nano, etc.) +3. Ao salvar, o Arandu detecta a mudança e rerenderiza instantaneamente + +Não é necessária nenhuma extensão de browser nem configuração especial. + +## Implementação + +O file watching é implementado no backend Rust usando a crate [notify](https://docs.rs/notify/). O Arandu monitora o arquivo via inotify (Linux), FSEvents (macOS) ou ReadDirectoryChangesW (Windows). + +## Casos de uso + +### Edição com VS Code + +```bash +code meu-documento.md # abre no VS Code +arandu meu-documento.md # abre o preview no Arandu +``` + +Edite no VS Code, veja o resultado no Arandu em tempo real. + +### Pipeline com scripts + +```bash +# Gera Markdown e abre preview +python gerar-relatorio.py > relatorio.md +arandu relatorio.md +``` + +### Com agentes de IA + +Quando um agente de codificação está gerando ou editando um plano `.md`, o Arandu exibe as mudanças em tempo real. + +## Comportamento + +- O scroll é preservado após o reload (quando possível) +- Se o arquivo for deletado, o Arandu exibe uma mensagem de aviso +- O watching é cancelado automaticamente quando a janela é fechada diff --git a/docs/funcionalidades/markdown.md b/docs/funcionalidades/markdown.md new file mode 100644 index 0000000..411f220 --- /dev/null +++ b/docs/funcionalidades/markdown.md @@ -0,0 +1,48 @@ +# Markdown + +O Arandu renderiza GitHub Flavored Markdown (GFM) usando [comrak](https://github.com/kivikakk/comrak), a mesma biblioteca usada por ferramentas profissionais de processamento de Markdown. + +## GitHub Flavored Markdown + +Conformidade total com a especificação GFM: + +- ✅ Tabelas +- ✅ Listas de tarefas +- ✅ Tachado (`~~texto~~`) +- ✅ Autolinks (`https://...`) +- ✅ Notas de rodapé +- ✅ HTML inline (sanitizado) +- ✅ Blocos de código com linguagem +- ✅ Citações em bloco (blockquotes) +- ✅ Separadores horizontais +- ✅ Headings com âncoras + +## Realce de sintaxe + +Blocos de código são realçados automaticamente por [highlight.js](https://highlightjs.org/) com suporte a mais de 190 linguagens. O tema muda automaticamente com o tema claro/escuro da interface. + +### Exemplo + +````markdown +```rust +fn main() { + println!("Hello, Arandu!"); +} +``` +```` + +## Extensões + +Além do GFM padrão, o Arandu suporta: + +- **Superscript**: `x^2^` +- **Notas de rodapé**: `[^1]` +- **Tabelas de conteúdo**: geradas automaticamente com o outline lateral + +## Renderização no backend + +O Markdown é renderizado no processo Rust (Tauri backend) e enviado como HTML para o frontend. Isso garante: + +- **Segurança**: HTML sanitizado, sem execução de scripts +- **Desempenho**: Renderização rápida mesmo para documentos grandes +- **Fidelidade**: Comportamento idêntico ao GitHub diff --git a/docs/funcionalidades/plano.md b/docs/funcionalidades/plano.md new file mode 100644 index 0000000..dc5180a --- /dev/null +++ b/docs/funcionalidades/plano.md @@ -0,0 +1,55 @@ +# Fluxo de Plano + +O fluxo de plano é uma forma estruturada de trabalhar com agentes de IA: gerar um plano, revisar com comentários, e só então executar. + +## Fases + +O plano passa por quatro fases: + +``` +idle → planning → reviewing → executing +``` + +### idle +Estado inicial. Nenhum plano ativo na sessão. + +### planning +O agente está gerando o plano. O documento é escrito em tempo real e exibido no Arandu via live reload. + +### reviewing +O plano foi gerado. Você pode: +- Ler o documento no painel de visualização +- Adicionar comentários em blocos específicos (`Cmd/Ctrl+Clique`) +- Ver o prompt de revisão consolidado +- Aprovar ou solicitar revisões + +### executing +O plano foi aprovado. O agente está executando as mudanças. + +## Arquivo de plano + +O plano é salvo como arquivo Markdown em: +``` +~/.local/share/arandu/plans/{session_id}.md +``` + +Você pode abrir este arquivo diretamente no Arandu para revisão detalhada. + +## Comentários no plano + +Durante a fase **reviewing**, use `Cmd/Ctrl+Clique` em qualquer bloco do plano para adicionar um comentário. Os comentários são agregados em um prompt de revisão que pode ser enviado de volta ao agente. + +## Aprovando e executando + +Após revisar: +1. Clique em **Aprovar Plano** para avançar para a fase `executing` +2. O agente recebe o sinal de aprovação e começa a execução +3. Acompanhe o progresso na sessão + +## Rejeitando e revisando + +Se o plano precisar de melhorias: +1. Adicione comentários nos blocos problemáticos +2. Clique em **Solicitar Revisão** para enviar o prompt de revisão ao agente +3. O agente gera uma versão revisada +4. O fluxo volta para a fase `reviewing` diff --git a/docs/funcionalidades/review.md b/docs/funcionalidades/review.md new file mode 100644 index 0000000..3bcb1d1 --- /dev/null +++ b/docs/funcionalidades/review.md @@ -0,0 +1,70 @@ +# Review — Revisão de Documentos + +O Arandu funciona como uma ferramenta de revisão de planos e documentos gerados por agentes de IA. + +## Dois modos de revisão + +### Modo Comentários +Lista todos os comentários não resolvidos do documento atual, organizados por bloco. + +### Modo Review +Gera um prompt de revisão consolidado com todos os comentários, pronto para ser enviado ao agente. + +## Caso de uso principal: `EDITOR=arandu` + +Configure o Arandu como seu editor padrão para trabalhar com agentes de codificação no terminal: + +```bash +# ~/.bashrc ou ~/.zshrc +alias claude='EDITOR=arandu ~/.local/bin/claude' +alias copilot='EDITOR=arandu gh copilot' +``` + +### Fluxo de trabalho + +``` +1. Agente gera plano → escreve em arquivo .md +2. Arandu abre automaticamente como EDITOR +3. Você lê o plano e adiciona comentários (Cmd/Ctrl+Clique) +4. Clica em "Gerar prompt de revisão" +5. Copia o prompt e envia ao agente +6. Agente revisa e gera nova versão +7. Repete até aprovação +``` + +### Exemplo com claude + +```bash +alias claude='EDITOR=arandu ~/.local/bin/claude' +claude "crie um plano de implementação para adicionar autenticação JWT" +# Arandu abre automaticamente com o plano gerado +# Você revisa, comenta, e envia feedback +``` + +## Prompt de revisão + +O prompt gerado segue este formato: + +``` +Revisão do plano: {nome-do-arquivo} + +Comentários por bloco: + +[Bloco: "## Arquitetura"] +- A camada de cache parece desnecessária para o MVP. Remover por ora. + +[Bloco: "### Implementação"] +- Por favor, adicione testes unitários ao plano. + +Por favor, revise o plano considerando esses pontos. +``` + +## Integração com o fluxo de plano + +O sistema de review é integrado ao fluxo de plano do workspace: + +1. Modo `plan` → agente gera plano +2. Fase `reviewing` → você comenta +3. "Solicitar Revisão" → prompt enviado ao agente +4. Fase `planning` novamente → agente revisa +5. Fase `reviewing` → aprovação ou nova rodada diff --git a/docs/funcionalidades/sessoes.md b/docs/funcionalidades/sessoes.md new file mode 100644 index 0000000..ad4cbb4 --- /dev/null +++ b/docs/funcionalidades/sessoes.md @@ -0,0 +1,62 @@ +# Sessões e Modos de Interação + +## O que são sessões + +Uma sessão é uma conversa persistente com um agente de codificação dentro de um workspace. Cada sessão tem: + +- Histórico completo de mensagens +- Modo de interação atual +- Plano associado (opcional) +- Fase de execução (idle, planning, reviewing, executing) + +As sessões são armazenadas em SQLite e mantidas entre reinicializações do app. + +## Modos de interação + +O Arandu suporta seis modos de interação com o agente: + +### ask +Modo conversacional para perguntas gerais. Ideal para: +- Explorar o codebase +- Entender decisões de arquitetura +- Tirar dúvidas técnicas + +### plan +Gera um documento de plano estruturado. O plano é salvo como arquivo Markdown e exibido no Arandu para revisão. Ideal para: +- Planejar novas funcionalidades +- Criar roteiros de implementação +- Definir arquitetura + +### code +Gera ou modifica código. O agente tem acesso ao contexto do projeto e pode: +- Criar novos arquivos +- Modificar código existente +- Refatorar + +### edit +Aplica edições pontuais e cirúrgicas a arquivos. Mais preciso que o modo `code` para mudanças específicas. + +### agent +Execução autônoma de múltiplos passos. O agente decide as ações necessárias para completar a tarefa. + +### autopilot +Execução totalmente automatizada. O agente completa a tarefa sem solicitar confirmações intermediárias. + +::: warning +Use os modos `agent` e `autopilot` com cuidado — eles podem fazer modificações abrangentes no seu projeto. +::: + +## Streaming de respostas + +As respostas do agente são transmitidas em tempo real via streaming, com suporte a cancelamento a qualquer momento. + +## Criando uma sessão + +1. Abra um workspace +2. Clique em **Nova Sessão** +3. Selecione o modo inicial +4. Digite seu primeiro prompt + +## Alternando entre sessões + +Use o painel lateral do workspace para navegar entre sessões existentes. Cada sessão é identificada por um nome e data de criação. diff --git a/docs/funcionalidades/temas.md b/docs/funcionalidades/temas.md new file mode 100644 index 0000000..6c2f5c2 --- /dev/null +++ b/docs/funcionalidades/temas.md @@ -0,0 +1,45 @@ +# Sistema de Temas + +O Arandu usa um sistema de design monocromático com variáveis CSS HSL, permitindo alternância suave entre os temas. + +## Modos de tema + +### Sistema +Detecta automaticamente a preferência do sistema operacional via `prefers-color-scheme`. Se o sistema mudar, o Arandu acompanha. + +### Claro +Fundo branco/cinza claro, texto escuro. Ideal para ambientes com luz. + +### Escuro +Fundo cinza escuro/preto, texto claro. Reduz fadiga visual em ambientes com pouca luz. + +## Variáveis CSS + +O tema é implementado com variáveis CSS no nível do ``: + +```css +:root { + --bg: hsl(0, 0%, 100%); + --text: hsl(0, 0%, 13%); + --border: hsl(0, 0%, 87%); + --code-bg: hsl(0, 0%, 95%); +} + +[data-theme="dark"] { + --bg: hsl(0, 0%, 10%); + --text: hsl(0, 0%, 93%); + --border: hsl(0, 0%, 25%); + --code-bg: hsl(0, 0%, 16%); +} +``` + +## Sincronização multi-janela + +O tema selecionado é armazenado em `localStorage` e sincronizado entre todas as janelas abertas via evento `storage`. A janela de configurações e a janela do Whisper acompanham o tema da janela principal. + +## Realce de sintaxe + +O realce de código também alterna entre temas claro e escuro: + +- **Claro**: GitHub Light +- **Escuro**: GitHub Dark diff --git a/docs/funcionalidades/whisper-config.md b/docs/funcionalidades/whisper-config.md new file mode 100644 index 0000000..25421b7 --- /dev/null +++ b/docs/funcionalidades/whisper-config.md @@ -0,0 +1,52 @@ +# Configuração do Whisper + +Acesse **Configurações → Voz para Texto** para configurar o Whisper. + +## Modelos + +### Download + +Os modelos não vêm pré-instalados. Na primeira vez, acesse **Configurações → Voz para Texto → Baixar modelo** e escolha o tamanho: + +| Modelo | Tamanho | Uso de RAM | Indicado para | +|--------|---------|-----------|----------------| +| tiny | ~75 MB | ~200 MB | Uso rápido, hardware limitado | +| base | ~140 MB | ~300 MB | Uso geral (recomendado) | +| small | ~460 MB | ~600 MB | Conteúdo técnico | +| medium | ~1.5 GB | ~2 GB | Máxima precisão | + +### Troca de modelo + +Você pode baixar vários modelos e alternar entre eles a qualquer momento. O modelo ativo fica em destaque nas configurações. + +## Dispositivo de áudio + +Por padrão, o Arandu usa o microfone padrão do sistema. Para usar outro dispositivo: + +1. Vá em **Configurações → Voz para Texto → Dispositivo de áudio** +2. Selecione o dispositivo desejado na lista +3. Faça um teste clicando em **Testar** + +## Atalho de gravação + +O atalho padrão é **Alt+Space**. Para personalizar: + +1. Vá em **Configurações → Voz para Texto → Atalho de Gravação** +2. Clique no campo e pressione a combinação desejada +3. Salve + +::: warning Conflitos de atalho +Verifique se o atalho escolhido não conflita com outros aplicativos do sistema. +::: + +## Idioma de transcrição + +O Whisper detecta automaticamente o idioma falado. Para forçar um idioma específico, configure em **Configurações → Voz para Texto → Idioma**. + +## Armazenamento dos modelos + +Os modelos são armazenados em: + +- **macOS**: `~/Library/Application Support/com.devitools.arandu/whisper-models/` +- **Linux**: `~/.local/share/com.devitools.arandu/whisper-models/` +- **Windows**: `%APPDATA%\com.devitools.arandu\whisper-models\` diff --git a/docs/funcionalidades/whisper.md b/docs/funcionalidades/whisper.md new file mode 100644 index 0000000..29065fb --- /dev/null +++ b/docs/funcionalidades/whisper.md @@ -0,0 +1,59 @@ +# Whisper — Voz para Texto + +O Arandu integra o [whisper.cpp](https://github.com/ggerganov/whisper.cpp) para transcrição de voz offline, diretamente no dispositivo. + +## Por que isso importa + +Trabalhar com agentes de IA requer digitação intensa. Formular prompts, descrever bugs, detalhar requisitos — tudo isso compete com o tempo que você passa realmente desenvolvendo. + +A transcrição por voz muda essa dinâmica: + +- **Velocidade**: Falar é 3x mais rápido que digitar +- **Contexto**: Mais fácil expressar nuances em linguagem natural +- **Ergonomia**: Reduz a carga sobre os pulsos +- **Privacidade**: Tudo processa localmente, sem enviar áudio para a nuvem + +## Como funciona + +O Arandu inclui o whisper.cpp compilado — um motor de transcrição em C++ que roda os modelos Whisper da OpenAI diretamente no seu hardware, sem precisar de internet ou chaves de API. + +## Usando o Whisper + +### Atalho global + +Pressione **Alt+Space** (configurável) de qualquer lugar do sistema — mesmo com o Arandu em segundo plano. A janela flutuante de gravação aparece. + +### Janela de gravação + +1. A janela aparece no canto superior da tela (always-on-top) +2. Clique no microfone ou aguarde o início automático +3. Fale seu texto +4. Clique para parar — a transcrição é copiada para a área de transferência + +### Dois modos de saída + +| Modo | Comportamento | +|------|---------------| +| **Campo** | O texto é inserido diretamente no campo de texto ativo | +| **Área de transferência** | O texto é copiado — você cola onde quiser | + +## Modelos disponíveis + +| Modelo | Tamanho | Velocidade | Recomendação | +|--------|---------|-----------|--------------| +| tiny | ~75 MB | Muito rápida | Notas rápidas, comandos curtos | +| base | ~140 MB | Rápida | Uso geral — **recomendado para começar** | +| small | ~460 MB | Moderada | Conteúdo técnico, nomes de variáveis | +| medium | ~1.5 GB | Lenta | Máxima precisão, documentação complexa | + +Os modelos são baixados automaticamente na primeira utilização (via **Configurações → Voz para Texto**). + +## Privacidade + +- Nenhum áudio é enviado para servidores externos +- Os modelos rodam inteiramente na CPU/GPU local +- Os arquivos de áudio são processados em memória e descartados + +## Próximos passos + +- [Configuração do Whisper](/funcionalidades/whisper-config) — modelos, dispositivos, atalhos diff --git a/docs/funcionalidades/workspace.md b/docs/funcionalidades/workspace.md new file mode 100644 index 0000000..6a9aacc --- /dev/null +++ b/docs/funcionalidades/workspace.md @@ -0,0 +1,64 @@ +# Workspace + +Um Workspace é um diretório de projeto conectado a um agente de codificação via ACP (Agent Communication Protocol). + +## O que é um Workspace + +Quando você abre uma pasta no Arandu como workspace, você está criando um contexto de trabalho onde: + +1. **Sessões** são vinculadas ao diretório do projeto +2. **Um agente** (ex: GitHub Copilot CLI) é conectado via ACP +3. **Planos** são gerados, revisados e executados dentro desse contexto + +## Abrindo um Workspace + +1. Na tela inicial, clique em **Abrir Workspace** +2. Selecione o diretório do projeto +3. Clique em **Conectar** para iniciar uma sessão com o agente + +Ou via CLI: + +```bash +arandu /caminho/para/projeto +``` + +## Como funciona a conexão ACP + +O Arandu se comunica com agentes de codificação via JSON-RPC 2.0 sobre stdin/stdout: + +``` +Arandu (frontend) → Tauri (Rust) → github-copilot --acp --stdio + ↑ stdin/stdout +``` + +O agente precisa suportar o protocolo ACP. Atualmente, o [GitHub Copilot CLI](https://github.com/github/gh-copilot) é o agente testado e suportado. + +## Gerenciamento de sessões + +Cada workspace pode ter múltiplas sessões, cada uma com: + +- Histórico de mensagens +- Modo de interação atual +- Plano associado (se houver) +- Fase do plano (idle, planning, reviewing, executing) + +As sessões são persistidas em SQLite e restauradas automaticamente. + +## Fluxo típico de trabalho + +``` +1. Abrir workspace (diretório do projeto) +2. Conectar agente +3. Criar sessão +4. Usar modo "ask" para explorar o contexto +5. Usar modo "plan" para criar um plano de implementação +6. Revisar o plano com comentários inline +7. Usar modo "code" ou "agent" para executar +``` + +## Agentes suportados + +| Agente | Status | +|--------|--------| +| GitHub Copilot CLI | ✅ Suportado | +| Outros agentes ACP | 🔜 Em planejamento | diff --git a/docs/guia/atalhos.md b/docs/guia/atalhos.md new file mode 100644 index 0000000..2d15ac2 --- /dev/null +++ b/docs/guia/atalhos.md @@ -0,0 +1,35 @@ +# Atalhos de Teclado + +## Janela principal + +| Atalho | Ação | +|--------|------| +| `Cmd/Ctrl+O` | Abrir arquivo | +| `Cmd/Ctrl+W` | Fechar janela / voltar | +| `Cmd/Ctrl+,` | Abrir configurações | +| `Cmd/Ctrl+Shift+T` | Alternar tema | + +## Whisper (voz para texto) + +| Atalho | Ação | +|--------|------| +| `Alt+Space` | Abrir/fechar janela de gravação (global) | + +O atalho global funciona mesmo quando o Arandu não está em foco. Pode ser personalizado em **Configurações → Voz para Texto**. + +## Comentários em blocos + +| Atalho | Ação | +|--------|------| +| `Cmd/Ctrl+Clique` | Adicionar comentário ao bloco | + +## Workspace + +| Atalho | Ação | +|--------|------| +| `Enter` | Enviar mensagem para o agente | +| `Shift+Enter` | Nova linha na mensagem | + +## Personalizando atalhos + +Os atalhos globais (como o do Whisper) podem ser configurados em **Configurações → Voz para Texto → Atalho de Gravação**. diff --git a/docs/guia/inicio-rapido.md b/docs/guia/inicio-rapido.md new file mode 100644 index 0000000..c5bcfcd --- /dev/null +++ b/docs/guia/inicio-rapido.md @@ -0,0 +1,54 @@ +# Início Rápido + +Este guia leva você do zero a um arquivo Markdown aberto em menos de 2 minutos. + +## 1. Instale o Arandu + +```bash +# macOS via Homebrew +brew install --cask devitools/arandu/arandu + +# Ou baixe em github.com/devitools/arandu/releases/latest +``` + +## 2. Abra um arquivo + +### Via CLI + +```bash +arandu README.md +``` + +### Via interface gráfica + +Abra o Arandu e clique em **Abrir Arquivo** na tela inicial, ou arraste um arquivo `.md` para a janela. + +### Via seletor de arquivo + +Execute `arandu` sem argumentos para abrir o seletor de arquivo. + +## 3. Explore a interface + +``` +┌──────────────────────────────────────┐ +│ [≡] Arandu — README.md [☀/☾] │ +├────────────┬─────────────────────────┤ +│ OUTLINE │ │ +│ │ # Título │ +│ > Título │ │ +│ Seção 1 │ Parágrafo de texto... │ +│ Seção 2 │ │ +│ │ ## Seção 1 │ +│ │ ... │ +└────────────┴─────────────────────────┘ +``` + +- **Outline lateral**: clique em qualquer heading para navegar +- **Botão de tema**: alterna entre sistema/claro/escuro +- **Live reload**: salve o arquivo em outro editor — o Arandu atualiza automaticamente + +## 4. Próximos passos + +- [Visualizando Markdown](/guia/visualizando-markdown) — saiba o que é suportado +- [Workspace com IA](/funcionalidades/workspace) — conecte um agente de codificação +- [Whisper](/funcionalidades/whisper) — configure voz para texto diff --git a/docs/guia/instalacao.md b/docs/guia/instalacao.md new file mode 100644 index 0000000..b524196 --- /dev/null +++ b/docs/guia/instalacao.md @@ -0,0 +1,63 @@ +# Instalação + +Arandu está disponível para macOS, Linux e Windows. + +## macOS + +### Homebrew (recomendado) + +```bash +brew install --cask devitools/arandu/arandu +``` + +Isso instala o aplicativo e configura a CLI automaticamente. + +### Download manual + +1. Acesse a [página de releases](https://github.com/devitools/arandu/releases/latest) +2. Baixe o arquivo correto para seu Mac: + - **Apple Silicon (M1/M2/M3)**: `arandu_VERSION_aarch64.dmg` + - **Intel**: `arandu_VERSION_x86_64.dmg` +3. Abra o `.dmg` e arraste o Arandu para a pasta Aplicativos + +### CLI de linha de comando + +Na primeira abertura, o Arandu oferece instalar a CLI automaticamente. Você também pode instalar via menu **Arandu → Instalar Ferramenta de Linha de Comando…**. + +## Linux + +### Download manual + +1. Acesse a [página de releases](https://github.com/devitools/arandu/releases/latest) +2. Baixe o arquivo para Linux x86_64: + - **AppImage** (universal): `arandu_VERSION_amd64.AppImage` + - **Debian/Ubuntu**: `arandu_VERSION_amd64.deb` + +#### AppImage + +```bash +chmod +x arandu_VERSION_amd64.AppImage +./arandu_VERSION_amd64.AppImage +``` + +#### .deb (Debian/Ubuntu) + +```bash +sudo dpkg -i arandu_VERSION_amd64.deb +``` + +## Windows + +1. Acesse a [página de releases](https://github.com/devitools/arandu/releases/latest) +2. Baixe `arandu_VERSION_x64-setup.exe` +3. Execute o instalador + +## Verificando a instalação + +Após instalar, abra um terminal e execute: + +```bash +arandu --version +``` + +Se a CLI não estiver no PATH, abra o Arandu e use o menu **Arandu → Instalar Ferramenta de Linha de Comando…**. diff --git a/docs/guia/introducao.md b/docs/guia/introducao.md new file mode 100644 index 0000000..6cc6007 --- /dev/null +++ b/docs/guia/introducao.md @@ -0,0 +1,34 @@ +# Introdução + +**Arandu** /a.ɾan.ˈdu/ é um visualizador de Markdown e workspace com IA para macOS, Linux e Windows. O nome vem do Guarani e significa *sabedoria* — uma reflexão da sua missão: ser um espaço onde você lê, pensa e cria com clareza. + +## Os três pilares + +### 1. Visualizador de Markdown + +Arandu renderiza GitHub Flavored Markdown com fidelidade total: tabelas, listas de tarefas, tachado, autolinks, blocos de código com realce de sintaxe. Abra qualquer arquivo `.md` e ele é exibido com tipografia limpa e navegação por outline lateral. + +### 2. Workspace com IA + +Conecte o GitHub Copilot (ou outro agente compatível com ACP) a um diretório de projeto. Trabalhe em sessões estruturadas com seis modos de interação: **ask**, **plan**, **code**, **edit**, **agent** e **autopilot**. Revise planos com comentários inline antes de executar. + +### 3. Ferramenta de Revisão + +Use o Arandu como seu `$EDITOR` ao trabalhar com agentes de codificação. O agente gera um plano → Arandu abre como editor → você comenta nos blocos inline → gera um prompt de revisão → feedback para o agente. + +## Filosofia de design + +- **Monocromático**: A interface não compete com o conteúdo. Fundo neutro, tipografia clara. +- **Focado em leitura**: Largura máxima, espaçamento generoso, sem distrações. +- **Offline-first**: Whisper roda no dispositivo. Sem dependências de nuvem. +- **Integração com o terminal**: CLI, IPC via socket Unix e TCP. + +## Pré-requisitos + +- macOS 13+, Linux x86_64, ou Windows x86_64 +- Para o workspace com IA: GitHub Copilot CLI instalado localmente + +## Próximos passos + +- [Instalação](/guia/instalacao) — como instalar via Homebrew ou download manual +- [Início Rápido](/guia/inicio-rapido) — abra seu primeiro arquivo em 2 minutos diff --git a/docs/guia/navegacao.md b/docs/guia/navegacao.md new file mode 100644 index 0000000..5b4fa70 --- /dev/null +++ b/docs/guia/navegacao.md @@ -0,0 +1,39 @@ +# Navegação + +## Outline lateral + +O painel esquerdo exibe automaticamente todos os headings do arquivo aberto. Use-o para navegar rapidamente por documentos longos. + +- **Clique** em qualquer item para navegar com scroll suave +- **Headings aninhados** são exibidos com indentação (H1 > H2 > H3) +- O item ativo é destacado conforme você rola o documento + +## Atalhos de teclado + +| Atalho | Ação | +|--------|------| +| `Cmd/Ctrl+O` | Abrir arquivo | +| `Cmd/Ctrl+W` | Fechar arquivo atual | +| `Cmd/Ctrl+,` | Abrir configurações | +| `Alt+Space` | Abrir gravação de voz (Whisper) | + +Veja todos os atalhos em [Atalhos de Teclado](/guia/atalhos). + +## Multi-arquivo + +Abra vários arquivos com: + +```bash +arandu doc1.md doc2.md doc3.md +arandu *.md +``` + +Cada arquivo abre em sua própria janela. + +## Tela inicial + +Quando o Arandu é aberto sem um arquivo, ele exibe a tela inicial com acesso rápido a: + +- Arquivos recentes +- Workspace (diretório de projeto) +- Abrir arquivo diff --git a/docs/guia/temas.md b/docs/guia/temas.md new file mode 100644 index 0000000..6f36857 --- /dev/null +++ b/docs/guia/temas.md @@ -0,0 +1,25 @@ +# Temas + +O Arandu suporta três modos de tema: + +## Modos disponíveis + +| Modo | Descrição | +|------|-----------| +| **Sistema** | Segue o tema do sistema operacional automaticamente | +| **Claro** | Tema claro fixo | +| **Escuro** | Tema escuro fixo | + +## Como alternar + +Clique no botão de tema na barra superior da janela. O ícone alterna entre ☀️ (claro), 🌙 (escuro) e 💻 (sistema). + +O tema selecionado é salvo e restaurado na próxima abertura. + +## Design monocromático + +O Arandu usa um sistema de design monocromático baseado em variáveis HSL CSS. A interface não compete com o conteúdo — tons de cinza neutros, tipografia clara, sem cores de destaque que distraiam da leitura. + +## Sincronização multi-janela + +O tema é sincronizado entre todas as janelas abertas (janela principal, configurações, whisper) via localStorage. diff --git a/docs/guia/visualizando-markdown.md b/docs/guia/visualizando-markdown.md new file mode 100644 index 0000000..c827cba --- /dev/null +++ b/docs/guia/visualizando-markdown.md @@ -0,0 +1,61 @@ +# Visualizando Markdown + +O Arandu usa [comrak](https://github.com/kivikakk/comrak) para renderizar GitHub Flavored Markdown (GFM) com fidelidade total. + +## Elementos suportados + +### Formatação de texto + +| Sintaxe | Resultado | +|---------|-----------| +| `**negrito**` | **negrito** | +| `*itálico*` | *itálico* | +| `~~tachado~~` | ~~tachado~~ | +| `` `código inline` `` | `código inline` | + +### Tabelas + +```markdown +| Coluna 1 | Coluna 2 | Coluna 3 | +|----------|----------|----------| +| valor | valor | valor | +``` + +### Listas de tarefas + +```markdown +- [x] Tarefa concluída +- [ ] Tarefa pendente +``` + +### Blocos de código + +Suporte a realce de sintaxe para mais de 190 linguagens via highlight.js: + +````markdown +```typescript +function greet(name: string): string { + return `Hello, ${name}!` +} +``` +```` + +### Links automáticos + +URLs como `https://arandu.app` são automaticamente convertidos em links clicáveis. + +### Notas de rodapé + +```markdown +Texto com nota[^1]. + +[^1]: Texto da nota de rodapé. +``` + +## Realce de sintaxe + +O Arandu aplica automaticamente temas de realce de sintaxe (light/dark) que acompanham o tema da interface. Suporte nativo para TypeScript, Rust, Python, Go, Shell, SQL e mais de 190 outras linguagens. + +## Largura de leitura + +O conteúdo é exibido com largura máxima otimizada para leitura (~80 caracteres), centralizado na janela. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..136bf22 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,55 @@ +--- +layout: home +title: Arandu +titleTemplate: Visualizador de Markdown e workspace com IA + +hero: + name: "Arandu" + text: "Visualizador de Markdown e workspace com IA" + tagline: "Leia documentação com beleza. Colabore com agentes de IA. Transcreva por voz. Multiplataforma, construído com Tauri." + image: + src: /icon.svg + alt: Arandu + actions: + - theme: brand + text: Começar + link: /guia/introducao + - theme: alt + text: Download + link: https://github.com/devitools/arandu/releases/latest + - theme: alt + text: GitHub + link: https://github.com/devitools/arandu + +features: + - icon: 📖 + title: Markdown GFM + details: Tabelas, listas de tarefas, tachado, autolinks — tudo renderizado fielmente, como no GitHub. + - icon: 🤖 + title: Workspace com IA + details: Conecte o GitHub Copilot ou outro agente de codificação. Trabalhe em sessões estruturadas com modos ask, plan, code, edit, agent e autopilot. + - icon: 🎙️ + title: Voz para Texto + details: Transcrição offline com whisper.cpp. Sem chaves de API, sem nuvem. Apenas pressione Alt+Space. + - icon: 💬 + title: Comentários em Blocos + details: Cmd/Ctrl+Clique em qualquer bloco Markdown para adicionar um comentário. Perfeito para revisão de planos gerados por IA. + - icon: 🔄 + title: Live Reload + details: O Arandu observa seu arquivo e atualiza automaticamente quando você salva de qualquer editor. + - icon: 🌙 + title: Temas + details: Alterne entre sistema, claro e escuro. Design monocromático focado em leitura. +--- + +
+ +## Sobre o nome + +

+ arandu /a.ɾan.ˈdu/ — do Guarani, significa sabedoria, conhecimento. +

+ +Um nome que reflete a missão: ser um espaço onde você lê, pensa e cria com clareza. + +
diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 0000000..d8fed17 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,2514 @@ +{ + "name": "arandu-docs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "arandu-docs", + "version": "1.0.0", + "devDependencies": { + "vitepress": "^1.6.3", + "vue": "^3.5.13" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.15.1.tgz", + "integrity": "sha512-2yuIC48rUuHGhU1U5qJ9kJHaxYpJ0jpDHJVI5ekOxSMYXlH4+HP+pA31G820lsAznfmu2nzDV7n5RO44zIY1zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1", + "@algolia/requester-browser-xhr": "5.49.1", + "@algolia/requester-fetch": "5.49.1", + "@algolia/requester-node-http": "5.49.1" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.49.1.tgz", + "integrity": "sha512-h6M7HzPin+45/l09q0r2dYmocSSt2MMGOOk5c4O5K/bBBlEwf1BKfN6z+iX4b8WXcQQhf7rgQwC52kBZJt/ZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1", + "@algolia/requester-browser-xhr": "5.49.1", + "@algolia/requester-fetch": "5.49.1", + "@algolia/requester-node-http": "5.49.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.49.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.49.1.tgz", + "integrity": "sha512-048T9/Z8OeLmTk8h76QUqaNFp7Rq2VgS2Zm6Y2tNMYGQ1uNuzePY/udB5l5krlXll7ZGflyCjFvRiOtlPZpE9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1", + "@algolia/requester-browser-xhr": "5.49.1", + "@algolia/requester-fetch": "5.49.1", + "@algolia/requester-node-http": "5.49.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.49.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.49.1.tgz", + "integrity": "sha512-vp5/a9ikqvf3mn9QvHN8PRekn8hW34aV9eX+O0J5mKPZXeA6Pd5OQEh2ZWf7gJY6yyfTlLp5LMFzQUAU+Fpqpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.49.1", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.49.1.tgz", + "integrity": "sha512-B6N7PgkvYrul3bntTz/l6uXnhQ2bvP+M7NqTcayh681tSqPaA5cJCUBp/vrP7vpPRpej4Eeyx2qz5p0tE/2N2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1", + "@algolia/requester-browser-xhr": "5.49.1", + "@algolia/requester-fetch": "5.49.1", + "@algolia/requester-node-http": "5.49.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.49.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.49.1.tgz", + "integrity": "sha512-v+4DN+lkYfBd01Hbnb9ZrCHe7l+mvihyx218INRX/kaCXROIWUDIT1cs3urQxfE7kXBFnLsqYeOflQALv/gA5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1", + "@algolia/requester-browser-xhr": "5.49.1", + "@algolia/requester-fetch": "5.49.1", + "@algolia/requester-node-http": "5.49.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.49.1", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.49.1.tgz", + "integrity": "sha512-Un11cab6ZCv0W+Jiak8UktGIqoa4+gSNgEZNfG8m8eTsXGqwIEr370H3Rqwj87zeNSlFpH2BslMXJ/cLNS1qtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1", + "@algolia/requester-browser-xhr": "5.49.1", + "@algolia/requester-fetch": "5.49.1", + "@algolia/requester-node-http": "5.49.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.49.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.1.tgz", + "integrity": "sha512-Nt9hri7nbOo0RipAsGjIssHkpLMHHN/P7QqENywAq5TLsoYDzUyJGny8FEiD/9KJUxtGH8blGpMedilI6kK3rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1", + "@algolia/requester-browser-xhr": "5.49.1", + "@algolia/requester-fetch": "5.49.1", + "@algolia/requester-node-http": "5.49.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.49.1.tgz", + "integrity": "sha512-b5hUXwDqje0Y4CpU6VL481DXgPgxpTD5sYMnfQTHKgUispGnaCLCm2/T9WbJo1YNUbX3iHtYDArp804eD6CmRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1", + "@algolia/requester-browser-xhr": "5.49.1", + "@algolia/requester-fetch": "5.49.1", + "@algolia/requester-node-http": "5.49.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.49.1.tgz", + "integrity": "sha512-bvrXwZ0WsL3rN6Q4m4QqxsXFCo6WAew7sAdrpMQMK4Efn4/W920r9ptOuckejOSSvyLr9pAWgC5rsHhR2FYuYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1", + "@algolia/requester-browser-xhr": "5.49.1", + "@algolia/requester-fetch": "5.49.1", + "@algolia/requester-node-http": "5.49.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.49.1", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.49.1.tgz", + "integrity": "sha512-h2yz3AGeGkQwNgbLmoe3bxYs8fac4An1CprKTypYyTU/k3Q+9FbIvJ8aS1DoBKaTjSRZVoyQS7SZQio6GaHbZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1", + "@algolia/requester-browser-xhr": "5.49.1", + "@algolia/requester-fetch": "5.49.1", + "@algolia/requester-node-http": "5.49.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.49.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.49.1.tgz", + "integrity": "sha512-2UPyRuUR/qpqSqH8mxFV5uBZWEpxhGPHLlx9Xf6OVxr79XO2ctzZQAhsmTZ6X22x+N8MBWpB9UEky7YU2HGFgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.49.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.49.1.tgz", + "integrity": "sha512-N+xlE4lN+wpuT+4vhNEwPVlrfN+DWAZmSX9SYhbz986Oq8AMsqdntOqUyiOXVxYsQtfLwmiej24vbvJGYv1Qtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.49.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.49.1.tgz", + "integrity": "sha512-zA5bkUOB5PPtTr182DJmajCiizHp0rCJQ0Chf96zNFvkdESKYlDeYA3tQ7r2oyHbu/8DiohAQ5PZ85edctzbXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.49.1" + }, + "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.72", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.72.tgz", + "integrity": "sha512-wkcixntHvaCoqPqerGrNFcHQ3Yx1ux4ZkhscCDK0DEHpP62XCH+cxq1HTsRjbUiQl/M9K8bj03HF6Wgn5iE2rQ==", + "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.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.29.tgz", + "integrity": "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.29", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz", + "integrity": "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.29.tgz", + "integrity": "sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.29", + "@vue/compiler-dom": "3.5.29", + "@vue/compiler-ssr": "3.5.29", + "@vue/shared": "3.5.29", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.29.tgz", + "integrity": "sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "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.29", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.29.tgz", + "integrity": "sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.29.tgz", + "integrity": "sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.29", + "@vue/shared": "3.5.29" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.29.tgz", + "integrity": "sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.29", + "@vue/runtime-core": "3.5.29", + "@vue/shared": "3.5.29", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.29.tgz", + "integrity": "sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.29", + "@vue/shared": "3.5.29" + }, + "peerDependencies": { + "vue": "3.5.29" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz", + "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==", + "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.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.1.tgz", + "integrity": "sha512-X3Pp2aRQhg4xUC6PQtkubn5NpRKuUPQ9FPDQlx36SmpFwwH2N0/tw4c+NXV3nw3PsgeUs+BuWGP0gjz3TvENLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.15.1", + "@algolia/client-abtesting": "5.49.1", + "@algolia/client-analytics": "5.49.1", + "@algolia/client-common": "5.49.1", + "@algolia/client-insights": "5.49.1", + "@algolia/client-personalization": "5.49.1", + "@algolia/client-query-suggestions": "5.49.1", + "@algolia/client-search": "5.49.1", + "@algolia/ingestion": "1.49.1", + "@algolia/monitoring": "1.49.1", + "@algolia/recommend": "5.49.1", + "@algolia/requester-browser-xhr": "5.49.1", + "@algolia/requester-fetch": "5.49.1", + "@algolia/requester-node-http": "5.49.1" + }, + "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.29", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.29.tgz", + "integrity": "sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.29", + "@vue/compiler-sfc": "3.5.29", + "@vue/runtime-dom": "3.5.29", + "@vue/server-renderer": "3.5.29", + "@vue/shared": "3.5.29" + }, + "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 0000000..bf00756 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,15 @@ +{ + "name": "arandu-docs", + "version": "1.0.0", + "description": "Arandu documentation", + "type": "module", + "scripts": { + "docs:dev": "vitepress dev", + "docs:build": "vitepress build", + "docs:preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.6.3", + "vue": "^3.5.13" + } +} diff --git a/docs/public/apple-touch-icon.png b/docs/public/apple-touch-icon.png new file mode 100644 index 0000000..6796334 Binary files /dev/null and b/docs/public/apple-touch-icon.png differ diff --git a/docs/public/favicon-32x32.png b/docs/public/favicon-32x32.png new file mode 100644 index 0000000..5cf2606 Binary files /dev/null and b/docs/public/favicon-32x32.png differ diff --git a/docs/public/icon.svg b/docs/public/icon.svg new file mode 100644 index 0000000..d0f2928 --- /dev/null +++ b/docs/public/icon.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs/referencia/cli.md b/docs/referencia/cli.md new file mode 100644 index 0000000..e6bb8e7 --- /dev/null +++ b/docs/referencia/cli.md @@ -0,0 +1,54 @@ +# CLI — Linha de Comando + +## Instalação + +A CLI é instalada automaticamente na primeira abertura do Arandu (macOS) ou pode ser instalada via menu **Arandu → Instalar Ferramenta de Linha de Comando…**. + +Via Homebrew: +```bash +brew install --cask devitools/arandu/arandu +``` + +## Uso básico + +```bash +arandu # abre o seletor de arquivo +arandu README.md # abre um arquivo +arandu doc1.md doc2.md # abre múltiplos arquivos +arandu *.md # abre todos os .md do diretório +arandu /caminho/para/projeto # abre como workspace +``` + +## Flags + +| Flag | Descrição | +|------|-----------| +| `--version` | Exibe a versão instalada | +| `--help` | Exibe ajuda | + +## Comportamento + +- Se o Arandu já estiver rodando, os arquivos são abertos via IPC (sem nova janela do app) +- Se o Arandu não estiver rodando, o app é iniciado automaticamente + +## Caminho de instalação + +| Sistema | Caminho | +|---------|---------| +| macOS | `/usr/local/bin/arandu` | +| Linux | `~/.local/bin/arandu` | + +## Script da CLI + +A CLI é um script shell que se comunica com o Arandu via IPC: + +```bash +#!/bin/bash +# Tenta via socket Unix, fallback para TCP +if [ -S "$HOME/.arandu/arandu.sock" ]; then + echo '{"command":"open","args":["'"$1"'"]}' \ + | socat - UNIX-CONNECT:$HOME/.arandu/arandu.sock +else + echo '{"command":"open","args":["'"$1"'"]}' | nc 127.0.0.1 7474 +fi +``` diff --git a/docs/referencia/configuracoes.md b/docs/referencia/configuracoes.md new file mode 100644 index 0000000..c8b983a --- /dev/null +++ b/docs/referencia/configuracoes.md @@ -0,0 +1,51 @@ +# Configurações + +Acesse as configurações via **Arandu → Preferências…** ou `Cmd/Ctrl+,`. + +## Aparência + +### Tema +- **Sistema**: segue o tema do sistema operacional +- **Claro**: sempre claro +- **Escuro**: sempre escuro + +## Voz para Texto + +### Modelo Whisper +Baixe e selecione o modelo de transcrição: +- `tiny` (~75 MB) +- `base` (~140 MB) — recomendado +- `small` (~460 MB) +- `medium` (~1.5 GB) + +### Dispositivo de Áudio +Selecione o microfone a ser usado para gravação. + +### Atalho de Gravação +Atalho global para abrir a janela de gravação. Padrão: **Alt+Space**. + +### Idioma +Idioma de transcrição. Padrão: detecção automática. + +## Idioma da interface + +- **Português (Brasil)**: interface em português +- **English**: interface em inglês + +O idioma é sincronizado entre todas as janelas abertas e o menu da bandeja do sistema. + +## Armazenamento de dados + +| Dado | Local | +|------|-------| +| Configurações | `~/.config/com.devitools.arandu/` | +| Comentários e sessões | `~/.local/share/com.devitools.arandu/comments.db` | +| Planos | `~/.local/share/com.devitools.arandu/plans/` | +| Modelos Whisper | `~/.local/share/com.devitools.arandu/whisper-models/` | +| Histórico de arquivos | `~/.local/share/com.devitools.arandu/history.json` | + +*Caminhos são para Linux. No macOS, use `~/Library/Application Support/com.devitools.arandu/`.* + +## Reiniciando configurações + +Para resetar todas as configurações para o padrão, remova o diretório de configuração e reinicie o Arandu. diff --git a/docs/referencia/idiomas.md b/docs/referencia/idiomas.md new file mode 100644 index 0000000..d0081fa --- /dev/null +++ b/docs/referencia/idiomas.md @@ -0,0 +1,43 @@ +# Idiomas + +O Arandu suporta múltiplos idiomas na interface. + +## Idiomas disponíveis + +| Idioma | Código | Status | +|--------|--------|--------| +| Português (Brasil) | `pt-BR` | ✅ Padrão | +| English | `en` | ✅ Disponível | + +## Alterando o idioma + +Vá em **Configurações → Idioma** e selecione o idioma desejado. A mudança é aplicada imediatamente em todas as janelas abertas e no menu da bandeja do sistema. + +## Arquivos de tradução + +Os arquivos de tradução estão em: + +``` +apps/tauri/src/locales/ +├── pt-BR.json # Português (Brasil) +└── en.json # English +``` + +## Contribuindo com traduções + +Para adicionar um novo idioma ou melhorar uma tradução existente: + +1. Fork o repositório em [github.com/devitools/arandu](https://github.com/devitools/arandu) +2. Copie `apps/tauri/src/locales/en.json` como base +3. Crie o arquivo `apps/tauri/src/locales/{codigo}.json` +4. Traduza todos os valores (mantenha as chaves) +5. Adicione o idioma em `apps/tauri/src/lib/i18n.ts` +6. Abra um Pull Request + +## Sincronização entre janelas + +O idioma é armazenado em `localStorage('arandu-language')` e sincronizado entre todas as janelas abertas via evento `storage`. O menu da bandeja do sistema também é atualizado via comando Tauri `update_tray_labels`. + +## Implementação técnica + +O Arandu usa [i18next](https://www.i18next.com/) com o plugin `react-i18next`. A configuração está em `apps/tauri/src/lib/i18n.ts`. diff --git a/docs/referencia/ipc.md b/docs/referencia/ipc.md new file mode 100644 index 0000000..5778389 --- /dev/null +++ b/docs/referencia/ipc.md @@ -0,0 +1,135 @@ +# IPC — Inter-Process Communication + +O Arandu expõe uma interface IPC para automação e integração com ferramentas externas. + +## Transportes + +### Unix Domain Socket (macOS/Linux) + +``` +~/.arandu/arandu.sock +``` + +Disponível apenas quando o Arandu está rodando. + +### TCP + +``` +127.0.0.1:7474 +``` + +Disponível em todas as plataformas. + +## Protocolo + +As mensagens são JSON terminadas em newline (`\n`): + +### Requisição + +```json +{ + "command": "open", + "args": ["/caminho/para/arquivo.md"] +} +``` + +### Resposta + +```json +{ + "success": true +} +``` + +Ou em caso de erro: + +```json +{ + "success": false, + "error": "Arquivo não encontrado" +} +``` + +## Comandos + +### open + +Abre um arquivo no Arandu. + +```json +{ + "command": "open", + "args": ["/caminho/absoluto/para/arquivo.md"] +} +``` + +### ping + +Health check — verifica se o Arandu está rodando. + +```json +{ + "command": "ping" +} +``` + +Resposta: `{"success": true, "result": "pong"}` + +### show + +Traz a janela do Arandu para o foco. + +```json +{ + "command": "show" +} +``` + +## Exemplos + +### Bash + +```bash +# Unix socket +echo '{"command":"open","args":["/home/user/docs/README.md"]}' \ + | socat - UNIX-CONNECT:$HOME/.arandu/arandu.sock + +# TCP +echo '{"command":"open","args":["/home/user/docs/README.md"]}' \ + | nc 127.0.0.1 7474 +``` + +### Python + +```python +import socket +import json + +def send_to_arandu(command, args=None): + msg = json.dumps({"command": command, "args": args or []}) + "\n" + with socket.create_connection(("127.0.0.1", 7474)) as s: + s.sendall(msg.encode()) + return json.loads(s.recv(1024)) + +send_to_arandu("open", ["/path/to/file.md"]) +``` + +### Node.js + +```javascript +const net = require('net'); + +function sendToArandu(command, args = []) { + return new Promise((resolve) => { + const client = net.createConnection(7474, '127.0.0.1', () => { + client.write(JSON.stringify({ command, args }) + '\n'); + }); + client.on('data', (data) => { + resolve(JSON.parse(data.toString())); + client.destroy(); + }); + }); +} + +await sendToArandu('open', ['/path/to/file.md']); +``` diff --git a/website/index.html b/website/index.html index 1342260..b8c12ef 100644 --- a/website/index.html +++ b/website/index.html @@ -45,7 +45,7 @@