From 29a49d4c5300698e1c77515c47b35d736403746c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Mar 2026 07:23:36 +0000 Subject: [PATCH 1/2] Initial plan From 6066958af758f0b64a506b9e2cf78b4dfaed0981 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Mar 2026 08:14:31 +0000 Subject: [PATCH 2/2] feat: add VitePress documentation site with pt-BR and English content Co-authored-by: wilcorrea <803733+wilcorrea@users.noreply.github.com> --- .github/workflows/deploy-docs.yml | 41 + .gitignore | 5 + docs/.vitepress/config.ts | 56 + docs/.vitepress/locales/en.ts | 106 + docs/.vitepress/locales/pt-BR.ts | 106 + docs/.vitepress/theme/custom.css | 51 + docs/.vitepress/theme/index.ts | 4 + docs/en/features/comments.md | 56 + docs/en/features/integrations.md | 84 + docs/en/features/live-reload.md | 44 + docs/en/features/markdown.md | 48 + docs/en/features/plan.md | 55 + docs/en/features/review.md | 70 + docs/en/features/sessions.md | 62 + docs/en/features/themes.md | 45 + docs/en/features/whisper-config.md | 52 + docs/en/features/whisper.md | 59 + docs/en/features/workspace.md | 64 + docs/en/guide/installation.md | 63 + docs/en/guide/introduction.md | 34 + docs/en/guide/navigation.md | 39 + docs/en/guide/quick-start.md | 54 + docs/en/guide/shortcuts.md | 35 + docs/en/guide/themes.md | 25 + docs/en/guide/viewing-markdown.md | 61 + docs/en/index.md | 55 + docs/en/reference/cli.md | 54 + docs/en/reference/ipc.md | 135 ++ docs/en/reference/languages.md | 43 + docs/en/reference/settings.md | 51 + docs/funcionalidades/comentarios.md | 56 + docs/funcionalidades/integracoes.md | 84 + docs/funcionalidades/live-reload.md | 44 + docs/funcionalidades/markdown.md | 48 + docs/funcionalidades/plano.md | 55 + docs/funcionalidades/review.md | 70 + docs/funcionalidades/sessoes.md | 62 + docs/funcionalidades/temas.md | 45 + docs/funcionalidades/whisper-config.md | 52 + docs/funcionalidades/whisper.md | 59 + docs/funcionalidades/workspace.md | 64 + docs/guia/atalhos.md | 35 + docs/guia/inicio-rapido.md | 54 + docs/guia/instalacao.md | 63 + docs/guia/introducao.md | 34 + docs/guia/navegacao.md | 39 + docs/guia/temas.md | 25 + docs/guia/visualizando-markdown.md | 61 + docs/index.md | 55 + docs/package-lock.json | 2514 ++++++++++++++++++++++++ docs/package.json | 15 + docs/public/apple-touch-icon.png | Bin 0 -> 18323 bytes docs/public/favicon-32x32.png | Bin 0 -> 779 bytes docs/public/icon.svg | 23 + docs/referencia/cli.md | 54 + docs/referencia/configuracoes.md | 51 + docs/referencia/idiomas.md | 43 + docs/referencia/ipc.md | 135 ++ website/index.html | 2 +- 59 files changed, 5498 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/deploy-docs.yml create mode 100644 docs/.vitepress/config.ts create mode 100644 docs/.vitepress/locales/en.ts create mode 100644 docs/.vitepress/locales/pt-BR.ts create mode 100644 docs/.vitepress/theme/custom.css create mode 100644 docs/.vitepress/theme/index.ts create mode 100644 docs/en/features/comments.md create mode 100644 docs/en/features/integrations.md create mode 100644 docs/en/features/live-reload.md create mode 100644 docs/en/features/markdown.md create mode 100644 docs/en/features/plan.md create mode 100644 docs/en/features/review.md create mode 100644 docs/en/features/sessions.md create mode 100644 docs/en/features/themes.md create mode 100644 docs/en/features/whisper-config.md create mode 100644 docs/en/features/whisper.md create mode 100644 docs/en/features/workspace.md create mode 100644 docs/en/guide/installation.md create mode 100644 docs/en/guide/introduction.md create mode 100644 docs/en/guide/navigation.md create mode 100644 docs/en/guide/quick-start.md create mode 100644 docs/en/guide/shortcuts.md create mode 100644 docs/en/guide/themes.md create mode 100644 docs/en/guide/viewing-markdown.md create mode 100644 docs/en/index.md create mode 100644 docs/en/reference/cli.md create mode 100644 docs/en/reference/ipc.md create mode 100644 docs/en/reference/languages.md create mode 100644 docs/en/reference/settings.md create mode 100644 docs/funcionalidades/comentarios.md create mode 100644 docs/funcionalidades/integracoes.md create mode 100644 docs/funcionalidades/live-reload.md create mode 100644 docs/funcionalidades/markdown.md create mode 100644 docs/funcionalidades/plano.md create mode 100644 docs/funcionalidades/review.md create mode 100644 docs/funcionalidades/sessoes.md create mode 100644 docs/funcionalidades/temas.md create mode 100644 docs/funcionalidades/whisper-config.md create mode 100644 docs/funcionalidades/whisper.md create mode 100644 docs/funcionalidades/workspace.md create mode 100644 docs/guia/atalhos.md create mode 100644 docs/guia/inicio-rapido.md create mode 100644 docs/guia/instalacao.md create mode 100644 docs/guia/introducao.md create mode 100644 docs/guia/navegacao.md create mode 100644 docs/guia/temas.md create mode 100644 docs/guia/visualizando-markdown.md create mode 100644 docs/index.md create mode 100644 docs/package-lock.json create mode 100644 docs/package.json create mode 100644 docs/public/apple-touch-icon.png create mode 100644 docs/public/favicon-32x32.png create mode 100644 docs/public/icon.svg create mode 100644 docs/referencia/cli.md create mode 100644 docs/referencia/configuracoes.md create mode 100644 docs/referencia/idiomas.md create mode 100644 docs/referencia/ipc.md 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 0000000000000000000000000000000000000000..6796334e524435d355090697987f0bb82d613fdf GIT binary patch literal 18323 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 literal 0 HcmV?d00001 diff --git a/docs/public/favicon-32x32.png b/docs/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf2606c2b182a0706a56daac901870526b25d39 GIT binary patch literal 779 zcmV+m1N8ifP)`0@9Uv6;(ubYwA#>&o``elMpPgCGV_A|I22f$Bb^3Bu ziM3i7wV2|yeMY%I(-A|)nF+@iXC@riIWys)Jb+nne6eSNd&Zl<+a$wq{KKAQgYmJy#6r_mLvVaA)~Mj_Tq}drkch1bXf~kB;*pYWcuNEN^L%5uK&M}^jc86c zyh{UG;dA~I5S(>1Y6()mIbyhu+h+Y0U2qL)*!zZCT`1B~KihF4b5VbFp`Z({l7_u- zyG4SPP=Si?ZIUOZ_&0+&uvr?K;j##IyxVVu|IpFCOWMJ9z6rLG2CDP4eI=aN43{;a zV`I4=$&&TPw)@2an;XZl`QRAdBptN<-eN{G9DA%*c)(W%fv=HKie(o3o(lK`*>D}V z;h4Zz;fhbx1Sd_BY&+qmv9Cuw>>t_b4Yxl{(0*&d zlq$SO1E;|+303f3kas?@!b0L;v~Qj#4qT|u5b5h36T$1Q41{-Spx=JJ9!%3wef&O( zrkm@V=Vi1Ei65@^EX@8K2=7kAQ{Yx4r1>ed{zzEZUVffXeaY;86KMbNWCpCmgT=`B zoOdOohY78z);C7K3rvDDBY|B)I%>Y9hQ#17^Un{~uFfMw;~v*i!%i002ov JPDHLkV1fb@d-ebT literal 0 HcmV?d00001 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 @@