Repository: Nagi-ovo/gemini-voyager Branch: main Commit: 8789965cd6fb Files: 648 Total size: 3.6 MB Directory structure: gitextract_g57kkec9/ ├── .claude/ │ ├── rules/ │ │ ├── content-scripts.md │ │ ├── high-complexity.md │ │ ├── i18n.md │ │ └── typescript.md │ ├── settings.json │ └── skills/ │ └── safari-release/ │ └── SKILL.md ├── .editorconfig ├── .entire/ │ ├── .gitignore │ └── settings.json ├── .gitattributes ├── .github/ │ ├── CONTRIBUTING.md │ ├── CONTRIBUTING_ES.md │ ├── CONTRIBUTING_FR.md │ ├── CONTRIBUTING_JA.md │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ └── feature_request.yml │ ├── README_AR.md │ ├── README_ES.md │ ├── README_FR.md │ ├── README_JA.md │ ├── README_KO.md │ ├── README_PT.md │ ├── README_RU.md │ ├── README_ZH.md │ ├── README_ZH_TW.md │ ├── RELEASE_TEMPLATE.md │ ├── docs/ │ │ ├── CHANGELOG.md │ │ ├── IMPORT_EXPORT_GUIDE.md │ │ ├── IMPORT_EXPORT_GUIDE_ZH.md │ │ └── safari/ │ │ ├── INSTALLATION.md │ │ └── INSTALLATION_ZH.md │ ├── pull_request_template.md │ └── workflows/ │ ├── ci.yml │ ├── deploy-docs.yml │ ├── issue-claim.yml │ ├── issue-validator.yml │ ├── release.yml │ ├── sponsors.yml │ └── stale.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── CLAUDE.md ├── CNAME ├── LICENSE ├── README.md ├── commitlint.config.cjs ├── custom-vite-plugins.ts ├── docs/ │ ├── .vitepress/ │ │ ├── config.mts │ │ └── theme/ │ │ ├── components/ │ │ │ ├── HomeAskAI.vue │ │ │ ├── HomeReviews.vue │ │ │ ├── HomeTeaser.vue │ │ │ ├── README.md │ │ │ └── SafariDownloadLink.vue │ │ ├── index.ts │ │ └── style.css │ ├── ar/ │ │ ├── guide/ │ │ │ ├── batch-delete.md │ │ │ ├── cloud-sync.md │ │ │ ├── community.md │ │ │ ├── context-sync.md │ │ │ ├── deep-research.md │ │ │ ├── default-model.md │ │ │ ├── export.md │ │ │ ├── folders.md │ │ │ ├── fork.md │ │ │ ├── formula-copy.md │ │ │ ├── getting-started.md │ │ │ ├── input-collapse.md │ │ │ ├── installation.md │ │ │ ├── markdown-fix.md │ │ │ ├── mermaid.md │ │ │ ├── nanobanana.md │ │ │ ├── prevent-auto-scroll.md │ │ │ ├── prompts.md │ │ │ ├── quote-reply.md │ │ │ ├── recents-hider.md │ │ │ ├── settings.md │ │ │ ├── sidebar-auto-hide.md │ │ │ ├── sidebar.md │ │ │ ├── sponsor.md │ │ │ ├── tab-title.md │ │ │ └── timeline.md │ │ ├── index.md │ │ └── privacy.md │ ├── en/ │ │ ├── guide/ │ │ │ ├── batch-delete.md │ │ │ ├── cloud-sync.md │ │ │ ├── community.md │ │ │ ├── context-sync.md │ │ │ ├── deep-research.md │ │ │ ├── default-model.md │ │ │ ├── export.md │ │ │ ├── folders.md │ │ │ ├── fork.md │ │ │ ├── formula-copy.md │ │ │ ├── getting-started.md │ │ │ ├── input-collapse.md │ │ │ ├── installation.md │ │ │ ├── markdown-fix.md │ │ │ ├── mermaid.md │ │ │ ├── nanobanana.md │ │ │ ├── prevent-auto-scroll.md │ │ │ ├── prompts.md │ │ │ ├── quote-reply.md │ │ │ ├── recents-hider.md │ │ │ ├── settings.md │ │ │ ├── sidebar-auto-hide.md │ │ │ ├── sidebar.md │ │ │ ├── sponsor.md │ │ │ ├── tab-title.md │ │ │ └── timeline.md │ │ ├── index.md │ │ └── privacy.md │ ├── es/ │ │ ├── guide/ │ │ │ ├── batch-delete.md │ │ │ ├── cloud-sync.md │ │ │ ├── community.md │ │ │ ├── context-sync.md │ │ │ ├── deep-research.md │ │ │ ├── default-model.md │ │ │ ├── export.md │ │ │ ├── folders.md │ │ │ ├── fork.md │ │ │ ├── formula-copy.md │ │ │ ├── getting-started.md │ │ │ ├── input-collapse.md │ │ │ ├── installation.md │ │ │ ├── markdown-fix.md │ │ │ ├── mermaid.md │ │ │ ├── nanobanana.md │ │ │ ├── prevent-auto-scroll.md │ │ │ ├── prompts.md │ │ │ ├── quote-reply.md │ │ │ ├── recents-hider.md │ │ │ ├── settings.md │ │ │ ├── sidebar-auto-hide.md │ │ │ ├── sidebar.md │ │ │ ├── sponsor.md │ │ │ ├── tab-title.md │ │ │ └── timeline.md │ │ ├── index.md │ │ └── privacy.md │ ├── fr/ │ │ ├── guide/ │ │ │ ├── batch-delete.md │ │ │ ├── cloud-sync.md │ │ │ ├── community.md │ │ │ ├── context-sync.md │ │ │ ├── deep-research.md │ │ │ ├── default-model.md │ │ │ ├── export.md │ │ │ ├── folders.md │ │ │ ├── fork.md │ │ │ ├── formula-copy.md │ │ │ ├── getting-started.md │ │ │ ├── input-collapse.md │ │ │ ├── installation.md │ │ │ ├── markdown-fix.md │ │ │ ├── mermaid.md │ │ │ ├── nanobanana.md │ │ │ ├── prevent-auto-scroll.md │ │ │ ├── prompts.md │ │ │ ├── quote-reply.md │ │ │ ├── recents-hider.md │ │ │ ├── settings.md │ │ │ ├── sidebar-auto-hide.md │ │ │ ├── sidebar.md │ │ │ ├── sponsor.md │ │ │ ├── tab-title.md │ │ │ └── timeline.md │ │ ├── index.md │ │ └── privacy.md │ ├── guide/ │ │ ├── batch-delete.md │ │ ├── cloud-sync.md │ │ ├── community.md │ │ ├── context-sync.md │ │ ├── deep-research.md │ │ ├── default-model.md │ │ ├── export.md │ │ ├── folders.md │ │ ├── fork.md │ │ ├── formula-copy.md │ │ ├── getting-started.md │ │ ├── input-collapse.md │ │ ├── installation.md │ │ ├── markdown-fix.md │ │ ├── mermaid.md │ │ ├── nanobanana.md │ │ ├── prevent-auto-scroll.md │ │ ├── prompts.md │ │ ├── quote-reply.md │ │ ├── recents-hider.md │ │ ├── settings.md │ │ ├── sidebar-auto-hide.md │ │ ├── sidebar.md │ │ ├── sponsor.md │ │ ├── tab-title.md │ │ └── timeline.md │ ├── index.md │ ├── ja/ │ │ ├── guide/ │ │ │ ├── batch-delete.md │ │ │ ├── cloud-sync.md │ │ │ ├── community.md │ │ │ ├── context-sync.md │ │ │ ├── deep-research.md │ │ │ ├── default-model.md │ │ │ ├── export.md │ │ │ ├── folders.md │ │ │ ├── fork.md │ │ │ ├── formula-copy.md │ │ │ ├── getting-started.md │ │ │ ├── input-collapse.md │ │ │ ├── installation.md │ │ │ ├── markdown-fix.md │ │ │ ├── mermaid.md │ │ │ ├── nanobanana.md │ │ │ ├── prevent-auto-scroll.md │ │ │ ├── prompts.md │ │ │ ├── quote-reply.md │ │ │ ├── recents-hider.md │ │ │ ├── settings.md │ │ │ ├── sidebar-auto-hide.md │ │ │ ├── sidebar.md │ │ │ ├── sponsor.md │ │ │ ├── tab-title.md │ │ │ └── timeline.md │ │ ├── index.md │ │ └── privacy.md │ ├── ko/ │ │ ├── guide/ │ │ │ ├── batch-delete.md │ │ │ ├── cloud-sync.md │ │ │ ├── community.md │ │ │ ├── context-sync.md │ │ │ ├── deep-research.md │ │ │ ├── default-model.md │ │ │ ├── export.md │ │ │ ├── folders.md │ │ │ ├── fork.md │ │ │ ├── formula-copy.md │ │ │ ├── getting-started.md │ │ │ ├── input-collapse.md │ │ │ ├── installation.md │ │ │ ├── markdown-fix.md │ │ │ ├── mermaid.md │ │ │ ├── nanobanana.md │ │ │ ├── prevent-auto-scroll.md │ │ │ ├── prompts.md │ │ │ ├── quote-reply.md │ │ │ ├── recents-hider.md │ │ │ ├── settings.md │ │ │ ├── sidebar-auto-hide.md │ │ │ ├── sidebar.md │ │ │ ├── sponsor.md │ │ │ ├── tab-title.md │ │ │ └── timeline.md │ │ ├── index.md │ │ └── privacy.md │ ├── privacy.md │ ├── pt/ │ │ ├── guide/ │ │ │ ├── batch-delete.md │ │ │ ├── cloud-sync.md │ │ │ ├── community.md │ │ │ ├── context-sync.md │ │ │ ├── deep-research.md │ │ │ ├── default-model.md │ │ │ ├── export.md │ │ │ ├── folders.md │ │ │ ├── fork.md │ │ │ ├── formula-copy.md │ │ │ ├── getting-started.md │ │ │ ├── input-collapse.md │ │ │ ├── installation.md │ │ │ ├── markdown-fix.md │ │ │ ├── mermaid.md │ │ │ ├── nanobanana.md │ │ │ ├── prevent-auto-scroll.md │ │ │ ├── prompts.md │ │ │ ├── quote-reply.md │ │ │ ├── recents-hider.md │ │ │ ├── settings.md │ │ │ ├── sidebar-auto-hide.md │ │ │ ├── sidebar.md │ │ │ ├── sponsor.md │ │ │ ├── tab-title.md │ │ │ └── timeline.md │ │ ├── index.md │ │ └── privacy.md │ ├── public/ │ │ └── google79cf501ea29c5eb1.html │ ├── ru/ │ │ ├── guide/ │ │ │ ├── batch-delete.md │ │ │ ├── cloud-sync.md │ │ │ ├── community.md │ │ │ ├── context-sync.md │ │ │ ├── deep-research.md │ │ │ ├── default-model.md │ │ │ ├── export.md │ │ │ ├── folders.md │ │ │ ├── fork.md │ │ │ ├── formula-copy.md │ │ │ ├── getting-started.md │ │ │ ├── input-collapse.md │ │ │ ├── installation.md │ │ │ ├── markdown-fix.md │ │ │ ├── mermaid.md │ │ │ ├── nanobanana.md │ │ │ ├── prevent-auto-scroll.md │ │ │ ├── prompts.md │ │ │ ├── quote-reply.md │ │ │ ├── recents-hider.md │ │ │ ├── settings.md │ │ │ ├── sidebar-auto-hide.md │ │ │ ├── sidebar.md │ │ │ ├── sponsor.md │ │ │ ├── tab-title.md │ │ │ └── timeline.md │ │ ├── index.md │ │ └── privacy.md │ └── zh_TW/ │ ├── guide/ │ │ ├── batch-delete.md │ │ ├── cloud-sync.md │ │ ├── community.md │ │ ├── context-sync.md │ │ ├── deep-research.md │ │ ├── default-model.md │ │ ├── export.md │ │ ├── folders.md │ │ ├── fork.md │ │ ├── formula-copy.md │ │ ├── getting-started.md │ │ ├── input-collapse.md │ │ ├── installation.md │ │ ├── markdown-fix.md │ │ ├── mermaid.md │ │ ├── nanobanana.md │ │ ├── prevent-auto-scroll.md │ │ ├── prompts.md │ │ ├── quote-reply.md │ │ ├── recents-hider.md │ │ ├── settings.md │ │ ├── sidebar-auto-hide.md │ │ ├── sidebar.md │ │ ├── sponsor.md │ │ ├── tab-title.md │ │ └── timeline.md │ ├── index.md │ └── privacy.md ├── eslint.config.js ├── manifest.dev.json ├── manifest.json ├── nodemon.chrome.json ├── nodemon.firefox.json ├── nodemon.safari.json ├── package.json ├── public/ │ ├── contentStyle.css │ ├── fetchInterceptor.js │ ├── katex-config.js │ └── prevent-auto-scroll.js ├── safari/ │ ├── App/ │ │ └── SafariWebExtensionHandler.swift │ ├── Models/ │ │ ├── SafariMessage.swift │ │ └── voyager-v1.3.6.dmg │ ├── README.md │ ├── README_ZH.md │ └── Resources/ │ └── example-native-messaging.js ├── scripts/ │ ├── build-edge.js │ ├── build-safari.sh │ ├── bump-version.js │ ├── generate-sponsors.cjs │ └── launch-chrome.cjs ├── sponsorkit/ │ └── sponsors.json ├── src/ │ ├── assets/ │ │ └── styles/ │ │ └── tailwind.css │ ├── components/ │ │ ├── DarkModeToggle.tsx │ │ ├── LanguageSwitcher.tsx │ │ └── ui/ │ │ ├── button.tsx │ │ ├── card.tsx │ │ ├── label.tsx │ │ ├── select.tsx │ │ ├── slider.tsx │ │ └── switch.tsx │ ├── contexts/ │ │ └── LanguageContext.tsx │ ├── core/ │ │ ├── errors/ │ │ │ └── AppError.ts │ │ ├── index.ts │ │ ├── services/ │ │ │ ├── AccountIsolationService.ts │ │ │ ├── DOMService.ts │ │ │ ├── DataBackupService.ts │ │ │ ├── GoogleDriveSyncService.ts │ │ │ ├── KeyboardShortcutService.ts │ │ │ ├── LoggerService.ts │ │ │ ├── StorageMonitor.ts │ │ │ ├── StorageService.ts │ │ │ └── __tests__/ │ │ │ ├── AccountIsolationService.test.ts │ │ │ ├── GoogleDriveSyncService.test.ts │ │ │ └── StorageService.test.ts │ │ ├── types/ │ │ │ ├── common.ts │ │ │ ├── folder.ts │ │ │ ├── keyboardShortcut.ts │ │ │ ├── sync.ts │ │ │ └── timeline.ts │ │ └── utils/ │ │ ├── __tests__/ │ │ │ ├── browser.test.ts │ │ │ ├── concurrency.test.ts │ │ │ ├── extensionContext.test.ts │ │ │ ├── gemini.test.ts │ │ │ ├── rtl.test.ts │ │ │ ├── updateReminder.test.ts │ │ │ └── version.test.ts │ │ ├── array.ts │ │ ├── async.ts │ │ ├── browser.ts │ │ ├── concurrency.ts │ │ ├── extensionContext.ts │ │ ├── gemini.ts │ │ ├── hash.ts │ │ ├── rtl.ts │ │ ├── safariStorage.ts │ │ ├── selectors.ts │ │ ├── storageMigration.ts │ │ ├── text.ts │ │ ├── updateReminder.ts │ │ └── version.ts │ ├── features/ │ │ ├── backup/ │ │ │ ├── index.ts │ │ │ ├── services/ │ │ │ │ ├── BackupService.ts │ │ │ │ └── PromptImportExportService.ts │ │ │ └── types/ │ │ │ └── backup.ts │ │ ├── contextSync/ │ │ │ ├── adapters/ │ │ │ │ └── index.ts │ │ │ ├── services/ │ │ │ │ └── SyncService.ts │ │ │ └── types.ts │ │ ├── export/ │ │ │ ├── services/ │ │ │ │ ├── ConversationExportService.ts │ │ │ │ ├── DOMContentExtractor.ts │ │ │ │ ├── DeepResearchPDFPrintService.ts │ │ │ │ ├── ImageExportService.ts │ │ │ │ ├── ImageRenderService.ts │ │ │ │ ├── MarkdownFormatter.ts │ │ │ │ ├── PDFPrintService.ts │ │ │ │ └── __tests__/ │ │ │ │ ├── ConversationExportService.test.ts │ │ │ │ ├── DOMContentExtractor.test.ts │ │ │ │ ├── DeepResearchPDFPrintService.test.ts │ │ │ │ ├── ImageExportService.test.ts │ │ │ │ ├── ImageRenderService.test.ts │ │ │ │ ├── MarkdownFormatter.test.ts │ │ │ │ ├── PDFPrintService.safari.test.ts │ │ │ │ └── PDFPrintService.test.ts │ │ │ ├── types/ │ │ │ │ ├── errors.ts │ │ │ │ └── export.ts │ │ │ └── ui/ │ │ │ ├── ExportDialog.ts │ │ │ ├── ExportErrorMessage.ts │ │ │ ├── ExportToast.ts │ │ │ └── __tests__/ │ │ │ ├── ExportDialog.safariHint.test.ts │ │ │ ├── ExportDialog.test.ts │ │ │ ├── ExportErrorMessage.test.ts │ │ │ └── ExportToast.test.ts │ │ ├── folder/ │ │ │ ├── services/ │ │ │ │ └── FolderImportExportService.ts │ │ │ └── types/ │ │ │ └── import-export.ts │ │ └── formulaCopy/ │ │ ├── FormulaCopyService.test.ts │ │ ├── FormulaCopyService.ts │ │ └── index.ts │ ├── global.d.ts │ ├── hooks/ │ │ ├── useDarkMode.ts │ │ └── useWidthAdjuster.ts │ ├── lib/ │ │ └── utils.ts │ ├── locales/ │ │ ├── ar/ │ │ │ └── messages.json │ │ ├── en/ │ │ │ └── messages.json │ │ ├── es/ │ │ │ └── messages.json │ │ ├── fr/ │ │ │ └── messages.json │ │ ├── ja/ │ │ │ └── messages.json │ │ ├── ko/ │ │ │ └── messages.json │ │ ├── pt/ │ │ │ └── messages.json │ │ ├── ru/ │ │ │ └── messages.json │ │ ├── zh/ │ │ │ └── messages.json │ │ └── zh_TW/ │ │ └── messages.json │ ├── pages/ │ │ ├── background/ │ │ │ └── index.ts │ │ ├── content/ │ │ │ ├── changelog/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── changelog.test.ts │ │ │ │ ├── index.ts │ │ │ │ └── notes/ │ │ │ │ ├── 1.2.9.md │ │ │ │ ├── 1.3.0.md │ │ │ │ ├── 1.3.1.md │ │ │ │ ├── 1.3.2.md │ │ │ │ ├── 1.3.3.md │ │ │ │ ├── 1.3.4.md │ │ │ │ ├── 1.3.5.md │ │ │ │ └── 1.3.6.md │ │ │ ├── chatWidth/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── chatWidth.test.ts │ │ │ │ └── index.ts │ │ │ ├── contextSync/ │ │ │ │ ├── capture.ts │ │ │ │ └── index.ts │ │ │ ├── deepResearch/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── menuButton.test.ts │ │ │ │ │ └── reportExtractor.test.ts │ │ │ │ ├── download.ts │ │ │ │ ├── extractor.ts │ │ │ │ ├── formatter.ts │ │ │ │ ├── index.ts │ │ │ │ ├── menuButton.ts │ │ │ │ ├── reportExtractor.ts │ │ │ │ └── types.ts │ │ │ ├── defaultModel/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── modelLocker.test.ts │ │ │ │ ├── modelLocker.ts │ │ │ │ └── styles.css │ │ │ ├── editInputWidth/ │ │ │ │ └── index.ts │ │ │ ├── export/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── conversationDom.test.ts │ │ │ │ │ ├── conversationMenuI18n.test.ts │ │ │ │ │ ├── conversationMenuInjection.test.ts │ │ │ │ │ ├── responseActionImageButton.test.ts │ │ │ │ │ ├── responseImageCopy.test.ts │ │ │ │ │ ├── selectionModeInteraction.test.ts │ │ │ │ │ ├── selectionUtils.test.ts │ │ │ │ │ ├── sidebarConversationTarget.test.ts │ │ │ │ │ ├── sidebarExportResume.test.ts │ │ │ │ │ └── topNodePreload.test.ts │ │ │ │ ├── conversationDom.ts │ │ │ │ ├── conversationMenuInjection.ts │ │ │ │ ├── index.ts │ │ │ │ ├── responseActionImageButton.ts │ │ │ │ ├── responseImageCopy.ts │ │ │ │ ├── selectionUtils.ts │ │ │ │ ├── sidebarConversationTarget.ts │ │ │ │ ├── sidebarExportResume.ts │ │ │ │ └── topNodePreload.ts │ │ │ ├── folder/ │ │ │ │ ├── README.md │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── aistudio.test.ts │ │ │ │ │ ├── conversationSort.test.ts │ │ │ │ │ ├── folderNameInteraction.test.ts │ │ │ │ │ ├── moveToFolderMenuItem.test.ts │ │ │ │ │ └── treeIndent.test.ts │ │ │ │ ├── aistudio.ts │ │ │ │ ├── conversationSort.ts │ │ │ │ ├── folderColors.ts │ │ │ │ ├── gemConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── manager.ts │ │ │ │ ├── moveToFolderMenuItem.ts │ │ │ │ ├── storage/ │ │ │ │ │ └── FolderStorageAdapter.ts │ │ │ │ └── types.ts │ │ │ ├── folderSpacing/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── folderSpacing.test.ts │ │ │ │ └── index.ts │ │ │ ├── fork/ │ │ │ │ ├── ForkNodesService.ts │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── ForkNodesService.test.ts │ │ │ │ │ ├── branching.test.ts │ │ │ │ │ ├── chatPairs.test.ts │ │ │ │ │ ├── featureFlag.test.ts │ │ │ │ │ ├── forkContext.test.ts │ │ │ │ │ ├── index.test.ts │ │ │ │ │ ├── markdown.test.ts │ │ │ │ │ └── turnId.test.ts │ │ │ │ ├── branching.ts │ │ │ │ ├── chatPairs.ts │ │ │ │ ├── featureFlag.ts │ │ │ │ ├── forkContext.ts │ │ │ │ ├── forkTypes.ts │ │ │ │ ├── index.ts │ │ │ │ ├── markdown.ts │ │ │ │ └── turnId.ts │ │ │ ├── gemsHider/ │ │ │ │ └── index.ts │ │ │ ├── index.tsx │ │ │ ├── inputCollapse/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── inputCollapse.test.ts │ │ │ │ └── index.ts │ │ │ ├── katexConfig/ │ │ │ │ └── index.ts │ │ │ ├── markdownPatcher/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── fixBrokenBoldTags.test.ts │ │ │ │ └── index.ts │ │ │ ├── mermaid/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── mermaid.test.ts │ │ │ │ └── index.ts │ │ │ ├── preventAutoScroll/ │ │ │ │ └── index.ts │ │ │ ├── prompt/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── scrollHint.test.ts │ │ │ │ ├── index.ts │ │ │ │ └── scrollHint.ts │ │ │ ├── quoteReply/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── quoteReply.test.ts │ │ │ │ └── index.ts │ │ │ ├── recentsHider/ │ │ │ │ └── index.ts │ │ │ ├── sendBehavior/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── sendBehavior.test.ts │ │ │ │ ├── index.ts │ │ │ │ └── utils.ts │ │ │ ├── shared/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── nativeMenuItemTemplate.test.ts │ │ │ │ └── nativeMenuItemTemplate.ts │ │ │ ├── sidebarAutoHide/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── SidebarAutoHide.test.ts │ │ │ │ └── index.ts │ │ │ ├── sidebarWidth/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── sidebarWidthCentering.test.ts │ │ │ │ └── index.ts │ │ │ ├── timeline/ │ │ │ │ ├── EventBus.ts │ │ │ │ ├── StarredMessagesService.ts │ │ │ │ ├── TimelinePreviewPanel.ts │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── TimelineBootstrap.test.ts │ │ │ │ │ ├── TimelineManagerActiveIndex.test.ts │ │ │ │ │ ├── TimelineManagerFlowClickActiveReset.test.ts │ │ │ │ │ ├── TimelineManagerNavigationRefresh.test.ts │ │ │ │ │ ├── TimelineManagerPreviewPanelReposition.test.ts │ │ │ │ │ ├── TimelineManagerSelectorPriority.test.ts │ │ │ │ │ ├── TimelineManagerSummaryExtraction.test.ts │ │ │ │ │ ├── TimelineManagerTooltipDirection.test.ts │ │ │ │ │ └── TimelinePreviewPanel.test.ts │ │ │ │ ├── index.ts │ │ │ │ ├── manager.ts │ │ │ │ ├── starredTypes.ts │ │ │ │ └── types.ts │ │ │ ├── timestamp/ │ │ │ │ ├── TimestampService.ts │ │ │ │ └── __tests__/ │ │ │ │ └── TimestampService.test.ts │ │ │ ├── titleUpdater/ │ │ │ │ └── index.ts │ │ │ ├── visualEffects/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── rain.test.ts │ │ │ │ │ ├── sakura.test.ts │ │ │ │ │ └── snow.test.ts │ │ │ │ ├── index.ts │ │ │ │ ├── rain.ts │ │ │ │ ├── sakura.ts │ │ │ │ └── snow.ts │ │ │ └── watermarkRemover/ │ │ │ ├── __tests__/ │ │ │ │ ├── downloadButton.test.ts │ │ │ │ ├── downloadToasts.test.ts │ │ │ │ ├── fetchInterceptor.test.ts │ │ │ │ └── statusToast.test.ts │ │ │ ├── alphaMap.ts │ │ │ ├── blendModes.ts │ │ │ ├── credits.ts │ │ │ ├── downloadButton.ts │ │ │ ├── index.ts │ │ │ ├── statusToast.ts │ │ │ └── watermarkEngine.ts │ │ ├── devtools/ │ │ │ ├── index.html │ │ │ └── index.ts │ │ ├── options/ │ │ │ ├── Options.css │ │ │ ├── Options.tsx │ │ │ ├── index.css │ │ │ ├── index.html │ │ │ └── index.tsx │ │ ├── panel/ │ │ │ ├── Panel.css │ │ │ ├── Panel.tsx │ │ │ ├── index.css │ │ │ ├── index.html │ │ │ └── index.tsx │ │ └── popup/ │ │ ├── Popup.tsx │ │ ├── __tests__/ │ │ │ └── latestVersion.test.ts │ │ ├── components/ │ │ │ ├── CloudSyncSettings.tsx │ │ │ ├── ContextSyncSettings.tsx │ │ │ ├── KeyboardShortcutSettings.tsx │ │ │ ├── StarredHistory.tsx │ │ │ ├── WebsiteLogos.tsx │ │ │ ├── WidthSlider.tsx │ │ │ └── __tests__/ │ │ │ └── CloudSyncSettings.test.tsx │ │ ├── index.css │ │ ├── index.html │ │ ├── index.tsx │ │ └── utils/ │ │ └── latestVersion.ts │ ├── tests/ │ │ └── setup.ts │ ├── utils/ │ │ ├── __tests__/ │ │ │ ├── i18n.test.ts │ │ │ ├── language.test.ts │ │ │ ├── mergeForkNodes.test.ts │ │ │ ├── mergeStarredMessages.test.ts │ │ │ └── translations.test.ts │ │ ├── i18n.ts │ │ ├── language.ts │ │ ├── localeMessages.ts │ │ ├── merge.test.ts │ │ ├── merge.ts │ │ └── translations.ts │ └── vite-env.d.ts ├── tsconfig.json ├── vite.config.base.ts ├── vite.config.chrome.ts ├── vite.config.firefox.ts ├── vite.config.safari.ts └── vitest.config.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .claude/rules/content-scripts.md ================================================ --- globs: ["src/pages/content/**", "public/contentStyle.css"] --- # Content Script Rules ## CSS - All injected CSS classes MUST be prefixed with `gv-` (e.g., `.gv-rtl`, `.gv-pm-trigger`) - Styles go in `public/contentStyle.css` - Support both light and dark themes: use `.theme-host.light-theme` / `.theme-host.dark-theme` overrides, NOT `@media (prefers-color-scheme)` - RTL layout: use `body.gv-rtl` selector for RTL overrides (see `src/core/utils/rtl.ts`) ## Storage - Content scripts use `chrome.storage` / `browser.storage` directly via ExtGlobal — this is the exception to the "use StorageService" rule - StorageService is for popup/background/options contexts ## DOM Injection - Each content script sub-module in `src/pages/content/` is self-contained - Bridge between Gemini UI and Extension — Gemini DOM structure may change without notice - Safari has limitations: cloud sync, watermark removal, image export are disabled. Check `isSafari()` guards. - Extension context can be invalidated after update/reload. Use `isExtensionContextInvalidatedError()`. ## Material Symbols Icons - When adding new icons in popup, add the icon name to `icon_names=` in the Google Fonts URL in `src/pages/popup/index.html` ================================================ FILE: .claude/rules/high-complexity.md ================================================ --- globs: ["src/core/services/StorageService.ts", "src/core/services/DataBackupService.ts", "src/core/services/GoogleDriveSyncService.ts", "src/core/services/AccountIsolationService.ts", "src/features/folder/**", "src/features/export/**"] --- # High-Complexity Modules — Edit with Caution | Module | Risk | Notes | |--------|------|-------| | `StorageService` | Sync/local/session logic + migration. Single source of truth for persistence. | Do not modify lightly. | | `DataBackupService` | Multi-layer backup. Race conditions during unload. | Critical for data safety. | | `GoogleDriveSyncService` | OAuth2 cloud sync (folders, prompts, starred). | Requires OAuth2 identity. | | `AccountIsolationService` | Hard account isolation for multi-account. | Integrates with Drive sync. | | `features/folder` | Drag-and-drop + cloud sync UI. DOM manipulation + state sync. | Watch for infinite loops. | | `features/export` | JSON/MD/PDF/Image export + Deep Research. | Fragile to Gemini UI changes. Multi-browser compat. | ## Before modifying these modules 1. Read the entire file first — not just the section you plan to change 2. List all existing features that might be affected 3. Ensure zero destructiveness to user data 4. Run full test suite after changes ================================================ FILE: .claude/rules/i18n.md ================================================ --- globs: ["src/locales/**"] --- # i18n / Translation Rules ## 10 Locales (ALL must be updated together) `en`, `ar`, `es`, `fr`, `ja`, `ko`, `pt`, `ru`, `zh`, `zh_TW` ## When adding a new translation key 1. Add the key to ALL 10 `src/locales/*/messages.json` files 2. English (`en`) is the source — write it first, then translate to all others 3. Keys are flat strings in JSON, no nesting ## When removing a translation key - Remove from ALL 10 locale files ## Quality - Translations should be natural, not machine-literal - Arabic (`ar`) is RTL — ensure UI handles it (see `src/core/utils/rtl.ts`) ================================================ FILE: .claude/rules/typescript.md ================================================ --- globs: ["src/**/*.ts", "src/**/*.tsx"] --- # TypeScript Coding Standards ## DOs - Prefer plain objects with interfaces/types for data structures - Use `map`, `filter`, `reduce` for immutability - Use `private`/`protected` in classes - Use `unknown` + narrowing (Zod or custom guards) for type safety - Use named exports: `export function X` - Functional React: hooks at top level, strictly functional components ## DON'Ts - **No `any` type.** Use `unknown` if you must, then narrow it. - **No global variables** outside defined Services. - **No `chrome.storage` in UI components** (`src/components/`, `src/pages/popup/`). Use `StorageService`. - **No God Components.** Business logic belongs in `features/*/services/` or custom hooks, not UI files. - **No magic strings.** Use constants or enums (StorageKeys, CSS classes). - **No `console.log` in production.** Use `LoggerService` for critical info. ## Testing (Vitest + jsdom) - Chrome `chrome` object is globally mocked in `src/tests/setup.ts` - Mock specific storage: `(chrome.storage.sync.get as any).mockResolvedValue({ key: 'val' })` - Run: `bun run test`, `bun run test `, `bun run test:coverage` ================================================ FILE: .claude/settings.json ================================================ { "hooks": { "PostToolUse": [ { "matcher": "Task", "hooks": [ { "type": "command", "command": "entire hooks claude-code post-task" } ] }, { "matcher": "TodoWrite", "hooks": [ { "type": "command", "command": "entire hooks claude-code post-todo" } ] } ], "PreToolUse": [ { "matcher": "Task", "hooks": [ { "type": "command", "command": "entire hooks claude-code pre-task" } ] } ], "SessionEnd": [ { "matcher": "", "hooks": [ { "type": "command", "command": "entire hooks claude-code session-end" } ] } ], "SessionStart": [ { "matcher": "", "hooks": [ { "type": "command", "command": "entire hooks claude-code session-start" } ] } ], "Stop": [ { "matcher": "", "hooks": [ { "type": "command", "command": "entire hooks claude-code stop" } ] } ], "UserPromptSubmit": [ { "matcher": "", "hooks": [ { "type": "command", "command": "entire hooks claude-code user-prompt-submit" } ] } ] }, "permissions": { "deny": [ "Read(./.entire/metadata/**)" ] } } ================================================ FILE: .claude/skills/safari-release/SKILL.md ================================================ --- name: safari-release description: Build Safari extension with update check enabled, guide user through Xcode export, and create DMG for distribution. Use when user wants to release a new Safari version or create a Safari DMG. user-invocable: true --- # Safari Release Workflow Build the Safari extension for manual distribution and create a signed DMG. ## Steps ### 1. Read version from package.json Read `package.json` to get the current version number. Store it as `VERSION` for later steps. ### 2. Build Safari with update check enabled Run the following command: ```bash ENABLE_SAFARI_UPDATE_CHECK=true bun run build:safari ``` Wait for the build to complete successfully. If it fails, report the error and stop. ### 3. Prompt user for Xcode export Tell the user: > Safari build complete (`dist_safari/`). Please complete the following steps in Xcode: > > 1. Open the Xcode project (if not already open) > 2. **Product → Archive** > 3. **Window → Organizer** → select the archive → **Distribute App** > 4. Export the signed `Gemini Voyager.app` into `safari/Models/dmg_source/` > > Let me know when you're done exporting. **Wait for the user to confirm** before proceeding. Do NOT continue until the user says they're done. ### 4. Verify the exported app exists Check that `safari/Models/dmg_source/Gemini Voyager.app` exists: ```bash ls "safari/Models/dmg_source/Gemini Voyager.app" ``` If it doesn't exist, ask the user to check their export path. ### 5. Create DMG Run `create-dmg` in the `safari/Models` directory: ```bash cd safari/Models && create-dmg \ --volname "Gemini Voyager" \ --window-size 600 400 \ --icon-size 100 \ --icon "Gemini Voyager.app" 175 190 \ --app-drop-link 425 190 \ "voyager-v${VERSION}.dmg" \ dmg_source ``` ### 6. Verify and report Confirm the DMG was created at `safari/Models/voyager-v${VERSION}.dmg` and report success to the user. ================================================ FILE: .editorconfig ================================================ root = true [*] charset = utf-8 end_of_line = lf insert_final_newline = true indent_style = space indent_size = 2 trim_trailing_whitespace = true [*.md] trim_trailing_whitespace = false ================================================ FILE: .entire/.gitignore ================================================ tmp/ settings.local.json metadata/ logs/ ================================================ FILE: .entire/settings.json ================================================ { "strategy": "manual-commit", "enabled": true, "telemetry": false } ================================================ FILE: .gitattributes ================================================ # Auto detect text files and normalize line endings to LF * text=auto eol=lf # Explicitly declare file types *.ts text eol=lf *.tsx text eol=lf *.js text eol=lf *.jsx text eol=lf *.json text eol=lf *.md text eol=lf *.css text eol=lf *.html text eol=lf *.yml text eol=lf *.yaml text eol=lf # Binary files (don't modify) *.png binary *.jpg binary *.jpeg binary *.gif binary *.ico binary *.woff binary *.woff2 binary *.ttf binary *.eot binary bun.lockb binary ================================================ FILE: .github/CONTRIBUTING.md ================================================ > **🌐 语言 / Language**: [中文](#贡献指南) | [English](#contributing-to-gemini-voyager) | [Español](CONTRIBUTING_ES.md) | [Français](CONTRIBUTING_FR.md) | [日本語](CONTRIBUTING_JA.md) --- # 贡献指南 > [!CAUTION] > **本项目暂时不接受任何新功能的 PR。** 如果你有一个很想做的功能,请按以下流程操作: > > 1. **先开一个 Issue 与维护者讨论**你的想法和方案 > 2. **等待维护者同意,并确定了一个好的实现方案后**,再开始编码并提交 PR > > 未经讨论直接提交的新功能 PR 将被直接关闭,不予审核。感谢理解。 > [!IMPORTANT] > **项目状态:低频维护。** 回复较慢。优先处理带测试的 PR。 感谢你考虑为 Voyager 做出贡献!🚀 本文档提供贡献的指南和说明。我们欢迎错误修复、文档改进和翻译等贡献。关于新功能,请务必先通过 Issue 进行讨论。 ## 🚫 AI 政策 **本项目拒绝接受任何未经人工复核的 AI 生成的 PR。** 虽然 AI 是很好的辅助工具,但“懒惰”的复制粘贴贡献会浪费维护者的时间。 - **缺乏逻辑解释** 或缺少必要测试的 PR 将将被拒绝。 - 你必须理解并对你提交的每一行代码负责。 - **Git 协作能力**:你应熟悉 GitHub 和 Git 的基本工作流,确保能在 AI Agent 的辅助下正确进行开源协作。如果你对此尚不熟悉,建议先学习相关知识,请保持 PR 中的 Git 历史整洁,避免出现混乱的提交记录。 ## 目录 - [快速开始](#快速开始) - [认领 Issue](#认领-issue) - [开发环境设置](#开发环境设置) - [进行更改](#进行更改) - [提交 Pull Request](#提交-pull-request) - [代码风格](#代码风格) - [添加 Gem 支持](#添加-gem-支持) - [许可证](#许可证) --- ## 快速开始 ### 前置要求 - **Bun** 1.0+(必需) - 用于测试的 Chromium 内核浏览器(Chrome、Edge、Brave 等) - **Firefox:必须进行测试。** - **Safari:作为可选项目**。如果有环境请进行测试;或者由 AI/自行判断该功能是否为 Safari 不支持的功能,并请予以标注。 ### 快速启动 ```bash # 克隆仓库 git clone https://github.com/Nagi-ovo/gemini-voyager.git cd gemini-voyager # 安装依赖 bun install # 启动开发模式 bun run dev ``` --- ## 认领 Issue 为避免重复工作并协调贡献: ### 1. 检查现有工作 在开始之前,检查 issue 的 **Assignees** 部分,确认是否已有人被分配。 ### 2. 认领 Issue 在任何未分配的 issue 上评论 `/claim`,机器人将自动将你分配为负责人。 ### 3. 取消认领 如果你无法继续处理某个 issue,评论 `/unclaim` 即可释放它供他人处理。 ### 4. 贡献意愿复选框 创建 issue 时,你可以勾选"我愿意贡献代码"复选框,表明你有兴趣实现该功能或修复。 --- ## 开发环境设置 ### 安装依赖 ```bash bun install ``` ### 可用命令 | 命令 | 描述 | | --------------------- | -------------------------------- | | `bun run dev` | 启动 Chrome 开发模式(热重载) | | `bun run dev:firefox` | 启动 Firefox 开发模式 | | `bun run dev:safari` | 启动 Safari 开发模式(仅 macOS) | | `bun run build` | Chrome 生产构建 | | `bun run build:all` | 所有浏览器生产构建 | | `bun run lint` | 运行 ESLint 并自动修复 | | `bun run typecheck` | 运行 TypeScript 类型检查 | | `bun run test` | 运行测试套件 | ### 加载扩展 1. 运行 `bun run dev` 启动开发构建 2. 打开 Chrome,访问 `chrome://extensions/` 3. 启用"开发者模式" 4. 点击"加载已解压的扩展程序",选择 `dist_chrome` 文件夹 --- ## 进行更改 ### 开始之前 1. **从 `main` 创建分支**: ```bash git checkout -b feature/your-feature-name # 或 git checkout -b fix/your-bug-fix ``` 2. **关联 Issue** - 在实现一个新功能时,请**务必先开启一个 Issue 进行讨论**。未经讨论直接提交的新功能 PR 将被关闭。在提交 PR 时,请链接该 Issue。 ### 提交前检查清单 提交前,请务必运行: ```bash bun run lint # 修复代码风格问题 bun run format # 格式化代码 bun run typecheck # 检查类型 bun run build # 验证构建成功 bun run test # 运行测试 ``` 并确保: 1. 你的更改实现了预期功能。 2. 你的更改没有影响现有的原有功能。 --- ## 测试策略 我们遵循“基于 ROI”的测试策略:**测逻辑,不测 DOM。** 1. **必须测 (Logic)**:核心服务(Storage, Backup)、数据解析和工具函数。必须使用 TDD。 2. **建议测 (State)**:复杂的 UI 状态(如文件夹 Reducer)。 3. **跳过 (Fragile)**:直接 DOM 操作(Content Scripts)和纯 UI 组件。请使用防御性编程代替。 --- ## 提交 Pull Request ### PR 指南 1. **标题**:使用清晰的描述性标题(如 "feat: add dark mode toggle" 或 "fix: timeline scroll sync") 2. **描述**:解释你做了什么更改以及原因 3. **用户影响**:描述用户将如何受到影响 4. **可视化证据(严格)**:对于任何 UI 修改或新功能,**必须**提供截图或屏幕录制。**没有截图 = 不予审核/回复。** 5. **Issue 引用**:链接相关 issue(如 "Closes #123") 6. **测试与逻辑**:PR 必须包含单元测试并清晰解释修改逻辑。不接受没有上下文的“魔法”修复。 ### 提交信息格式 遵循 [Conventional Commits](https://www.conventionalcommits.org/): - `feat:` - 新功能 - `fix:` - 错误修复 - `docs:` - 文档更改 - `chore:` - 维护任务 - `refactor:` - 代码重构 - `test:` - 添加或更新测试 --- ## 代码风格 ### 通用指南 - **优先使用提前返回**而非嵌套条件 - **使用描述性名称** - 避免缩写 - **避免魔法数字** - 使用命名常量 - **匹配现有风格** - 一致性优于偏好 ### TypeScript 约定 - **PascalCase**:类、接口、类型、枚举、React 组件 - **camelCase**:函数、变量、方法 - **UPPER_SNAKE_CASE**:常量 ### 导入顺序 1. React 及相关导入 2. 第三方库 3. 内部绝对导入(`@/...`) 4. 相对导入(`./...`) 5. 仅类型导入 --- ## 添加 Gem 支持 如需为新 Gem(官方 Google Gems 或自定义 Gems)添加支持: 1. 打开 `src/pages/content/folder/gemConfig.ts` 2. 在 `GEM_CONFIG` 数组中添加新条目: ```typescript { id: 'your-gem-id', // URL 中的 ID:/gem/your-gem-id/... name: 'Your Gem Name', // 显示名称 icon: 'material_icon_name', // Google Material Symbols 图标 } ``` ### 查找 Gem ID - 打开与该 Gem 的对话 - 检查 URL:`https://gemini.google.com/app/gem/[GEM_ID]/...` - 在配置中使用 `[GEM_ID]` 部分 ### 选择图标 使用有效的 [Google Material Symbols](https://fonts.google.com/icons) 图标名称: | 图标 | 用途 | | -------------- | -------------- | | `auto_stories` | 学习、教育 | | `lightbulb` | 创意、头脑风暴 | | `work` | 职业、专业 | | `code` | 编程、技术 | | `analytics` | 数据、分析 | --- ## 项目范围 Voyager 通过以下功能增强 Gemini AI 聊天体验: - 时间线导航 - 文件夹组织 - 指令宝库 - 聊天导出 - UI 自定义 **不在范围内**:网站爬取、网络拦截、账户自动化。 --- ## 获取帮助 - 💬 [GitHub Discussions](https://github.com/Nagi-ovo/gemini-voyager/discussions) - 提问 - 🐛 [Issues](https://github.com/Nagi-ovo/gemini-voyager/issues) - 报告错误 - 📖 [文档](https://gemini-voyager.vercel.app/) - 阅读文档 --- ## 许可证 提交贡献即表示你同意你的贡献将采用 [GPLv3 许可证](../LICENSE)。 --- # Contributing to Voyager > [!CAUTION] > **This project is currently NOT accepting PRs for new features.** If you have a feature you'd really like to build, please follow this process: > > 1. **Open an Issue first** to discuss your idea and approach with the maintainer > 2. **Wait for approval and a solid implementation plan** before writing any code or submitting a PR > > New feature PRs submitted without prior discussion will be closed without review. Thank you for understanding. > [!IMPORTANT] > **Project Status: Low Maintenance.** Expect delays in response. PRs with tests are prioritized. Thank you for considering contributing to Voyager! 🚀 This document provides guidelines and instructions for contributing. We welcome bug fixes, documentation improvements, and translations. For new features, please discuss via an Issue first. ## 🚫 AI Policy **We explicitly reject AI-generated PRs that have not been manually verified.** While AI tools are great assistants, "lazy" copy-paste contributions waste maintainer time. - **Low-quality AI PRs** will be closed immediately without discussion. - **PRs without explanation** of the logic or missing necessary tests will be rejected. - You must understand and take responsibility for every line of code you submit. - **Workflow Proficiency**: You should be familiar with GitHub and Git workflows and able to collaborate correctly using AI tools. If you are new to this, please learn the basics first to ensure a clean Git history in your PRs. ## Table of Contents - [Getting Started](#getting-started) - [Claiming an Issue](#claiming-an-issue) - [Development Setup](#development-setup) - [Making Changes](#making-changes) - [Submitting a Pull Request](#submitting-a-pull-request) - [Code Style](#code-style) - [Adding Gem Support](#adding-gem-support) - [License](#license) --- ## Getting Started ### Prerequisites - **Bun** 1.0+ (Required) - A Chromium-based browser for testing (Chrome, Edge, Brave, etc.) - **Firefox: Mandatory testing.** - **Safari: Optional.** If you have the environment, please test it. Alternatively, let AI or use your own judgment to determine if the feature is unsupported on Safari and label it accordingly. ### Quick Start ```bash # Clone the repository git clone https://github.com/Nagi-ovo/gemini-voyager.git cd gemini-voyager # Install dependencies bun install # Start development mode bun run dev ``` --- ## Claiming an Issue To avoid duplicate work and coordinate contributions: ### 1. Check for Existing Work Before starting, check if the issue is already assigned to someone by looking at the **Assignees** section. ### 2. Claim an Issue Comment `/claim` on any unassigned issue to automatically assign yourself. A bot will confirm the assignment. ### 3. Unclaim if Needed If you can no longer work on an issue, comment `/unclaim` to release it for others. ### 4. Contribution Checkbox When creating issues, you can check the "I am willing to contribute code" checkbox to indicate your interest in implementing the feature or fix. --- ## Development Setup ### Install Dependencies ```bash bun install ``` ### Available Commands | Command | Description | | --------------------- | --------------------------------------------- | | `bun run dev` | Start Chrome development mode with hot reload | | `bun run dev:firefox` | Start Firefox development mode | | `bun run dev:safari` | Start Safari development mode (macOS only) | | `bun run build` | Production build for Chrome | | `bun run build:all` | Production build for all browsers | | `bun run lint` | Run ESLint with auto-fix | | `bun run typecheck` | Run TypeScript type checking | | `bun run test` | Run test suite | ### Loading the Extension 1. Run `bun run dev` to start the development build 2. Open Chrome and go to `chrome://extensions/` 3. Enable "Developer mode" 4. Click "Load unpacked" and select the `dist_chrome` folder --- ## Making Changes ### Before You Start 1. **Create a branch** from `main`: ```bash git checkout -b feature/your-feature-name # or git checkout -b fix/your-bug-fix ``` 2. **Link Issues** - When implementing a new feature, you **must first open an Issue for discussion**. PRs for new features submitted without prior discussion will be closed. When submitting a PR, please link that Issue. ### Pre-Commit Checklist Before submitting, always run: ```bash bun run lint # Fix linting issues bun run format # Format code bun run typecheck # Check types bun run build # Verify build succeeds bun run test # Run tests ``` Ensure that: 1. Your changes achieve the desired functionality. 2. Your changes do not negatively affect existing features. --- ## Testing Strategy We follow a "ROI-based" testing strategy: **Test Logic, Not DOM.** 1. **Must Have (Logic)**: Core services (Storage, Backup), Data parsers, and Utils. TDD is required here. 2. **Should Have (State)**: Complex UI state (e.g., Folder reducer). 3. **Skip (Fragile)**: Direct DOM manipulation (Content Scripts) and pure UI components. Use defensive programming instead. --- ## Submitting a Pull Request ### PR Guidelines 1. **Title**: Use a clear, descriptive title (e.g., "feat: add dark mode toggle" or "fix: timeline scroll sync") 2. **Description**: Explain what changes you made and why 3. **User Impact**: Describe how users will be affected 4. **Visual Proof (Strict)**: For ANY UI changes or new features, you **MUST** provide screenshots or screen recordings. **No screenshot = No review/reply.** 5. **Issue Reference**: Link related issues (e.g., "Closes #123") 6. **Tests & Logic**: PRs must include unit tests and a clear explanation of the logic. "Magic" fixes without context are not accepted. ### Commit Message Format Follow [Conventional Commits](https://www.conventionalcommits.org/): - `feat:` - New features - `fix:` - Bug fixes - `docs:` - Documentation changes - `chore:` - Maintenance tasks - `refactor:` - Code refactoring - `test:` - Adding or updating tests --- ## Code Style ### General Guidelines - **Prefer early returns** over nested conditionals - **Use descriptive names** - avoid abbreviations - **Avoid magic numbers** - use named constants - **Match existing style** - consistency over preference ### TypeScript Conventions - **PascalCase**: Classes, interfaces, types, enums, React components - **camelCase**: Functions, variables, methods - **UPPER_SNAKE_CASE**: Constants ### Import Order 1. React & React-related imports 2. Third-party libraries 3. Internal absolute imports (`@/...`) 4. Relative imports (`./...`) 5. Type-only imports ```typescript import React, { useState } from 'react'; import { marked } from 'marked'; import { Button } from '@/components/ui/Button'; import { StorageService } from '@/core/services/StorageService'; import type { FolderData } from '@/core/types/folder'; import { parseData } from './parser'; ``` --- ## Adding Gem Support To add support for a new Gem (official Google Gems or custom Gems): 1. Open `src/pages/content/folder/gemConfig.ts` 2. Add a new entry to the `GEM_CONFIG` array: ```typescript { id: 'your-gem-id', // From URL: /gem/your-gem-id/... name: 'Your Gem Name', // Display name icon: 'material_icon_name', // Google Material Symbols icon } ``` ### Finding the Gem ID - Open a conversation with the Gem - Check the URL: `https://gemini.google.com/app/gem/[GEM_ID]/...` - Use the `[GEM_ID]` portion in your configuration ### Choosing an Icon Use valid [Google Material Symbols](https://fonts.google.com/icons) icon names: | Icon | Use Case | | -------------- | ---------------------- | | `auto_stories` | Learning, Education | | `lightbulb` | Ideas, Brainstorming | | `work` | Career, Professional | | `code` | Programming, Technical | | `analytics` | Data, Analysis | --- ## Project Scope Voyager enhances the Gemini AI chat experience with: - Timeline navigation - Folder organization - Prompt vault - Chat export - UI customization **Out of scope**: Site scraping, network interception, account automation. --- ## Getting Help - 💬 [GitHub Discussions](https://github.com/Nagi-ovo/gemini-voyager/discussions) - Ask questions - 🐛 [Issues](https://github.com/Nagi-ovo/gemini-voyager/issues) - Report bugs - 📖 [Documentation](https://gemini-voyager.vercel.app/) - Read the docs --- ## License By contributing, you agree that your contributions will be licensed under the [GPLv3 License](../LICENSE). ================================================ FILE: .github/CONTRIBUTING_ES.md ================================================ # Guía de Contribución > [!CAUTION] > **Este proyecto actualmente NO acepta PRs para nuevas funcionalidades.** Si tienes una funcionalidad que realmente te gustaría desarrollar, sigue este proceso: > > 1. **Abre un Issue primero** para discutir tu idea y enfoque con el mantenedor > 2. **Espera la aprobación y un plan de implementación sólido** antes de escribir código o enviar un PR > > Los PRs de nuevas funcionalidades enviados sin discusión previa serán cerrados sin revisión. Gracias por tu comprensión. > [!IMPORTANT] > **Estado del proyecto: Mantenimiento bajo.** Espere retrasos en las respuestas. Se priorizan los PR con pruebas. ¡Gracias por considerar contribuir a Voyager! 🚀 Este documento proporciona pautas e instrucciones para contribuir. Damos la bienvenida a correcciones de errores, mejoras en la documentación y traducciones. Para nuevas funcionalidades, por favor discútelo primero mediante un Issue. ## 🚫 Política de IA **Rechazamos explícitamente los PR generados por IA que no hayan sido verificados manualmente.** Aunque las herramientas de IA son grandes asistentes, las contribuciones de "copiar y pegar" sin revisión hacen perder tiempo a los mantenedores. - **Los PR de IA de baja calidad** se cerrarán inmediatamente sin discusión. - **Los PR sin explicación** de la lógica o que carezcan de las pruebas necesarias serán rechazados. - Debes entender y asumir la responsabilidad de cada línea de código que envíes. ## Tabla de Contenidos - [Comenzando](#comenzando) - [Reclamar un Problema](#reclamar-un-problema) - [Configuración de Desarrollo](#configuración-de-desarrollo) - [Realizando Cambios](#realizando-cambios) - [Enviar un Pull Request](#enviar-un-pull-request) - [Estilo de Código](#estilo-de-código) - [Agregar Soporte para Gem](#agregar-soporte-para-gem) - [Licencia](#licencia) --- ## Comenzando ### Requisitos Previos - **Bun** 1.0+ (Requerido) - Un navegador basado en Chromium para pruebas (Chrome, Edge, Brave, etc.) ### Inicio Rápido ```bash # Clonar el repositorio git clone https://github.com/Nagi-ovo/gemini-voyager.git cd gemini-voyager # Instalar dependencias bun install # Iniciar modo de desarrollo bun run dev ``` --- ## Reclamar un Problema Para evitar trabajo duplicado y coordinar contribuciones: ### 1. Verificar Trabajo Existente Antes de comenzar, verifica si el problema ya está asignado a alguien mirando la sección **Assignees**. ### 2. Reclamar un Problema Comenta `/claim` en cualquier problema no asignado para asignártelo automáticamente. Un bot confirmará la asignación. ### 3. Liberar si es Necesario Si ya no puedes trabajar en un problema, comenta `/unclaim` para liberarlo para otros. ### 4. Casilla de Verificación de Contribución Al crear problemas, puedes marcar la casilla "I am willing to contribute code" para indicar tu interés en implementar la funcionalidad o corrección. --- ## Configuración de Desarrollo ### Instalar Dependencias ```bash bun install ``` ### Comandos Disponibles | Comando | Descripción | | --------------------- | ----------------------------------------------------- | | `bun run dev` | Iniciar modo desarrollo Chrome con recarga automática | | `bun run dev:firefox` | Iniciar modo desarrollo Firefox | | `bun run dev:safari` | Iniciar modo desarrollo Safari (solo macOS) | | `bun run build` | Compilación de producción para Chrome | | `bun run build:all` | Compilación de producción para todos los navegadores | | `bun run lint` | Ejecutar ESLint con corrección automática | | `bun run typecheck` | Ejecutar comprobación de tipos TypeScript | | `bun run test` | Ejecutar conjunto de pruebas | ### Cargar la Extensión 1. Ejecuta `bun run dev` para iniciar la compilación de desarrollo 2. Abre Chrome y ve a `chrome://extensions/` 3. Habilita el "Modo de desarrollador" 4. Haz clic en "Cargar descomprimida" y selecciona la carpeta `dist_chrome` --- ## Realizando Cambios ### Antes de Empezar 1. **Crea una rama** desde `main`: ```bash git checkout -b feature/nombre-de-tu-funcionalidad # o git checkout -b fix/tu-correccion-de-error ``` 2. **Vincular Issues** - Al implementar una nueva funcionalidad, **primero debes abrir un Issue de discusión**. Los PR de nuevas funcionalidades enviados sin discusión previa serán cerrados. Al enviar un PR, por favor enlaza ese Issue. 3. **Mantén los cambios enfocados** - una funcionalidad o corrección por PR ### Lista de Verificación Pre-Commit Antes de enviar, ejecuta siempre: ```bash bun run lint # Corregir problemas de linting bun run format # Formatear código bun run typecheck # Comprobar tipos bun run build # Verificar que la compilación tiene éxito bun run test # Ejecutar pruebas ``` Asegúrate de que: 1. Tus cambios logran la funcionalidad deseada. 2. Tus cambios no afectan negativamente a las funciones existentes. --- ## Estrategia de Pruebas Seguimos una estrategia de pruebas basada en el ROI: **Prueba la lógica, no el DOM.** 1. **Imprescindible (Lógica)**: Servicios principales (Almacenamiento, Copia de seguridad), analizadores de datos y utilidades. Aquí se requiere TDD. 2. **Recomendable (Estado)**: Estado de UI complejo (ej: Reducer de carpetas). 3. **Omitir (Frágil)**: Manipulación directa del DOM (Content Scripts) y componentes de UI puros. Usa programación defensiva en su lugar. --- ## Enviar un Pull Request ### Pautas de PR 1. **Título**: Usa un título claro y descriptivo (ej: "feat: add dark mode toggle" o "fix: timeline scroll sync") 2. **Descripción**: Explica qué cambios hiciste y por qué 3. **Impacto en el Usuario**: Describe cómo se verán afectados los usuarios 4. **Prueba Visual (Estricto)**: Para CUALQUIER cambio de UI o nueva funcionalidad, **DEBES** proporcionar capturas de pantalla o grabaciones. **Sin captura = Sin revisión/respuesta.** 5. **Referencia de Problema**: Enlaza problemas relacionados (ej: "Closes #123") ### Formato de Mensaje de Commit Sigue [Conventional Commits](https://www.conventionalcommits.org/): - `feat:` - Nuevas funcionalidades - `fix:` - Corrección de errores - `docs:` - Cambios en documentación - `chore:` - Tareas de mantenimiento - `refactor:` - Refactorización de código - `test:` - Agregar o actualizar pruebas --- ## Estilo de Código ### Pautas Generales - **Prefiere retornos tempranos** sobre condicionales anidados - **Usa nombres descriptivos** - evita abreviaciones - **Evita números mágicos** - usa constantes con nombre - **Sigue el estilo existente** - consistencia sobre preferencia ### Convenciones TypeScript - **PascalCase**: Clases, interfaces, tipos, enums, componentes React - **camelCase**: Funciones, variables, métodos - **UPPER_SNAKE_CASE**: Constantes ### Orden de Importación 1. React e importaciones relacionadas 2. Bibliotecas de terceros 3. Importaciones absolutas internas (`@/...`) 4. Importaciones relativas (`./...`) 5. Importaciones solo de tipo ```typescript import React, { useState } from 'react'; import { marked } from 'marked'; import { Button } from '@/components/ui/Button'; import { StorageService } from '@/core/services/StorageService'; import type { FolderData } from '@/core/types/folder'; import { parseData } from './parser'; ``` --- ## Agregar Soporte para Gem Para agregar soporte para un nuevo Gem (Gems oficiales de Google o Gems personalizados): 1. Abre `src/pages/content/folder/gemConfig.ts` 2. Agrega una nueva entrada al array `GEM_CONFIG`: ```typescript { id: 'your-gem-id', // De la URL: /gem/your-gem-id/... name: 'Your Gem Name', // Nombre para mostrar icon: 'material_icon_name', // Icono de Google Material Symbols } ``` ### Encontrar el ID del Gem - Abre una conversación con el Gem - Verifica la URL: `https://gemini.google.com/app/gem/[GEM_ID]/...` - Usa la parte `[GEM_ID]` en tu configuración ### Elegir un Icono Usa nombres de iconos válidos de [Google Material Symbols](https://fonts.google.com/icons): | Icono | Caso de Uso | | -------------- | ---------------------- | | `auto_stories` | Aprendizaje, Educación | | `lightbulb` | Ideas, Lluvia de ideas | | `work` | Carrera, Profesional | | `code` | Programación, Técnica | | `analytics` | Datos, Análisis | --- ## Alcance del Proyecto Voyager mejora la experiencia de chat de Gemini AI con: - Navegación por línea de tiempo - Organización de carpetas - Bóveda de prompts - Exportación de chat - Personalización de UI **Fuera de alcance**: Scraping de sitios, intercepción de red, automatización de cuentas. --- ## Obtener Ayuda - 💬 [GitHub Discussions](https://github.com/Nagi-ovo/gemini-voyager/discussions) - Haz preguntas - 🐛 [Issues](https://github.com/Nagi-ovo/gemini-voyager/issues) - Reporta errores - 📖 [Documentación](https://gemini-voyager.vercel.app/) - Lee la documentación --- ## Licencia Al contribuir, aceptas que tus contribuciones se licenciarán bajo la [Licencia GPLv3](../LICENSE). ================================================ FILE: .github/CONTRIBUTING_FR.md ================================================ # Guide de Contribution > [!CAUTION] > **Ce projet n'accepte actuellement PAS les PRs pour de nouvelles fonctionnalités.** Si vous souhaitez vraiment développer une fonctionnalité, veuillez suivre ce processus : > > 1. **Ouvrez d'abord un Issue** pour discuter de votre idée et de votre approche avec le mainteneur > 2. **Attendez l'approbation et un plan d'implémentation solide** avant d'écrire du code ou de soumettre une PR > > Les PRs de nouvelles fonctionnalités soumises sans discussion préalable seront fermées sans examen. Merci de votre compréhension. > [!IMPORTANT] > **Statut du projet : Maintenance réduite.** Attendez-vous à des délais de réponse. Les PR avec tests sont prioritaires. Merci d'envisager de contribuer à Voyager ! 🚀 Ce document fournit des directives et des instructions pour contribuer. Nous accueillons les corrections de bugs, les améliorations de la documentation et les traductions. Pour les nouvelles fonctionnalités, veuillez d'abord en discuter via un Issue. ## 🚫 Politique IA **Nous rejetons explicitement les PR générées par l'IA qui n'ont pas été vérifiées manuellement.** Bien que les outils d'IA soient d'excellents assistants, les contributions "paresseuses" de copier-coller font perdre du temps aux mainteneurs. - **Les PR d'IA de mauvaise qualité** seront fermées immédiatement sans discussion. - **Les PR sans explication** de la logique ou manquant de tests nécessaires seront rejetées. - Vous devez comprendre et assumer la responsabilité de chaque ligne de code que vous soumettez. ## Table des Matières - [Commencer](#commencer) - [Réclamer un Ticket](#réclamer-un-ticket) - [Configuration de Développement](#configuration-de-développement) - [Apporter des Modifications](#apporter-des-modifications) - [Soumettre une Pull Request](#soumettre-une-pull-request) - [Style de Code](#style-de-code) - [Ajouter le Support d'un Gem](#ajouter-le-support-dun-gem) - [Licence](#licence) --- ## Commencer ### Prérequis - **Bun** 1.0+ (Requis) - Un navigateur basé sur Chromium pour les tests (Chrome, Edge, Brave, etc.) ### Démarrage Rapide ```bash # Cloner le dépôt git clone https://github.com/Nagi-ovo/gemini-voyager.git cd gemini-voyager # Installer les dépendances bun install # Démarrer le mode développement bun run dev ``` --- ## Réclamer un Ticket Pour éviter le travail en double et coordonner les contributions : ### 1. Vérifier le Travail Existant Avant de commencer, vérifiez si le ticket est déjà assigné à quelqu'un en regardant la section **Assignees**. ### 2. Réclamer un Ticket Commentez `/claim` sur n'importe quel ticket non assigné pour vous l'assigner automatiquement. Un bot confirmera l'assignation. ### 3. Libérer si Nécessaire Si vous ne pouvez plus travailler sur un ticket, commentez `/unclaim` pour le libérer pour d'autres. ### 4. Case à Cocher de Contribution Lors de la création de tickets, vous pouvez cocher la case "I am willing to contribute code" pour indiquer votre intérêt à implémenter la fonctionnalité ou le correctif. --- ## Configuration de Développement ### Installer les Dépendances ```bash bun install ``` ### Commandes Disponibles | Commande | Description | | --------------------- | ----------------------------------------------------- | | `bun run dev` | Démarrer le mode dev Chrome avec rechargement à chaud | | `bun run dev:firefox` | Démarrer le mode dev Firefox | | `bun run dev:safari` | Démarrer le mode dev Safari (macOS uniquement) | | `bun run build` | Build de production pour Chrome | | `bun run build:all` | Build de production pour tous les navigateurs | | `bun run lint` | Exécuter ESLint avec correction automatique | | `bun run typecheck` | Exécuter la vérification de type TypeScript | | `bun run test` | Exécuter la suite de tests | ### Charger l'Extension 1. Exécutez `bun run dev` pour démarrer le build de développement 2. Ouvrez Chrome et allez sur `chrome://extensions/` 3. Activez le "Mode développeur" 4. Cliquez sur "Charger l'extension non empaquetée" et sélectionnez le dossier `dist_chrome` --- ## Apporter des Modifications ### Avant de Commencer 1. **Créez une branche** depuis `main` : ```bash git checkout -b feature/nom-de-votre-fonctionnalite # ou git checkout -b fix/votre-correction-de-bug ``` 2. **Lier les Issues** - Lors de l'implémentation d'une nouvelle fonctionnalité, vous devez **d'abord ouvrir un Issue pour discussion**. Les PR pour de nouvelles fonctionnalités soumises sans discussion préalable seront fermées. Lors de la soumission d'une PR, veuillez lier cet Issue. 3. **Gardez les modifications ciblées** - une fonctionnalité ou correction par PR ### Liste de Contrôle Pré-Commit Avant de soumettre, exécutez toujours : ```bash bun run lint # Corriger les problèmes de linting bun run format # Formater le code bun run typecheck # Vérifier les types bun run build # Vérifier que le build réussit bun run test # Exécuter les tests ``` Assurez-vous que : 1. Vos modifications réalisent la fonctionnalité souhaitée. 2. Vos modifications n'affectent pas négativement les fonctionnalités existantes. --- ## Stratégie de Test Nous suivons une stratégie de test basée sur le ROI : **Testez la logique, pas le DOM.** 1. **Indispensable (Logique)** : Services principaux (Stockage, Sauvegarde), analyseurs de données et utilitaires. Le TDD est requis ici. 2. **Recommandé (État)** : État d'interface utilisateur complexe (ex: Reducer de dossiers). 3. **Ignorer (Fragile)** : Manipulation directe du DOM (Scripts de contenu) et composants d'interface utilisateur purs. Utilisez plutôt la programmation défensive. --- ## Soumettre une Pull Request ### Directives de PR 1. **Titre** : Utilisez un titre clair et descriptif (ex: "feat: add dark mode toggle" ou "fix: timeline scroll sync") 2. **Description** : Expliquez quels changements vous avez effectués et pourquoi 3. **Impact Utilisateur** : Décrivez comment les utilisateurs seront affectés 4. **Preuve Visuelle (Strict)** : Pour TOUT changement d'interface ou nouvelle fonctionnalité, vous **DEVEZ** fournir des captures d'écran ou des enregistrements. **Pas de capture = Pas de revue/réponse.** 5. **Référence de Ticket** : Liez les tickets associés (ex: "Closes #123") ### Format du Message de Commit Suivez [Conventional Commits](https://www.conventionalcommits.org/) : - `feat:` - Nouvelles fonctionnalités - `fix:` - Corrections de bugs - `docs:` - Changements de documentation - `chore:` - Tâches de maintenance - `refactor:` - Refactorisation de code - `test:` - Ajout ou mise à jour de tests --- ## Style de Code ### Directives Générales - **Préférez les retours anticipés** aux conditionnelles imbriquées - **Utilisez des noms descriptifs** - évitez les abréviations - **Évitez les nombres magiques** - utilisez des constantes nommées - **Respectez le style existant** - la cohérence prime sur la préférence ### Conventions TypeScript - **PascalCase** : Classes, interfaces, types, énumérations, composants React - **camelCase** : Fonctions, variables, méthodes - **UPPER_SNAKE_CASE** : Constantes ### Ordre d'Importation 1. React et imports liés 2. Bibliothèques tierces 3. Imports absolus internes (`@/...`) 4. Imports relatifs (`./...`) 5. Imports de type uniquement ```typescript import React, { useState } from 'react'; import { marked } from 'marked'; import { Button } from '@/components/ui/Button'; import { StorageService } from '@/core/services/StorageService'; import type { FolderData } from '@/core/types/folder'; import { parseData } from './parser'; ``` --- ## Ajouter le Support d'un Gem Pour ajouter le support d'un nouveau Gem (Gems officiels Google ou Gems personnalisés) : 1. Ouvrez `src/pages/content/folder/gemConfig.ts` 2. Ajoutez une nouvelle entrée au tableau `GEM_CONFIG` : ```typescript { id: 'votre-id-gem', // Depuis l'URL : /gem/votre-id-gem/... name: 'Nom de Votre Gem', // Nom d'affichage icon: 'material_icon_name', // Nom de l'icône Google Material Symbols } ``` ### Trouver l'ID du Gem - Ouvrez une conversation avec le Gem - Vérifiez l'URL : `https://gemini.google.com/app/gem/[GEM_ID]/...` - Utilisez la partie `[GEM_ID]` dans votre configuration ### Choisir une Icône Utilisez des noms d'icônes valides de [Google Material Symbols](https://fonts.google.com/icons) : | Icône | Cas d'Utilisation | | -------------- | ------------------------ | | `auto_stories` | Apprentissage, Éducation | | `lightbulb` | Idées, Brainstorming | | `work` | Carrière, Professionnel | | `code` | Programmation, Technique | | `analytics` | Données, Analyse | --- ## Portée du Projet Voyager améliore l'expérience de chat Gemini AI avec : - Navigation par chronologie - Organisation par dossiers - Coffre-fort de prompts - Exportation de chat - Personnalisation de l'interface utilisateur **Hors de portée** : Scraping de site, interception réseau, automatisation de compte. --- ## Obtenir de l'Aide - 💬 [GitHub Discussions](https://github.com/Nagi-ovo/gemini-voyager/discussions) - Poser des questions - 🐛 [Issues](https://github.com/Nagi-ovo/gemini-voyager/issues) - Signaler des bugs - 📖 [Documentation](https://gemini-voyager.vercel.app/) - Lire la documentation --- ## Licence En contribuant, vous acceptez que vos contributions soient licenciées sous la [Licence GPLv3](../LICENSE). ================================================ FILE: .github/CONTRIBUTING_JA.md ================================================ # 貢献ガイド > [!CAUTION] > **本プロジェクトは現在、新機能の PR を受け付けていません。** どうしても実装したい機能がある場合は、以下のプロセスに従ってください: > > 1. **まず Issue を作成して**、メンテナーとアイデアやアプローチについて議論してください > 2. **承認と確実な実装計画が決まってから**、コードを書いて PR を提出してください > > 事前の議論なしに提出された新機能の PR は、レビューなしにクローズされます。ご理解のほどよろしくお願いいたします。 > [!IMPORTANT] > **プロジェクトの状態: 低頻度メンテナンス。** 返信が遅れる可能性があります。テスト付きのPRが優先されます。 Voyager への貢献をご検討いただきありがとうございます!🚀 このドキュメントでは、貢献のためのガイドラインと手順を説明します。バグ修正、ドキュメントの改善、翻訳などの貢献を歓迎します。新機能については、まず Issue で議論してください。 ## 🚫 AI ポリシー **手動で検証されていない AI 生成の PR は明示的に拒否します。** AI ツールは優れたアシスタントですが、「怠惰な」コピー&ペーストの貢献はメンテナの時間を浪費します。 - **低品質な AI PR** は、議論なしに即座にクローズされます。 - ロジックの**説明がない PR** や、必要なテストが不足している PR は拒否されます。 - あなたは提出するすべてのコード行を理解し、責任を負う必要があります。 ## 目次 - [はじめに](#はじめに) - [Issue の担当](#issue-の担当) - [開発環境のセットアップ](#開発環境のセットアップ) - [変更の実施](#変更の実施) - [Pull Request の送信](#pull-request-の送信) - [コードスタイル](#コードスタイル) - [Gem サポートの追加](#gem-サポートの追加) - [ライセンス](#ライセンス) --- ## はじめに ### 前提条件 - **Bun** 1.0+(必須) - テスト用の Chromium ベースのブラウザ(Chrome, Edge, Brave など) ### クイックスタート ```bash # リポジトリをクローン git clone https://github.com/Nagi-ovo/gemini-voyager.git cd gemini-voyager # 依存関係をインストール bun install # 開発モードを開始 bun run dev ``` --- ## Issue の担当 重複作業を避け、貢献を調整するために: ### 1. 既存の作業を確認 開始する前に、Issue の **Assignees** セクションを見て、すでに誰かが担当していないか確認してください。 ### 2. Issue を担当する 未割り当ての Issue に `/claim` とコメントすると、自動的にあなた自身が担当者に割り当てられます。ボットが割り当てを確認します。 ### 3. 必要に応じて担当を解除 Issue に取り組めなくなった場合は、`/unclaim` とコメントして、他の人のために解放してください。 ### 4. 貢献のチェックボックス Issue を作成する際、「I am willing to contribute code」チェックボックスをオンにして、機能の実装や修正に興味があることを示すことができます。 --- ## 開発環境のセットアップ ### 依存関係のインストール ```bash bun install ``` ### 利用可能なコマンド | コマンド | 説明 | | --------------------- | ----------------------------------------- | | `bun run dev` | Chrome 開発モードを開始(ホットリロード) | | `bun run dev:firefox` | Firefox 開発モードを開始 | | `bun run dev:safari` | Safari 開発モードを開始(macOS のみ) | | `bun run build` | Chrome 用のプロダクションビルド | | `bun run build:all` | 全ブラウザ用のプロダクションビルド | | `bun run lint` | ESLint を実行して自動修正 | | `bun run typecheck` | TypeScript の型チェックを実行 | | `bun run test` | テストスイートを実行 | ### 拡張機能の読み込み 1. `bun run dev` を実行して開発ビルドを開始します 2. Chrome を開き、`chrome://extensions/` に移動します 3. 「デベロッパー モード」を有効にします 4. 「パッケージ化されていない拡張機能を読み込む」をクリックし、`dist_chrome` フォルダを選択します --- ## 変更の実施 ### 作業を始める前に 1. `main` から**ブランチを作成**します: ```bash git checkout -b feature/your-feature-name # または git checkout -b fix/your-bug-fix ``` 2. **Issue をリンクする** - 新機能の実装については、**まず議論のために Issue を提出する必要があります**。事前の議論なしに提出された新機能の PR はクローズされます。PR を送信する際は、その Issue をリンクしてください。 3. **変更を集中させる** - PR ごとに1つの機能または修正 ### コミット前チェックリスト 送信する前に、必ず以下を実行してください: ```bash bun run lint # リンティングの問題を修正 bun run format # コードの整形 bun run typecheck # 型をチェック bun run build # ビルドが成功することを確認 bun run test # テストを実行 ``` 以下を確認してください: 1. 変更内容が期待通りに機能すること。 2. 既存の機能に影響を与えていないこと。 --- ## テスト戦略 私たちは「ROI に基づく」テスト戦略に従います:**DOM ではなくロジックをテストしてください。** 1. **必須 (Logic)**: コアサービス (ストレージ、バックアップ)、データパーサー、ユーティリティ。ここでは TDD が必須です。 2. **推奨 (State)**: 複雑な UI 状態 (例: フォルダ Reducer)。 3. **スキップ (Fragile)**: 直接的な DOM 操作 (Content Scripts) や純粋な UI コンポーネント。代わりに防御的プログラミングを使用してください。 --- ## Pull Request の送信 ### PR ガイドライン 1. **タイトル**: 明確で説明的なタイトルを使用してください(例:"feat: add dark mode toggle" または "fix: timeline scroll sync") 2. **説明**: どのような変更を行ったか、およびその理由を説明してください 3. **ユーザーへの影響**: ユーザーにどのような影響があるかを説明してください 4. **視覚的証拠 (厳格)**: UI の変更や新機能については、**必ず**スクリーンショットまたは画面録画を提供してください。**スクリーンショットなし = レビュー/返信しません。** 5. **Issue の参照**: 関連する Issue をリンクしてください(例:"Closes #123") ### コミットメッセージの形式 [Conventional Commits](https://www.conventionalcommits.org/) に従ってください: - `feat:` - 新機能 - `fix:` - バグ修正 - `docs:` - ドキュメントの変更 - `chore:` - メンテナンス作業 - `refactor:` - コードのリファクタリング - `test:` - テストの追加または更新 --- ## コードスタイル ### 一般的なガイドライン - ネストされた条件分岐よりも**早期リターンを優先** - **説明的な名前を使用** - 略語は避ける - **マジックナンバーを避ける** - 名前付き定数を使用 - **既存のスタイルに合わせる** - 好みよりも一貫性 ### TypeScript の規約 - **PascalCase**: クラス、インターフェース、型、Enum、React コンポーネント - **camelCase**: 関数、変数、メソッド - **UPPER_SNAKE_CASE**: 定数 ### インポートの順序 1. React および関連するインポート 2. サードパーティライブラリ 3. 内部の絶対インポート(`@/...`) 4. 相対インポート(`./...`) 5. 型のみのインポート ```typescript import React, { useState } from 'react'; import { marked } from 'marked'; import { Button } from '@/components/ui/Button'; import { StorageService } from '@/core/services/StorageService'; import type { FolderData } from '@/core/types/folder'; import { parseData } from './parser'; ``` --- ## Gem サポートの追加 新しい Gem(公式 Google Gems またはカスタム Gems)のサポートを追加するには: 1. `src/pages/content/folder/gemConfig.ts` を開きます 2. `GEM_CONFIG` 配列に新しいエントリを追加します: ```typescript { id: 'your-gem-id', // URL から取得: /gem/your-gem-id/... name: 'Your Gem Name', // 表示名 icon: 'material_icon_name', // Google Material Symbols アイコン } ``` ### Gem ID の見つけ方 - Gem との会話を開きます - URL を確認します: `https://gemini.google.com/app/gem/[GEM_ID]/...` - 設定で `[GEM_ID]` の部分を使用します ### アイコンの選択 有効な [Google Material Symbols](https://fonts.google.com/icons) アイコン名を使用してください: | アイコン | 使用例 | | -------------- | -------------------- | | `auto_stories` | 学習、教育 | | `lightbulb` | アイデア、ブレスト | | `work` | キャリア、専門職 | | `code` | プログラミング、技術 | | `analytics` | データ、分析 | --- ## プロジェクトの範囲 Voyager は、以下の機能で Gemini AI チャット体験を向上させます: - タイムラインナビゲーション - フォルダ整理 - プロンプトヴォルト - チャットのエクスポート - UI カスタマイズ **範囲外**: サイトのスクレイピング、ネットワーク傍受、アカウントの自動化。 --- ## ヘルプを得る - 💬 [GitHub Discussions](https://github.com/Nagi-ovo/gemini-voyager/discussions) - 質問する - 🐛 [Issues](https://github.com/Nagi-ovo/gemini-voyager/issues) - バグを報告する - 📖 [ドキュメント](https://gemini-voyager.vercel.app/) - ドキュメントを読む --- ## ライセンス 貢献することにより、あなたの貢献が [GPLv3 ライセンス](../LICENSE) の下でライセンスされることに同意したものとみなされます。 ================================================ FILE: .github/FUNDING.yml ================================================ github: Nagi-ovo buy_me_a_coffee: Nag1ovo custom: ['https://afdian.com/a/nagi-ovo'] ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.yml ================================================ name: '🐛 反馈缺陷 Bug Report' description: '反馈一个问题缺陷 | Report a bug' title: '[Bug] ' labels: '🐛 Bug' body: - type: markdown attributes: value: | ### ⚠️ 项目维护状态 | Maintenance Status **本项目目前处于低频维护模式。 | This project is currently in Low Maintenance mode.** - 我们将优先处理带有测试代码的 Pull Request,而非 Issue。 | We prioritize Pull Requests with tests over Issues. - 对于未提供清晰复现步骤或环境信息的非核心 Bug,可能会被直接关闭。 | Non-critical bugs without minimal reproduction steps may be closed directly. - 维护者精力有限,回复可能会有显著延迟,请谅解。 | Please be patient as response times will be significantly delayed. - type: checkboxes id: checklist attributes: label: '⚠️ 前置检查 | Essential Checklist' description: '请确认您已完成以下操作 | Please confirm you have done the following' options: - label: '我已在 Issue 中搜索过类似问题,确认这不是一个重复的问题 / I have searched existing issues' required: true - label: '我理解如果未提供清晰的复现步骤或环境信息,Issue 可能会被关闭 / I understand my issue may be closed if repro steps are missing' required: true - label: '我确认使用的是插件的最新版本 / I am using the latest version of the extension' required: true - type: dropdown attributes: label: '💻 系统环境 | Operating System' options: - Windows - macOS - Ubuntu - Other Linux - Other validations: required: true - type: dropdown attributes: label: '🌐 浏览器 | Browser' description: 'Which browser are you using?' options: - Chrome - Edge - Safari - Firefox - Other validations: required: true - type: input attributes: label: '📦 扩展版本 | Extension Version' description: 'Which version of Gemini Voyager are you using? (e.g., 1.1.3)' placeholder: '1.1.3' validations: required: true - type: textarea attributes: label: '🐛 问题描述 | Bug Description' description: 'A clear and concise description of the bug.' placeholder: 'Describe what happened...' validations: required: true - type: textarea attributes: label: '🚦 期望结果 | Expected Behavior' description: 'A clear and concise description of what you expected to happen.' placeholder: 'Describe what you expected...' - type: textarea attributes: label: '📷 复现步骤 | Recurrence Steps' description: 'Steps to reproduce the behavior.' placeholder: | 1. Go to '...' 2. Click on '...' 3. See error - type: textarea attributes: label: '📸 截图 | Screenshots' description: 'REQUIRED for UI issues. If we cannot see it, we will not fix it. / UI 问题必填。如果看不到问题,我们将不会修复。' placeholder: 'Drag and drop images here or paste image URLs' - type: textarea attributes: label: '📝 补充信息 | Additional Information' description: 'If your problem needs further explanation, please add more information here.' placeholder: 'Any additional context, error messages, or console logs...' - type: checkboxes attributes: label: '💻 贡献意愿 | Contribution' options: - label: '我愿意为该问题贡献修复代码 / I am willing to contribute a fix for this bug' - label: '💡 其他贡献者可评论 `/claim` 认领此 Issue / Other contributors can comment `/claim` to claim' ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false contact_links: - name: '💬 讨论区 Discussions' url: https://github.com/Nagi-ovo/gemini-voyager/discussions about: '讨论想法或提问,而非提交 Bug 或 Feature | For general discussions, questions, and ideas' ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.yml ================================================ name: '🌠 功能需求 Feature Request' description: '需求或建议 | Suggest an idea for Gemini Voyager' title: '[Feature] ' labels: '🌠 Feature Request' body: - type: markdown attributes: value: | ### ⚠️ 项目维护状态 | Maintenance Status **本项目目前处于低频维护模式。 | This project is currently in Low Maintenance mode.** - 无法保证能够投入精力,及时实现新的功能需求。 | The maintainer cannot guarantee they will be able to dedicate time to implement new features in a timely manner. - 我们非常**欢迎并鼓励社区贡献**! | However, we **welcome and encourage community contributions**! - 如果您希望该功能被实现,提交高质量的 Pull Request 是最佳途径。但在提交 PR 前,**请务必先在此 Issue 中进行讨论**。未经讨论直接提交的新功能 PR 将被关闭。 | The best way to see this feature realized is to submit a Pull Request. However, before submitting a PR, **you MUST first discuss it in this Issue**. PRs for new features submitted without prior discussion will be closed. - type: textarea attributes: label: '🥰 需求描述 | Feature Description' description: 'Please add a clear and concise description of the problem you are seeking to solve with this feature request.' placeholder: "Is your feature request related to a problem? Please describe.\nExample: I'm always frustrated when..." validations: required: true - type: textarea attributes: label: '🧐 解决方案 | Proposed Solution' description: "Describe the solution you'd like in a clear and concise manner." placeholder: 'Describe what you want to happen...' validations: required: true - type: textarea attributes: label: '🔄 替代方案 | Alternatives Considered' description: 'Describe any alternative solutions or features you have considered.' placeholder: 'Describe alternative solutions...' - type: textarea attributes: label: '📝 补充信息 | Additional Information' description: 'REQUIRED for UI features: Please provide mockups or screenshots. / UI 功能必填:请提供设计图或截图。' placeholder: 'No screenshot = No reply (for UI features).' - type: checkboxes attributes: label: '💻 贡献意愿 | Contribution' options: - label: '我愿意为该功能贡献代码 / I am willing to contribute code for this feature' - label: '💡 其他贡献者可评论 `/claim` 认领此 Issue / Other contributors can comment `/claim` to claim' ================================================ FILE: .github/README_AR.md ================================================
promotion

اجعل تجربتك مع Gemini™ ملكك حقاً ✨

تصفح المحادثات بجدول زمني أنيق، ونظم الدردشات في مجلدات، وقم ببناء مستودع المطالبات الخاص بك.
إنه الترقية المفقودة لـ Google Gemini.

Chrome Edge Firefox Safari Opera Brave

GitHub stars GitHub forks Latest version GitHub downloads Chrome Web Store users Chrome Web Store rating Firefox Add-ons users Firefox Add-ons rating

Nagi-ovo%2Fgemini-voyager | Trendshift Gemini Voyager - All-in-one Gemini suite: folders, chat export and much more | Product Hunt

✨ نحن متواجدون الآن على Product Hunt! يسعدنا سماع آرائكم. ❤️

📖 التوثيقEnglish简体中文繁體中文日本語FrançaisEspañolPortuguêsРусский한국어

KOL Recommendation
🎉 نوصي به بشدة من قبل كبار المؤثرين في مجال التكنولوجيا والمجتمع!

> [!IMPORTANT] > **إشعار تغيير الاسم**: بسبب مخاوف تتعلق بالعلامات التجارية وحقوق النشر، تم تغيير اسم هذا الامتداد رسمياً إلى **Voyager**. ومع ذلك، بسبب بطء شديد في عملية مراجعة Chrome Web Store، لم يتم الموافقة على تغيير الاسم خلال 7 أيام — وهو غير متاح مؤقتاً على Chrome Web Store. > [!NOTE] > إذا كان Voyager مفيداً لك، فشاركْه على X أو Reddit أو YouTube إلخ. كل مشاركة تساعد المزيد من الناس على اكتشاف المشروع وتحسين تجربة Gemini. شكراً. --- ## 👋 لماذا Voyager؟ نحن نحب Gemini، لكننا تمنينا أحياناً لو كان لديه المزيد من "التنظيم". لهذا السبب قمنا ببناء **Voyager**. إنه ليس مجرد أداة؛ إنه رفيق يساعدك في الحفاظ على تنظيم محادثاتك مع الذكاء الاصطناعي وجعلها سهلة الوصول ومنتجة. سواء كنت باحثاً تدير عشرات الخيوط، أو مطوراً يحفظ مقتطفات برمجية، أو مجرد شخص يحب النظام، فإن Voyager مصمم لك.

Try Voyager
خلال المشكلة التي حدثت في 18 فبراير حيث تسبب تطبيق Google Gemini في جعل المحادثات التاريخية لبعض المستخدمين غير قابلة للوصول، تمكن مستخدمو Voyager من الاستمرار في رؤية محادثاتهم المحفوظة في مجلداتهم.

--- ## ✨ الميزات ### 🌌 الميزات الأساسية (Gemini & AI Studio) - **📂 [تنظيم المجلدات](https://voyager.nagi.fun/ar/guide/folders)**: نظم دردشاتك في تسلسل هرمي للمجلدات مع دعم **السحب والإفلات** و **مزامنة Google Drive**. - **Gemini**: يدعم **وضع عزل الحساب** و **ألوان المجلدات المخصصة**. - **💡 [مستودع المطالبات](https://voyager.nagi.fun/ar/guide/prompts)**: احفظ وأعد استخدام أفضل مطالباتك في Gemini و AI Studio و[المواقع المخصصة](https://voyager.nagi.fun/ar/guide/custom-websites). - **☁️ [المزامنة السحابية](https://voyager.nagi.fun/ar/guide/cloud-sync)**: قم بمزامنة المجلدات ومستودع المطالبات مع Google Drive. - **📐 نسخ الصيغ**: نسخ بنقرة واحدة لأكواد المصدر LaTeX و MathML (Word). - **🌦️ التأثيرات البصرية**: أضف أجواء موسمية مع **الثلج** أو **المطر السينمائي** أو **بتلات الساكورا المتساقطة** من لوحة الإعدادات. ### ✨ ميزات Gemini الحصرية - **📍 [تصفح الجدول الزمني](https://voyager.nagi.fun/ar/guide/timeline)**: عقد بصرية للتنقل بين الرسائل، وتمييز اللحظات الرئيسية، وإدارة فروع المحادثة. - **💾 [تصدير الدردشة](https://voyager.nagi.fun/ar/guide/export)**: صَدّر المحادثات إلى تنسيقات JSON أو Markdown أو PDF مع تضمين الصور. - **🧜‍♀️ [رسم Mermaid](https://voyager.nagi.fun/ar/guide/mermaid)**: عرض تلقائي للمخططات الانسيابية ومخططات التتابع وغيرها من رسوم Mermaid. - **📝 [إصلاح عرض Markdown](https://voyager.nagi.fun/ar/guide/markdown-fix)**: إصلاح تلقائي لتنسيق Markdown العريض الذي تعطل بسبب عناصر HTML التي أدرجها Gemini. - **🍌 [NanoBanana](https://voyager.nagi.fun/ar/guide/nanobanana)**: إزالة العلامة المائية بدون فقدان الجودة للصور التي ينتجها Gemini. - **🔬 [البحث العميق](https://voyager.nagi.fun/ar/guide/deep-research)**: استخرج عمليات التفكير وروابط البحث من جلسات البحث العميق. - **🛠️ أدوات القوة**: - **[الحذف الجماعي](https://voyager.nagi.fun/ar/guide/batch-delete)**: تنظيف السجل الخاص بك دفعة واحدة. - **[الرد مع اقتباس](https://voyager.nagi.fun/ar/guide/quote-reply)**: الرد مع السياق عن طريق تحديد النص. - **[مزامنة عنوان علامة التبويب](https://voyager.nagi.fun/ar/guide/tab-title)**: مزامنة عنوان علامة تبويب المتصفح تلقائياً مع عنوان الدردشة. - **[منع التمرير التلقائي](https://voyager.nagi.fun/ar/guide/prevent-auto-scroll)**: يمنع الصفحة من النزول تلقائياً إلى الأسفل. - **[طي الإدخال](https://voyager.nagi.fun/ar/guide/input-collapse)**: منطقة إدخال قابلة للطي تلقائياً لتوفير مساحة قراءة أكبر. - **[النموذج الافتراضي](https://voyager.nagi.fun/ar/guide/default-model)**: تعيين النموذج المفضل لديك كنموذج افتراضي. - **[إخفاء العناصر الأخيرة والـ Gems](https://voyager.nagi.fun/ar/guide/recents-hider)**: إخفاء قائمة "الأخيرة" في الشريط الجانبي لتقليل التشتت. ### 🎨 التخصيص - افتح نافذة الإضافة المنبثقة وابحث عن **التأثيرات البصرية** للتبديل بين `إيقاف`، `ثلج`، `ساكورا`، و`مطر`. - التأثيرات تُعرض كطبقات خفيفة بملء الشاشة ولا تعيق التفاعل مع الصفحة. - عند تبديل التأثيرات أو إيقافها، تتلاشى الجسيمات بشكل طبيعي بدلاً من الاختفاء المفاجئ. --- ## 📥 التثبيت > ⚠️ ملاحظة: مدير المطالبات هو الميزة الوحيدة التي تدعم Gemini للمؤسسات.
Chrome Web Store    Microsoft Edge Add-ons    Firefox Add-ons    Safari تنزيل

سوق Chrome الإلكتروني يعمل أيضاً على Edge و Opera و Brave و Vivaldi و Arc ومتصفحات Chromium الأخرى.

> **حالة المتجر:** Chrome ✅ · Firefox ✅ · Edge ✅ · Safari ✅ لـ **التثبيت اليدوي** أو **بناء التطوير**، يرجى الرجوع إلى [دليل التثبيت](https://voyager.nagi.fun/ar/guide/installation). --- ## ☕ دعم هذا المشروع
إذا كان Voyager يسهل حياتك، فكر في دعوتي لتناول القهوة. يساعد ذلك في استمرار التحديثات! سيتم إدراج الداعمين في قسم الشكر الخاص بنا. ❤️
Buy Me A Coffee Sponsor on GitHub

أو الدعم عبر WeChat / Alipay / Afdian:

WeChat Pay
WeChat Pay
Alipay
Alipay
Nagi-ovo's Profile
Afdian
### 🎙️ أداة موصى بها: Typeless أوصي بشدة بـ **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**، وهي أداة تحويل الصوت إلى نص بالذكاء الاصطناعي استخدمتها على نطاق واسع أثناء تطوير Voyager. لقد وفرت لي الكثير من الوقت وزادت من إنتاجيتي بشكل كبير. > 🎁 **[انضم عبر رابط الإحالة الخاص بي](https://www.typeless.com/?via=gemini-voyager)** (الكود: _`gemini-voyager`_) للحصول على **5 دولارات رصيد مجاني**. ❤️ --- ## 🤝 المساهمة والتطوير [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) نرحب بالمساهمات! - **Issues**: استخدم نماذجنا لـ [تقرير الأخطاء](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/bug_report.md) أو [طلب الميزات](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml). - **Pull Requests**: تحقق من [CONTRIBUTING.md](./CONTRIBUTING.md). شكراً لمساعدتك في جعل Voyager أفضل! ❤️ ### ❤️ شكر خاص شكر خاص لجميع المساهمين على مساهماتهم في Voyager ❤️ --- ## 🌟 الاعتمادات - **[DeepSeek Voyager](https://github.com/Azurboy/deepseek-voyager)** - نسخة مشتقة من Voyager مخصصة لـ DeepSeek. - **[claude-nexus](https://github.com/Qiuner/claude-nexus)** - إضافة لتحسين Claude.ai مستوحاة من Voyager، تتضمن التنقّل عبر الخط الزمني، وإدارة المجلدات، ومكتبة المطالبات والمزيد، مع توافق كامل لاستيراد/تصدير المطالبات مع Voyager! - **[ChatGPT Conversation Timeline](https://github.com/Reborn14/chatgpt-conversation-timeline)** - مصدر الإلهام الأصلي للتنقل في الجدول الزمني للمحادثة. - **[Ophel Atlas](https://github.com/urzeye/ophel)** - إضافة متصفح تحوّل محادثات الذكاء الاصطناعي إلى مستندات منظمة وقابلة للبحث، مع إنشاء تلقائي للمخططات وإدارة المحادثات ومكتبة للأوامر، وتدعم منصات ذكاء اصطناعي متعددة. ---
Star History Chart

صنع بكل ❤️ بواسطة Jesse Zhang

رخصة GPLv3 © 2025
================================================ FILE: .github/README_ES.md ================================================
promotion

Haz que tu experiencia con Gemini™ sea verdaderamente tuya ✨

Navegación elegante por línea de tiempo, organización de chats con carpetas y tu propio depósito de prompts.
Es la pieza que le faltaba a Google Gemini.

Chrome Edge Firefox Safari Opera Brave

GitHub stars GitHub forks Latest version GitHub downloads Chrome Web Store users Chrome Web Store rating Firefox Add-ons users Firefox Add-ons rating

Nagi-ovo%2Fgemini-voyager | Trendshift Gemini Voyager - All-in-one Gemini suite: folders, chat export and much more | Product Hunt

✨ ¡Estamos en Product Hunt! Nos encantaría conocer tu opinión. ❤️

📖 DocumentaciónEnglish简体中文繁體中文日本語FrançaisPortuguêsРусскийالعربية한국어

KOL Recommendation
🎉 ¡Altamente recomendado por los principales influencers tecnológicos!

> [!IMPORTANT] > **Aviso de cambio de nombre**: Debido a problemas de marcas y derechos de autor, esta extensión ha sido renombrada oficialmente a **Voyager**. Sin embargo, debido a la lentitud del proceso de revisión de Chrome Web Store, el cambio de nombre no fue aprobado en 7 días — está temporalmente no disponible en Chrome Web Store. > [!NOTE] > Si Voyager te resulta útil, compártelo en X, Reddit, YouTube, etc. Cada difusión ayuda a que más personas descubran el proyecto y mejoren la experiencia con Gemini. Gracias. --- ## 👋 ¿Por qué Voyager? Nos encanta Gemini, pero a veces desearíamos que tuviera un poco más de estructura. Por eso creamos **Voyager**. No es solo una herramienta; es un compañero que te ayuda a mantener tus conversaciones con IA organizadas, accesibles y productivas. Ya seas un investigador que maneja docenas de hilos, un desarrollador que guarda fragmentos de código, o simplemente alguien que ama el orden, Voyager está diseñado para ti.

Try Voyager
Durante el problema del 18 de febrero en el que la aplicación Google Gemini hizo inaccesibles las conversaciones históricas de algunos usuarios, los usuarios de Voyager aún pudieron ver sus conversaciones guardadas en sus carpetas.

--- ## ✨ Funcionalidades ### 🌌 Núcleo Común (Gemini & AI Studio) - **📂 [Organización por Carpetas](https://voyager.nagi.fun/es/guide/folders)**: Organiza tus chats en una jerarquía de dos niveles con soporte para **arrastrar y soltar** y **sincronización con Google Drive**. - **Gemini**: Soporta **Modo de Aislamiento de Cuenta** y **Colores de Carpeta Personalizados**. - **💡 [Depósito de Prompts](https://voyager.nagi.fun/es/guide/prompts)**: Guarda y reutiliza tus mejores prompts en Gemini, AI Studio y [sitios web personalizados](https://voyager.nagi.fun/es/guide/custom-websites). - **☁️ [Sincronización en la Nube](https://voyager.nagi.fun/es/guide/cloud-sync)**: Sincroniza tus carpetas y depósito de prompts con Google Drive. - **📐 Copia de Fórmulas**: Copia en un clic los códigos fuente LaTeX y MathML (Word). - **🌦️ Efectos Visuales**: Añade un ambiente estacional con **nieve**, **lluvia cinematográfica** o **pétalos de sakura** desde el panel de configuración. ### ✨ Funciones Exclusivas de Gemini - **📍 [Navegación de Línea de Tiempo](https://voyager.nagi.fun/es/guide/timeline)**: Nodos visuales para saltar entre mensajes, destacar momentos clave y gestionar ramas de conversación. - **💾 [Exportación de Chat](https://voyager.nagi.fun/es/guide/export)**: Exporta conversaciones a JSON, Markdown o PDF con imágenes incluidas. - **🧜‍♀️ [Renderizado Mermaid](https://voyager.nagi.fun/es/guide/mermaid)**: Renderizado automático de diagramas de flujo, diagramas de secuencia y otros gráficos Mermaid. - **📝 [Corrección de Renderizado Markdown](https://voyager.nagi.fun/es/guide/markdown-fix)**: Corrige automáticamente la sintaxis de negrita de Markdown dañada por los elementos HTML inyectados por Gemini. - **🍌 [NanoBanana](https://voyager.nagi.fun/es/guide/nanobanana)**: Eliminación de marca de agua sin pérdida para imágenes generadas por Gemini. - **🔬 [Deep Research](https://voyager.nagi.fun/es/guide/deep-research)**: Extrae procesos de pensamiento y enlaces de investigación de las sesiones de Deep Research. - **🛠️ Herramientas de Productividad**: - **[Eliminación por Lote](https://voyager.nagi.fun/es/guide/batch-delete)**: Limpia tu historial de forma masiva. - **[Respuesta con Cita](https://voyager.nagi.fun/es/guide/quote-reply)**: Responde con contexto seleccionando texto. - **[Sincronización de Título de Pestaña](https://voyager.nagi.fun/es/guide/tab-title)**: Sincroniza automáticamente el título de la pestaña del navegador. - **[Evitar desplazamiento automático](https://voyager.nagi.fun/es/guide/prevent-auto-scroll)**: Intercepta el comportamiento de salto no deseado al enviar un mensaje. - **[Colapso de Entrada](https://voyager.nagi.fun/es/guide/input-collapse)**: Área de entrada auto-colapsable para más espacio de lectura. - **[Modelo Predeterminado](https://voyager.nagi.fun/es/guide/default-model)**: Establece tu modelo preferido por defecto. - **[Ocultar elementos recientes y Gems](https://voyager.nagi.fun/es/guide/recents-hider)**: Oculta la lista "Recientes" en la barra lateral para reducir las distracciones. ### 🎨 Personalización - Abre el popup de la extensión y busca **Efectos Visuales** para cambiar entre `Apagado`, `Nieve`, `Sakura` y `Lluvia`. - Los efectos se renderizan como capas ligeras a pantalla completa y no bloquean la interacción con la página. - Al cambiar de efecto o desactivarlo, las partículas se desvanecen naturalmente en lugar de desaparecer abruptamente. --- ## 📥 Instalación > ⚠️ Nota: El Administrador de Prompts es la única función que admite Gemini para Empresas.
Chrome Web Store    Microsoft Edge Add-ons    Firefox Add-ons    Safari Descargar

Chrome Web Store también funciona en Edge, Opera, Brave, Vivaldi, Arc y otros navegadores Chromium.

> **Estado de la Tienda:** Chrome ✅ · Firefox ✅ · Edge ✅ · Safari ✅ Para **instalación manual** o **compilaciones de desarrollo**, consulta la [Guía de Instalación](https://voyager.nagi.fun/es/guide/installation). --- ## ☕ Apoya este Proyecto
Si Voyager te facilita la vida, considera invitarme a un café. ¡Ayuda a mantener las actualizaciones! Los patrocinadores aparecerán en nuestra sección de Agradecimientos Especiales. ❤️
Buy Me A Coffee Sponsor on GitHub

O apoya a través de WeChat / Alipay / Afdian:

WeChat Pay
WeChat Pay
Alipay
Alipay
Nagi-ovo's Profile
Afdian
### 🎙️ Herramienta recomendada: Typeless Recomiendo encarecidamente **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**, una herramienta de voz a texto con IA que utilicé extensamente durante el desarrollo de Voyager. Integrarlo en mi flujo de trabajo diario me ha ahorrado muchísimo tiempo. > 🎁 **[Únete a través de mi enlace de referido](https://www.typeless.com/?via=gemini-voyager)** (Código: _`gemini-voyager`_) para obtener **$5 de crédito gratis**. ❤️ --- ## 🤝 Contribución y Desarrollo [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) ¡Damos la bienvenida a las contribuciones! - **Issues**: Usa nuestras plantillas de [informe de errores](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/bug_report.md) o [solicitud de funcionalidades](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml). - **Pull Requests**: Revisa [CONTRIBUTING.md](./CONTRIBUTING.md). ¡Gracias por ayudar a que Voyager sea mejor! ❤️ ### ❤️ Agradecimientos Especiales Un agradecimiento especial a todos los colaboradores por sus contribuciones a Voyager ❤️ --- ## 🌟 Créditos - **[DeepSeek Voyager](https://github.com/Azurboy/deepseek-voyager)** - Un fork de Voyager adaptado para DeepSeek. - **[claude-nexus](https://github.com/Qiuner/claude-nexus)** - Una extensión de mejora para Claude.ai inspirada en Voyager, con navegación de línea de tiempo, gestión de carpetas, biblioteca de prompts y más, con compatibilidad total de importación/exportación de prompts con Voyager. - **[ChatGPT Conversation Timeline](https://github.com/Reborn14/chatgpt-conversation-timeline)** - La fuente original de inspiración para la navegación por línea de tiempo. - **[Ophel Atlas](https://github.com/urzeye/ophel)** - Una extensión de navegador que transforma las conversaciones de IA en documentos organizados y buscables, con esquemas autogenerados, gestión de conversaciones y biblioteca de prompts, compatible con múltiples plataformas de IA. ---
Star History Chart

Hecho con ❤️ por Jesse Zhang

GPLv3 License © 2026
================================================ FILE: .github/README_FR.md ================================================
promotion

Personnalisez votre expérience Gemini™ ✨

Navigation temporelle élégante, organisation des chats par dossiers, et coffre-fort de prompts personnel.
C'est l'extension indispensable pour Google Gemini.

Chrome Edge Firefox Safari Opera Brave

GitHub stars GitHub forks Latest version GitHub downloads Chrome Web Store users Chrome Web Store rating Firefox Add-ons users Firefox Add-ons rating

Nagi-ovo%2Fgemini-voyager | Trendshift Gemini Voyager - All-in-one Gemini suite: folders, chat export and much more | Product Hunt

✨ Nous sommes en direct sur Product Hunt ! Vos retours sont les bienvenus. ❤️

📖 DocumentationEnglish简体中文繁體中文日本語EspañolPortuguêsРусскийالعربية한국어

KOL Recommendation
🎉 Fortement recommandé par les meilleurs influenceurs tech !

> [!IMPORTANT] > **Avis de changement de nom** : En raison de problèmes de marque et de droits d'auteur, cette extension a été officiellement renommée **Voyager**. Cependant, en raison de la lenteur extrême du processus de révision du Chrome Web Store, le changement de nom n'a pas été approuvé dans les 7 jours — elle est temporairement indisponible sur le Chrome Web Store. > [!NOTE] > Si Voyager vous est utile, partagez-le sur X, Reddit, YouTube, etc. Chaque partage aide plus de personnes à découvrir le projet et à améliorer l'expérience Gemini. Merci. --- ## 👋 Pourquoi Voyager ? Nous adorons Gemini, mais nous aimerions parfois qu'il soit un peu plus "ordonné". C'est pourquoi nous avons créé **Voyager**. Plus qu'un simple outil, c'est un compagnon qui vous aide à garder vos conversations IA organisées, accessibles et productives. Que vous soyez un chercheur gérant des dizaines de fils, un développeur sauvegardant des extraits de code, ou simplement quelqu'un qui aime l'ordre, Voyager est fait pour vous.

Try Voyager
Lors du problème du 18 février où l'application Google Gemini a rendu inaccessibles les conversations historiques de certains utilisateurs, les utilisateurs de Voyager ont toujours pu voir leurs conversations enregistrées dans leurs dossiers.

--- ## ✨ Fonctionnalités ### 🌌 Noyau Commun (Gemini & AI Studio) - **📂 [Dossiers](https://voyager.nagi.fun/fr/guide/folders)** : Organisez vos chats dans une hiérarchie à deux niveaux avec support du **glisser-déposer** et **synchronisation Google Drive**. - **Gemini** : Support du **mode d'isolation de compte** et **couleurs de dossiers personnalisées**. - **💡 [Coffre-fort de Prompts](https://voyager.nagi.fun/fr/guide/prompts)** : Enregistrez et réutilisez vos meilleurs prompts sur Gemini, AI Studio et [sites personnalisés](https://voyager.nagi.fun/fr/guide/custom-websites). - **☁️ [Sincronisation Cloud](https://voyager.nagi.fun/fr/guide/cloud-sync)** : Synchronisez vos dossiers et coffre-fort de prompts avec Google Drive. - **📐 Copie de Formules**: Copie en un clic des codes sources LaTeX et MathML (Word). - **🌦️ Effets Visuels** : Ajoutez une ambiance saisonnière avec **neige**, **pluie cinématique** ou **pétales de sakura** depuis le panneau de paramètres. ### ✨ Fonctions Exclusives Gemini - **📍 [Navigation Temporelle](https://voyager.nagi.fun/fr/guide/timeline)** : Des nœuds visuels pour naviguer entre les messages, marquer les moments clés et gérer les branches de conversation. - **💾 [Export de Chat](https://voyager.nagi.fun/fr/guide/export)** : Exportez vos conversations en JSON, Markdown ou PDF avec les images incluses. - **🧜‍♀️ [Rendu Mermaid](https://voyager.nagi.fun/fr/guide/mermaid)**: Rendu automatique des organigrammes, diagrammes de séquence et autres graphiques Mermaid. - **📝 [Correction du Rendu Markdown](https://voyager.nagi.fun/fr/guide/markdown-fix)**: Répare automatiquement la syntaxe Markdown grasse corrompue par les éléments HTML injectés par Gemini. - **🍌 [NanoBanana](https://voyager.nagi.fun/fr/guide/nanobanana)** : Suppression sans perte du filigrane Gemini sur les images générées. - **🔬 [Deep Research](https://voyager.nagi.fun/fr/guide/deep-research)** : Extrayez les processus de réflexion et les liens de recherche des sessions Deep Research. - **🛠️ Outils de Productivité** : - **[Suppression par Lot](https://voyager.nagi.fun/fr/guide/batch-delete)** : Nettoyage massif de votre historique. - **[Réponse avec Citation](https://voyager.nagi.fun/fr/guide/quote-reply)** : Répondez avec contexte en sélectionnant simplement du texte. - **[Synchro Titre Onglet](https://voyager.nagi.fun/fr/guide/tab-title)** : Synchronisation automatique du titre de l'onglet avec le titre du chat. - **[Empêcher le défilement auto](https://voyager.nagi.fun/fr/guide/prevent-auto-scroll)** : Intercepte le saut incontrôlé vers le bas de la page. - **[Réduction Entrée](https://voyager.nagi.fun/fr/guide/input-collapse)** : Zone de saisie auto-réductible pour plus d'espace de lecture. - **[Modèle par Défaut](https://voyager.nagi.fun/fr/guide/default-model)** : Définissez votre modèle préféré par défaut. - **[Masquer les éléments récents et Gems](https://voyager.nagi.fun/fr/guide/recents-hider)** : Masquer la liste "Récents" dans la barre latérale pour réduire les distractions. ### 🎨 Personnalisation - Ouvrez le popup de l'extension et recherchez **Effets Visuels** pour basculer entre `Désactivé`, `Neige`, `Sakura` et `Pluie`. - Les effets sont rendus sous forme de couches légères plein écran qui ne bloquent pas l'interaction avec la page. - Lors du changement d'effet ou de la désactivation, les particules s'estompent naturellement au lieu de disparaître brusquement. --- ## 📥 Installation > ⚠️ Note : Le Gestionnaire de Prompts est la seule fonctionnalité supportant Gemini for Enterprise.
Chrome Web Store    Microsoft Edge Add-ons    Firefox Add-ons    Safari Télécharger

Le Chrome Web Store fonctionne aussi sur Edge, Opera, Brave, Vivaldi, Arc et autres navigateurs Chromium.

> **Statut des Stores :** Chrome ✅ · Firefox ✅ · Edge ✅ · Safari ✅ Pour une **installation manuelle** ou des **builds de développement**, veuillez vous référer au [Guide d'Installation](https://voyager.nagi.fun/fr/guide/installation). --- ## ☕ Soutenir le Projet
Si Voyager facilite votre vie, considérez m'offrir un café. Cela aide à maintenir les mises à jour ! Les donateurs seront cités dans notre section remerciements. ❤️
Buy Me A Coffee Sponsor on GitHub

Ou via WeChat / Alipay / Afdian :

WeChat Pay
WeChat Pay
Alipay
Alipay
Nagi-ovo's Profile
Afdian
### 🎙️ Outil recommandé : Typeless Je recommande vivement **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**, un outil de synthèse vocale IA que j'ai utilisé intensivement durant le développement. Il booste considérablement la productivité. > 🎁 **[Rejoignez via mon lien](https://www.typeless.com/?via=gemini-voyager)** (Code : _`gemini-voyager`_) pour obtenir **5$ de crédits gratuits**. ❤️ --- ## 🤝 Contribution & Développement [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) Toute contribution est la bienvenue ! - **Issues** : Utilisez nos templates de [bug report](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/bug_report.md) ou [feature request](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml). - **Pull Requests** : Consultez [CONTRIBUTING.md](./CONTRIBUTING.md). Merci d'aider à rendre Voyager meilleur ! ❤️ ### ❤️ Remerciements Spéciaux Un grand merci à tous les contributeurs pour leurs contributions à Voyager ❤️ --- ## 🌟 Crédits - **[DeepSeek Voyager](https://github.com/Azurboy/deepseek-voyager)** - Un fork de Voyager adapté pour DeepSeek. - **[claude-nexus](https://github.com/Qiuner/claude-nexus)** - Une extension d’amélioration pour Claude.ai inspirée de Voyager, avec navigation par timeline, gestion de dossiers, bibliothèque de prompts, et une compatibilité totale d’import/export des prompts avec Voyager ! - **[ChatGPT Conversation Timeline](https://github.com/Reborn14/chatgpt-conversation-timeline)** - La source d'inspiration originale pour la navigation temporelle. - **[Ophel Atlas](https://github.com/urzeye/ophel)** - Une extension de navigateur qui transforme les conversations IA en documents organisés et consultables, avec génération automatique de plans, gestion des conversations et bibliothèque de prompts, compatible avec plusieurs plateformes d'IA. ---
Star History Chart

Fait avec ❤️ par Jesse Zhang

GPLv3 License © 2026
================================================ FILE: .github/README_JA.md ================================================
promotion

Gemini™ 体験を自分好みに ✨

エレガントなタイムライン、フォルダ管理、そしてプロンプト管理。
Gemini に足りなかった「最後のピース」がここにあります。

Chrome Edge Firefox Safari Opera Brave

GitHub Star GitHub Fork 最新バージョン GitHub ダウンロード数 Chrome ユーザー数 Chrome 評価 Firefox ユーザー数 Firefox 評価

Nagi-ovo%2Fgemini-voyager | Trendshift Gemini Voyager - All-in-one Gemini suite: folders, chat export and much more | Product Hunt

✨ Product Hunt に登場しました!応援よろしくお願いします。❤️

📖 ドキュメントEnglish简体中文繁體中文FrançaisEspañolPortuguêsРусскийالعربية한국어

KOL Recommendation
🎉 トップテック KOL やコミュニティから強く推奨されています!

> [!IMPORTANT] > **名称変更のお知らせ**:商標・著作権上の問題により、本拡張機能は正式に **Voyager** へ改名されました。ただし、Chrome ウェブストアの審査が非常に遅いため、7 日以内に名称変更が承認されず、現在 Chrome Web Store では一時的にご利用いただけない状態です。 > [!NOTE] > もし Voyager が役に立っているなら、X、YouTube、Reddit などで共有してもらえると嬉しいです。シェアが増えるほど、このプロジェクトをより多くの人に届けられ、Gemini の体験改善にもつながります。ありがとう。 --- ## 👋 Voyager とは? 私たちは Gemini が大好きですが、時にはもう少し「秩序」が欲しいと感じることがあります。 それが **Voyager** を開発した理由です。これは単なるツールではなく、AI との会話を整理し、アクセスしやすく、生産的にするためのパートナーです。多くのスレッドを扱う研究者、コードを保存したい開発者、あるいは単に整理整頓が好きな方、Voyager はあなたのための拡張機能です。

Try Voyager
2 月 18 日に Google Gemini App が一部のユーザーの履歴会話にアクセスできなくなる問題を引き起こした際、Voyager のユーザーは引き続きフォルダ内に保存された会話を見ることができました。

--- ## ✨ 主な機能 ### 🌌 共通コア (Gemini & AI Studio) - **📂 [フォルダ管理](https://voyager.nagi.fun/ja/guide/folders)**: **階層構造**、**ドラッグ&ドロップによる並べ替え**、**Google ドライブ同期**をサポート。 - **Gemini**: **マルチアカウント分離モード**と**カスタムフォルダカラー**をサポート。 - **💡 [プロンプト管理](https://voyager.nagi.fun/ja/guide/prompts)**: プロンプトを保存して再利用。Gemini、AI Studio、[カスタムサイト](https://voyager.nagi.fun/ja/guide/custom-websites)で使用可能。 - **☁️ [クラウド同期](https://voyager.nagi.fun/ja/guide/cloud-sync)**: フォルダとプロンプトを Google ドライブに同期します。 - **📐 数式コピー**: LaTeX および MathML (Word) のソースコードを一クリックでコピー。 - **🌦️ ビジュアルエフェクト**: **雪**、**映画的な雨**、**桜の花びら**で季節の雰囲気を演出。設定パネルから切り替え可能。 ### ✨ Gemini 専用機能 - **📍 [タイムライン](https://voyager.nagi.fun/ja/guide/timeline)**: 会話構造を可視化し、メッセージ間を瞬時に移動。重要なメッセージのスター保存も可能。 - **💾 [エクスポート](https://voyager.nagi.fun/ja/guide/export)**: 会話を JSON、Markdown、PDF 形式で保存(画像込み)。 - **🧜‍♀️ [Mermaid レンダリング](https://voyager.nagi.fun/ja/guide/mermaid)**: フローチャート、シーケンス図、その他の Mermaid チャートを自動レンダリングします。 - **📝 [Markdown レンダリングの修正](https://voyager.nagi.fun/ja/guide/markdown-fix)**: Gemini が挿入した HTML 要素によって壊れた Markdown の太字構文を自動的に修正します。 - **🍌 [NanoBanana](https://voyager.nagi.fun/ja/guide/nanobanana)**: Gemini で生成された画像からウォーターマークを自動除去。 - **🔬 [Deep Research](https://voyager.nagi.fun/ja/guide/deep-research)**: 思考プロセスやリサーチリンクを Markdown で抽出。 - **🛠️ パワーツール**: - **[一括削除](https://voyager.nagi.fun/ja/guide/batch-delete)**: 履歴をまとめてクリーンアップ。 - **[引用返信](https://voyager.nagi.fun/ja/guide/quote-reply)**: テキストを選択してワンクリックで引用。 - **[タブタイトルの同期](https://voyager.nagi.fun/ja/guide/tab-title)**: タブの名前をチャットのタイトルに自動変更。 - **[自動スクロール防止](https://voyager.nagi.fun/ja/guide/prevent-auto-scroll)**: 新しいプロンプトを送信する際の迷惑なジャンプ動作を阻止します。 - **[入力欄の自動非表示](https://voyager.nagi.fun/ja/guide/input-collapse)**: 未入力時に折りたたんで表示スペースを確保。 - **[デフォルトモデル](https://voyager.nagi.fun/ja/guide/default-model)**: 新しい対話に使用するデフォルトのモデルを設定します。 - **[最近の項目と Gem を非表示](https://voyager.nagi.fun/ja/guide/recents-hider)**: サイドバーの「最近」リストを非表示にして、集中力を高めます。 ### 🎨 パーソナライズ - 拡張機能のポップアップを開き、**ビジュアルエフェクト** で `オフ`、`雪`、`桜`、`雨` を切り替えられます。 - エフェクトは軽量なフルスクリーンオーバーレイとしてレンダリングされ、ページの操作を妨げません。 - エフェクトを切り替えたりオフにしたりすると、パーティクルは突然消えるのではなく、自然にフェードアウトします。 --- ## 📥 インストール > ⚠️ 注意:プロンプト管理のみが Gemini for Enterprise をサポートしています。
Chrome Web Store    Microsoft Edge Add-ons    Firefox Add-ons    Safari ダウンロード

Chrome ストア版は Edge, Opera, Brave, Vivaldi, Arc などの Chromium 系ブラウザでも動作します。

> **ストア状況:** Chrome ✅ · Firefox ✅ · Edge ✅ · Safari ✅ **手動インストール**や**開発用ビルド**については、[インストールガイド](https://voyager.nagi.fun/ja/guide/installation)を参照してください。 --- ## ☕ 支援のお願い
Voyager がお役に立ちましたら、コーヒー一杯分のご支援をいただけますと幸いです。アップデートの継続に繋がります!❤️
Buy Me A Coffee Sponsor on GitHub

WeChat / Alipay / Afdian でも支援可能です:

WeChat Pay
WeChat Pay
Alipay
Alipay
Nagi-ovo's Profile
Afdian
### 🎙️ おすすめツール:Typeless Voyager の開発中、私は AI 音声入力ツール **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)** を愛用していました。日々のワークフローに欠かせない、生産性を劇的に向上させてくれるツールです。 > 🎁 **[こちらのリンク](https://www.typeless.com/?via=gemini-voyager)**(招待コード:_`gemini-voyager`_)から登録すると、**5 ドルの無料クレジット**がもらえます。❤️ --- ## 🤝 貢献と開発 [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) バグ報告、機能提案、ドキュメントの改善など、あらゆる貢献を歓迎します! - **Issues**: [バグ報告](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/bug_report.md) または [機能提案](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml) テンプレートを使用してください。 - **Pull Requests**: [CONTRIBUTING.md](./CONTRIBUTING.md) をご確認ください。
開発環境の構築 ```bash # 依存関係のインストール (Bun 推奨) bun i # 開発モード (ホットリロード対応) bun run dev:chrome bun run dev:firefox bun run dev:safari # ビルド bun run build:all ``` **Safari での開発**: 詳細は [safari/README.md](../safari/README.md) を参照してください。
Voyager をより良くするために協力してくださり、ありがとうございます!❤️ ### ❤️ スペシャルサンクス Voyager に貢献してくださったすべてのコントリビューターに感謝します ❤️ --- ## 🌟 クレジット - **[DeepSeek Voyager](https://github.com/Azurboy/deepseek-voyager)** - Voyager を DeepSeek 向けに移植したプロジェクト。 - **[claude-nexus](https://github.com/Qiuner/claude-nexus)** - Voyager に着想を得た Claude.ai 向け拡張機能。タイムラインナビゲーション、フォルダ管理、プロンプトライブラリなどを備え、Voyager のプロンプトのインポート/エクスポートと完全互換です! - **[ChatGPT Conversation Timeline](https://github.com/Reborn14/chatgpt-conversation-timeline)** - オリジナルの ChatGPT 向け拡張機能。このプロジェクトのインスピレーションの源です。 - **[Ophel Atlas](https://github.com/urzeye/ophel)** - AI チャットを整理された検索可能なドキュメントに変換するブラウザ拡張機能。アウトラインの自動生成、会話管理、プロンプトライブラリを備え、複数の AI プラットフォームに対応しています。 ---
Star History Chart

Made with ❤️ by Jesse Zhang

GPLv3 License © 2026
================================================ FILE: .github/README_KO.md ================================================
promotion

Gemini™ 경험을 진정으로 당신의 것으로 만드세요 ✨

우아한 타임라인으로 대화를 탐색하고, 폴더로 채팅을 정리하며, 자신만의 프롬프트 저장소를 구축하세요.
Google Gemini 를 위한 필수 강화 도구입니다.

Chrome Edge Firefox Safari Opera Brave

GitHub stars GitHub forks Latest version GitHub downloads Chrome Web Store users Chrome Web Store rating Firefox Add-ons users Firefox Add-ons rating

Nagi-ovo%2Fgemini-voyager | Trendshift Gemini Voyager - All-in-one Gemini suite: folders, chat export and much more | Product Hunt

✨ Product Hunt 에 출시되었습니다! 여러분의 의견과 피드백을 환영합니다. ❤️

📖 문서English简体中文繁體中文日本語FrançaisEspañolPortuguêsРусскийالعربية

KOL Recommendation
🎉 주요 기술 KOL 및 커뮤니티에서 적극 권장합니다!

> [!IMPORTANT] > **이름 변경 안내**: 상표 및 저작권 문제로 인해 이 확장 프로그램이 공식적으로 **Voyager**로 이름이 변경되었습니다. 하지만 Chrome 웹 스토어의 심사 속도가 매우 느려 7일 이내에 이름 변경이 승인되지 않아, 현재 Chrome Web Store에서 일시적으로 이용할 수 없는 상태입니다. > [!NOTE] > Voyager 가 도움이 되었다면 X, YouTube, Reddit 등에서 공유해 주세요. 공유가 늘수록 더 많은 사용자가 프로젝트를 발견하고 Gemini 사용 경험도 함께 좋아집니다. 감사합니다. --- ## 👋 왜 Voyager 인가요? 우리는 Gemini 를 사랑하지만, 때로는 조금 더 구조화된 정리가 필요하다고 느꼈습니다. 그래서 우리는 **Voyager**를 만들었습니다. 이것은 단순한 도구가 아니라, AI 대화를 정리하고 액세스 가능하며 생산적으로 유지하도록 돕는 동반자입니다. 수십 개의 스레드를 관리하는 연구자이든, 코드 스니펫을 저장하는 개발자이든, 단순히 정리를 좋아하는 사람이든 Voyager 는 당신을 위해 설계되었습니다.

Try Voyager
2 월 18 일 Google Gemini 앱으로 인해 일부 사용자의 과거 대화에 접근할 수 없는 문제가 발생했을 때, Voyager 사용자는 여전히 폴더에 저장된 대화를 볼 수 있었습니다.

--- ## ✨ 주요 기능 ### 🌌 공통 (Gemini & AI Studio) - **📂 [폴더 관리](https://voyager.nagi.fun/ko/guide/folders)**: 드래그 앤 드롭을 지원하는 2 단계 폴더 계층 구조로 대화를 정리하세요. - **Gemini**: **계정 분리 모드** 및 **사용자 지정 폴더 색상**을 지원합니다. - **💡 [프롬프트 저장소](https://voyager.nagi.fun/ko/guide/prompts)**: Gemini, AI Studio 및 [사용자 지정 웹사이트](https://voyager.nagi.fun/ko/guide/custom-websites)에서 프롬프트를 저장하고 재사용하세요. - **☁️ [클라우드 동기화](https://voyager.nagi.fun/ko/guide/cloud-sync)**: 폴더와 프롬프트를 Google Drive 에 동기화하세요. - **📐 수식 복사**: LaTeX 및 MathML (Word) 소스 코드를 클릭 한 번으로 복사하세요. - **🌦️ 시각 효과**: 설정 패널에서 **눈**, **시네마틱 비**, **벚꽃잎** 효과를 전환하여 계절 분위기를 연출하세요. ### ✨ Gemini 전용 기능 - **📍 [타임라인 탐색](https://voyager.nagi.fun/ko/guide/timeline)**: 시각적 노드를 통해 메시지 간 이동, 주요 순간 별표 표시, 대화 브랜치 관리를 수행하세요. - **💾 [대화 내보내기](https://voyager.nagi.fun/ko/guide/export)**: 이미지를 포함하여 JSON, Markdown 또는 PDF 로 대화를 내보내세요. - **🧜‍♀️ [Mermaid 렌더링](https://voyager.nagi.fun/ko/guide/mermaid)**: 플로우차트, 시퀀스 다이어그램 및 기타 Mermaid 차트를 자동으로 렌더링합니다. - **📝 [Markdown 렌더링 수정](https://voyager.nagi.fun/ko/guide/markdown-fix)**: Gemini 가 삽입한 HTML 요소로 인해 깨진 굵게 표시 (bold) 구문을 자동으로 수정합니다. - **🍌 [NanoBanana](https://voyager.nagi.fun/ko/guide/nanobanana)**: Gemini 에서 생성된 이미지의 워터마크를 무손실로 제거합니다. - **🔬 [Deep Research](https://voyager.nagi.fun/ko/guide/deep-research)**: Deep Research 세션에서 생각 과정과 연구 링크를 추출합니다. - **🛠️ 파워 툴**: - **[일괄 삭제](https://voyager.nagi.fun/ko/guide/batch-delete)**: 여러 대화를 한꺼번에 삭제합니다. - **[인용 답장](https://voyager.nagi.fun/ko/guide/quote-reply)**: 텍스트를 선택하여 문맥과 함께 답장합니다. - **[탭 제목 동기화](https://voyager.nagi.fun/ko/guide/tab-title)**: 브라우저 탭 제목을 자동으로 동기화합니다. - **[자동 스크롤 방지](https://voyager.nagi.fun/ko/guide/prevent-auto-scroll)**: 새로운 프롬프트를 전송할 때 발생하는 원치 않는 점프 동작을 차단합니다. - **[입력창 접기](https://voyager.nagi.fun/ko/guide/input-collapse)**: 더 많은 읽기 공간을 위해 자동으로 확장되는 입력 영역을 제공합니다. - **[기본 모델](https://voyager.nagi.fun/ko/guide/default-model)**: 좋아하는 모델을 기본값으로 설정하세요. - **[최근 항목 숨기기](https://voyager.nagi.fun/ko/guide/recents-hider)**: 사이드바에서 "최근" 목록을 숨겨 산만함을 줄입니다. ### 🎨 개인화 - 확장 프로그램 팝업을 열고 **시각 효과**에서 `끄기`, `눈`, `벚꽃`, `비`를 전환할 수 있습니다. - 효과는 가벼운 전체 화면 오버레이로 렌더링되며, 페이지 상호작용을 차단하지 않습니다. - 효과를 전환하거나 끄면 파티클이 갑자기 사라지는 대신 자연스럽게 사라집니다. --- ## 📥 설치 > ⚠️ 참고: 프롬프트 관리자는 Gemini Enterprise 를 지원하는 유일한 기능입니다.
Chrome Web Store    Microsoft Edge Add-ons    Firefox Add-ons    Safari 다운로드

Chrome 웹 스토어는 Edge, Opera, Brave, Vivaldi, Arc 및 기타 Chromium 브라우저에서도 작동합니다.

> **스토어 상태:** Chrome ✅ · Firefox ✅ · Edge ✅ · Safari ✅ **수동 설치** 또는 **개발 빌드**에 대해서는 [설치 가이드](https://voyager.nagi.fun/ko/guide/installation)를 참조하세요. --- ## ☕ 프로젝트 후원하기
Voyager 가 도움이 되었다면 커피 한 잔을 후원해 주세요. 지속적인 업데이트에 큰 도움이 됩니다! 후원자분들은 특별 감사 섹션에 기재됩니다. ❤️
Buy Me A Coffee Sponsor on GitHub

또는 WeChat / Alipay / Afdian 을 통해 후원하기:

WeChat Pay
WeChat Pay
Alipay
Alipay
Nagi-ovo's Profile
Afdian
### 🎙️ 추천 도구: Typeless Voyager 개발 중에 광범위하게 사용한 AI 음성 - 텍스트 변환 도구인 **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**를 강력히 추천합니다. 이를 매일의 워크플로우에 통합함으로써 엄청난 시간을 절약하고 생산성을 크게 높일 수 있었습니다. > 🎁 **[제 추천 링크를 통해 가입](https://www.typeless.com/?via=gemini-voyager)** (코드: _`gemini-voyager`_) 하시면 **$5 무료 크레딧**을 받으실 수 있습니다. 이는 제가 이 프로젝트를 계속 유지 관리할 수 있는 크레딧을 제공하며, 저의 작업을 지원하는 무료 방법입니다! ❤️ --- ## 💬 커뮤니티
Follow on X

업데이트 팔로우
최신 소식을 받아보세요.
Discord

커뮤니티 가입
다른 사용자들과 대화하고, 프롬프트를 공유하고, 도움을 받으세요.
--- ## 🤝 기여 및 개발 [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) 여러분의 기여를 환영합니다! 버그 보고, 기능 제안, 문서 개선 또는 코드 제출 등 무엇이든 환영합니다: - **이슈**: [버그 보고](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/bug_report.md) 또는 [기능 제안](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml) 템플릿을 사용하세요. - **풀 리퀘스트**: 가이드라인은 [CONTRIBUTING.md](../.github/CONTRIBUTING.md)를 확인하세요.
개발 설정 ```bash # 의존성 설치 (Bun 권장) bun i # 개발 모드 (자동 새로고침 지원) bun run dev:chrome # Chrome 및 Chromium 브라우저 bun run dev:firefox # Firefox bun run dev:safari # Safari (macOS 필요) # 프로덕션 빌드 bun run build:chrome # Chrome bun run build:firefox # Firefox bun run build:safari # Safari bun run build:all # 모든 브라우저 ``` **Safari 개발**: 추가 빌드 단계는 [safari/README.md](../safari/README.md) 를 참조하세요.
Voyager 를 더 좋게 만들 수 있도록 도와주셔서 감사합니다! ❤️ ### ❤️ 특별 감사 Voyager에 기여해 주신 모든 기여자분들께 특별히 감사드립니다 ❤️ --- ## 🌟 크레딧 - **[DeepSeek Voyager](https://github.com/Azurboy/deepseek-voyager)** - Voyager 를 DeepSeek 에 맞게 조정한 포크 프로젝트로, DeepSeek 사용자에게 타임라인 탐색 및 채팅 관리 기능을 제공합니다! - **[claude-nexus](https://github.com/Qiuner/claude-nexus)** - Voyager에서 영감을 받은 Claude.ai 향상 확장 프로그램으로, 타임라인 탐색, 폴더 관리, 프롬프트 라이브러리 등 다양한 기능을 제공하며 Voyager 프롬프트 가져오기/내보내기와 완전 호환됩니다! - **[ChatGPT Conversation Timeline](https://github.com/Reborn14/chatgpt-conversation-timeline)** - 이 프로젝트에 영감을 준 ChatGPT 용 오리지널 타임라인 탐색 확장 프로그램입니다. Voyager 는 타임라인 개념을 Gemini 에 맞게 조정하고 폴더 관리, 프롬프트 저장소, 채팅 내보내기 등 광범위한 새로운 기능을 추가했습니다. - **[Ophel Atlas](https://github.com/urzeye/ophel)** - AI 대화를 체계적이고 검색 가능한 문서로 변환하는 브라우저 확장 프로그램입니다. 자동 개요 생성, 대화 관리, 프롬프트 라이브러리를 제공하며 여러 AI 플랫폼을 지원합니다. ---
Star History Chart

Made with ❤️ by Jesse Zhang

GPLv3 License © 2026
================================================ FILE: .github/README_PT.md ================================================
promotion

Torne a sua experiência Gemini™ verdadeiramente sua ✨

Navegação elegante na linha do tempo, organização de chats com pastas e o seu próprio cofre de prompts.
É o "power-up" que faltava no Google Gemini.

Chrome Edge Firefox Safari Opera Brave

GitHub stars GitHub forks Latest version GitHub downloads Chrome Web Store users Chrome Web Store rating Firefox Add-ons users Firefox Add-ons rating

Nagi-ovo%2Fgemini-voyager | Trendshift Gemini Voyager - All-in-one Gemini suite: folders, chat export and much more | Product Hunt

✨ Estamos no Product Hunt! Gostaríamos muito de ouvir o seu feedback. ❤️

📖 DocumentaçãoEnglish简体中文繁體中文日本語FrançaisEspañolРусскийالعربية한국어

KOL Recommendation
🎉 Altamente recomendado pelos principais influenciadores de tecnologia!

> [!IMPORTANT] > **Aviso de mudança de nome**: Devido a problemas de marcas registradas e direitos autorais, esta extensão foi oficialmente renomeada para **Voyager**. No entanto, devido ao processo extremamente lento de revisão do Chrome Web Store, a mudança de nome não foi aprovada em 7 dias — está temporariamente indisponível no Chrome Web Store. > [!NOTE] > Se o Voyager for útil para você, compartilhe no X, Reddit, YouTube, etc. Cada partilha ajuda mais pessoas a descobrir o projeto e a melhorar a experiência com Gemini. Obrigado. --- ## 👋 Porquê o Voyager? Nós adoramos o Gemini, mas às vezes desejaríamos que ele tivesse apenas um pouco mais de "estrutura". Foi por isso que criámos o **Voyager**. Não é apenas uma ferramenta; é um companheiro que o ajuda a manter as suas conversas com IA organizadas, acessíveis e produtivas. Quer seja um investigador que lida com dezenas de threads, um programador que guarda snippets de código, ou apenas alguém que adora ordem, o Voyager foi desenhado para si.

Try Voyager
Durante o problema de 18 de fevereiro, em que o Google Gemini App tornou as conversas históricas de alguns usuários inacessíveis, os usuários do Voyager ainda conseguiram ver suas conversas salvas em suas pastas.

--- ## ✨ Funcionalidades
teaser
Para um guia completo, visite a nossa [Documentação](https://voyager.nagi.fun/pt). ### 🌌 Núcleo Comum (Gemini & AI Studio) - **📂 [Organização por Pastas](https://voyager.nagi.fun/pt/guide/folders)**: Organize os seus chats numa hierarquia de dois níveis com suporte para **arrastar e largar** e **sincronização com o Google Drive**. - **Gemini**: Suporta o **Modo de Isolamento de Conta** e **Cores de Pastas Personalizadas**. - **💡 [Cofre de Prompts](https://voyager.nagi.fun/pt/guide/prompts)**: Guarde e reutilize os seus melhores prompts no Gemini, AI Studio e [sites personalizados](https://voyager.nagi.fun/pt/guide/custom-websites). - **☁️ [Sincronização na Nuvem](https://voyager.nagi.fun/pt/guide/cloud-sync)**: Sincronize as suas pastas e cofre de prompts com o Google Drive. - **📐 Cópia de Fórmulas**: Cópia com um clique de códigos-fonte LaTeX e MathML (Word). - **🌦️ Efeitos Visuais**: Adicione um ambiente sazonal com **neve**, **chuva cinematográfica** ou **pétalas de sakura** a partir do painel de configurações. ### ✨ Recursos Exclusivos do Gemini - **📍 [Navegação na Linha do Tempo](https://voyager.nagi.fun/pt/guide/timeline)**: Nós visuais para saltar entre mensagens, marcar momentos importantes e gerir ramos da conversa. - **💾 [Exportação de Chat](https://voyager.nagi.fun/pt/guide/export)**: Exporte conversas para JSON, Markdown ou PDF com imagens incluídas. - **🧜‍♀️ [Renderização Mermaid](https://voyager.nagi.fun/pt/guide/mermaid)**: Renderização automática de fluxogramas, diagramas de sequência e outros gráficos Mermaid. - **📝 [Correção de Renderização Markdown](https://voyager.nagi.fun/pt/guide/markdown-fix)**: Corrige automaticamente a sintaxe de negrito do Markdown quebrada pelos elementos HTML injetados pelo Gemini. - **🍌 [NanoBanana](https://voyager.nagi.fun/pt/guide/nanobanana)**: Remoção de marca de água sem perdas para imagens geradas pelo Gemini. - **🔬 [Deep Research](https://voyager.nagi.fun/pt/guide/deep-research)**: Extraia processos de pensamento e links de pesquisa de sessões de Deep Research. - **🛠️ Ferramentas de Produtividade**: - **[Exclusão em Lote](https://voyager.nagi.fun/pt/guide/batch-delete)**: Limpe o seu histórico em massa. - **[Resposta com Citação](https://voyager.nagi.fun/pt/guide/quote-reply)**: Responda com contexto selecionando o texto. - **[Sincronização do Título da Aba](https://voyager.nagi.fun/pt/guide/tab-title)**: Sincroniza automaticamente o título da aba do navegador. - **[Prevenir rolamento automático](https://voyager.nagi.fun/pt/guide/prevent-auto-scroll)**: Intercepta o comportamento de salto indesejado ao enviar uma mensagem. - **[Colapso de Entrada](https://voyager.nagi.fun/pt/guide/input-collapse)**: Área de entrada auto-colapsável para mais espaço de leitura. - **[Modelo Padrão](https://voyager.nagi.fun/pt/guide/default-model)**: Defina o seu modelo favorito como padrão. - **[Ocultar itens recentes e Gems](https://voyager.nagi.fun/pt/guide/recents-hider)**: Oculta a lista "Recentes" na barra lateral para reduzir distrações. ### 🎨 Personalização - Abra o popup da extensão e encontre **Efeitos Visuais** para alternar entre `Desligado`, `Neve`, `Sakura` e `Chuva`. - Os efeitos são renderizados como sobreposições leves em tela cheia e não bloqueiam a interação com a página. - Ao trocar de efeito ou desativar, as partículas desaparecem naturalmente em vez de sumir abruptamente. --- ## 📥 Instalação > ⚠️ Nota: O Gestor de Prompts é a única funcionalidade que suporta o Gemini for Enterprise.
Chrome Web Store    Microsoft Edge Add-ons    Firefox Add-ons    Safari Descarregar

A Chrome Web Store também funciona no Edge, Opera, Brave, Vivaldi, Arc e outros navegadores Chromium.

> **Estado da Loja:** Chrome ✅ · Firefox ✅ · Edge ✅ · Safari ✅ Para **instalação manual** ou **builds de desenvolvimento**, consulte o [Guia de Instalação](https://voyager.nagi.fun/pt/guide/installation). --- ## ☕ Apoie este Projeto
Se o Voyager facilita a sua vida, considere pagar-me um café. Ajuda a manter as atualizações! Os patrocinadores serão destacados na nossa secção de Agradecimentos Especiais. ❤️
Buy Me A Coffee Sponsor on GitHub

Ou apoie via WeChat / Alipay / Afdian:

WeChat Pay
WeChat Pay
Alipay
Alipay
Nagi-ovo's Profile
Afdian
### 🎙️ Ferramenta Recomendada: Typeless Recomendo vivamente o **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**, uma ferramenta de voz para texto com IA que utilizei extensivamente durante o desenvolvimento do Voyager. Poupou-me imenso tempo e aumentou significativamente a minha produtividade. > 🎁 **[Registe-se através do meu link](https://www.typeless.com/?via=gemini-voyager)** (Código: _`gemini-voyager`_) para obter **5$ de créditos gratuitos**. ❤️ --- ## 🤝 Contribuição e Desenvolvimento [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) Damos as boas-vindas a contribuições! - **Issues**: Use os nossos templates de [relatório de erros](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/bug_report.md) ou [pedido de funcionalidade](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml). - **Pull Requests**: Consulte [CONTRIBUTING.md](./CONTRIBUTING.md). Obrigado por ajudar a tornar o Voyager melhor! ❤️ ### ❤️ Agradecimentos Especiais Um agradecimento especial a todos os colaboradores pelas suas contribuições ao Voyager ❤️ --- ## 🌟 Créditos - **[DeepSeek Voyager](https://github.com/Azurboy/deepseek-voyager)** - Um fork do Voyager adaptado para o DeepSeek. - **[claude-nexus](https://github.com/Qiuner/claude-nexus)** - Uma extensão de aprimoramento para Claude.ai inspirada no Voyager, com navegação por linha do tempo, gerenciamento de pastas, biblioteca de prompts e muito mais, com compatibilidade total de importação/exportação de prompts com o Voyager! - **[ChatGPT Conversation Timeline](https://github.com/Reborn14/chatgpt-conversation-timeline)** - A fonte original de inspiração para a navegação na linha do tempo. - **[Ophel Atlas](https://github.com/urzeye/ophel)** - Uma extensão de navegador que transforma conversas de IA em documentos organizados e pesquisáveis, com geração automática de esquemas, gestão de conversas e biblioteca de prompts, compatível com múltiplas plataformas de IA. ---
Star History Chart

Feito com ❤️ por Jesse Zhang

GPLv3 License © 2026
================================================ FILE: .github/README_RU.md ================================================
promotion

Сделайте ваш Gemini™ по-настоящему вашим ✨

Элегантная навигация по таймлайну, организация чатов по папкам и собственное хранилище промптов.
Это недостающий элемент для Google Gemini.

Chrome Edge Firefox Safari Opera Brave

GitHub stars GitHub forks Latest version GitHub downloads Chrome Web Store users Chrome Web Store rating Firefox Add-ons users Firefox Add-ons rating

Nagi-ovo%2Fgemini-voyager | Trendshift Gemini Voyager - All-in-one Gemini suite: folders, chat export and much more | Product Hunt

✨ Мы на Product Hunt! Будем рады вашим отзывам. ❤️

📖 ДокументацияEnglish简体中文繁體中文日本語FrançaisEspañolPortuguêsالعربية한국어

KOL Recommendation
🎉 Настоятельно рекомендуется ведущими технологическими лидерами мнений!

> [!IMPORTANT] > **Уведомление о переименовании**: В связи с проблемами товарных знаков и авторских прав это расширение официально переименовано в **Voyager**. Однако из-за крайне медленного процесса проверки Chrome Web Store обновление названия не было одобрено в течение 7 дней — расширение временно недоступно в Chrome Web Store. > [!NOTE] > Если Voyager вам полезен, поделитесь им в X, Reddit, YouTube и т.д. Каждый репост помогает большему числу людей узнать о проекте и улучшать опыт использования Gemini. Спасибо. --- ## 👋 Почему Voyager? Мы любим Gemini, но иногда хочется, чтобы в нем было чуть больше порядка. Именно поэтому мы создали **Voyager**. Это не просто инструмент, а помощник, который помогает организовать ваши диалоги с ИИ, сделать их доступными и продуктивными. Будь вы исследователем, ведущим десятки веток, разработчиком, сохраняющим фрагменты кода, или просто любителем порядка — Voyager создан для вас.

Try Voyager
Во время сбоя 18 февраля, когда приложение Google Gemini сделало исторические разговоры некоторых пользователей недоступными, пользователи Voyager по-прежнему могли видеть свои сохраненные разговоры в своих папках.

--- ## ✨ Возможности ### 🌌 Общие функции (Gemini & AI Studio) - **📂 [Организация по папкам](https://voyager.nagi.fun/ru/guide/folders)**: Группируйте чаты в двухуровневую иерархию папок с поддержкой **перетаскивания** и **синхронизации с Google Drive**. - **Gemini**: Поддержка **режима изоляции аккаунтов** и **пользовательских цветов папок**. - **💡 [Хранилище промптов](https://voyager.nagi.fun/ru/guide/prompts)**: Сохраняйте и повторно используйте лучшие промпты в Gemini, AI Studio и на [любых сайтах](https://voyager.nagi.fun/ru/guide/custom-websites). - **☁️ [Облачная синхронизация](https://voyager.nagi.fun/ru/guide/cloud-sync)**: Синхронизируйте папки и хранилище промптов с Google Drive. - **📐 Копирование формул**: Копирование исходного кода LaTeX и MathML (Word) в один клик. - **🌦️ Визуальные эффекты**: Добавьте сезонную атмосферу с **снегом**, **кинематографическим дождём** или **падающими лепестками сакуры** из панели настроек. ### ✨ Эксклюзивные функции Gemini - **📍 [Навигация по таймлайну](https://voyager.nagi.fun/ru/guide/timeline)**: Визуальные узлы для быстрого перехода между сообщениями, отметки важных моментов и управления ветками диалога. - **💾 [Экспорт чатов](https://voyager.nagi.fun/ru/guide/export)**: Сохраняйте диалоги в форматах JSON, Markdown или PDF вместе с изображениями. - **🧜‍♀️ [Рендеринг Mermaid](https://voyager.nagi.fun/ru/guide/mermaid)**: Автоматический рендеринг блок-схем, диаграмм последовательности и других графиков Mermaid. - **📝 [Исправление рендеринга Markdown](https://voyager.nagi.fun/ru/guide/markdown-fix)**: Автоматическое исправление синтаксиса жирного шрифта Markdown, нарушенного вставленными Gemini HTML-элементами. - **🍌 [NanoBanana](https://voyager.nagi.fun/ru/guide/nanobanana)**: Автоматическое удаление водяных знаков с изображений, созданных Gemini, без потери качества. - **🔬 [Deep Research](https://voyager.nagi.fun/ru/guide/deep-research)**: Извлечение цепочек рассуждений и ссылок из сессий Deep Research. - **🛠️ Инструменты продуктивности**: - **[Пакетное удаление](https://voyager.nagi.fun/ru/guide/batch-delete)**: Массовая очистка истории диалогов. - **[Ответ с цитированием](https://voyager.nagi.fun/ru/guide/quote-reply)**: Цитирование выделенного текста при ответе. - **[Синхронизация заголовка](https://voyager.nagi.fun/ru/guide/tab-title)**: Автоматическое обновление названия вкладки браузера. - **[Предотвращение автопрокрутки](https://voyager.nagi.fun/ru/guide/prevent-auto-scroll)**: Блокирует прыжок страницы при отправке сообщения. - **[Сворачивание ввода](https://voyager.nagi.fun/ru/guide/input-collapse)**: Сворачивание пустого поля ввода для увеличения области чтения. - **[Модель по умолчанию](https://voyager.nagi.fun/ru/guide/default-model)**: Установите вашу любимую модель по умолчанию. - **[Скрытие недавних элементов и Gems](https://voyager.nagi.fun/ru/guide/recents-hider)**: Скройте список «Недавние» на боковой панели, чтобы не отвлекаться. ### 🎨 Персонализация - Откройте всплывающее окно расширения и найдите **Визуальные эффекты**, чтобы переключаться между `Выключено`, `Снег`, `Сакура` и `Дождь`. - Эффекты отображаются как лёгкие полноэкранные наложения и не блокируют взаимодействие со страницей. - При переключении или отключении эффекта частицы плавно исчезают, а не пропадают мгновенно. --- ## 📥 Установка > ⚠️ Примечание: Prompt Manager — единственная функция, поддерживающая Gemini для предприятий.
Chrome Web Store    Microsoft Edge Add-ons    Firefox Add-ons    Safari Скачать

Версия для Chrome Web Store также работает в Edge, Opera, Brave, Vivaldi, Arc и других браузерах на базе Chromium.

> **Статус в магазинах:** Chrome ✅ · Firefox ✅ · Edge ✅ · Safari ✅ Для **ручной установки** или **сборки для разработки**, пожалуйста, обратитесь к [Руководству по установке](https://voyager.nagi.fun/ru/guide/installation). --- ## ☕ Поддержать проект
Если Voyager делает вашу жизнь проще, вы можете угостить меня кофе. Это помогает продолжать работу над обновлениями! Спонсоры будут отмечены в разделе благодарностей. ❤️
Buy Me A Coffee Sponsor on GitHub

Или через WeChat / Alipay / Afdian:

WeChat Pay
WeChat Pay
Alipay
Alipay
Nagi-ovo's Profile
Afdian
### 🎙️ Рекомендуемый инструмент: Typeless Я настоятельно рекомендую **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)** — инструмент для перевода голоса в текст с ИИ, который я активно использовал во время разработки Voyager. > 🎁 **[Присоединяйтесь по моей ссылке](https://www.typeless.com/?via=gemini-voyager)** (Код: _`gemini-voyager`_), чтобы получить **$5 бесплатных бонусов**. ❤️ --- ## 🤝 Участие в разработке [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) Мы приветствуем любую помощь! - **Issues**: Используйте наши шаблоны для [отчетов об ошибках](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/bug_report.md) или [предложений новых функций](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml). - **Pull Requests**: Ознакомьтесь с [CONTRIBUTING.md](./CONTRIBUTING.md). Спасибо, что помогаете делать Voyager лучше! ❤️ ### ❤️ Особая Благодарность Особая благодарность всем участникам за их вклад в Voyager ❤️ --- ## 🌟 Благодарности - **[DeepSeek Voyager](https://github.com/Azurboy/deepseek-voyager)** - Форк Voyager, адаптированный для DeepSeek. - **[claude-nexus](https://github.com/Qiuner/claude-nexus)** - Расширение для улучшения Claude.ai, вдохновлённое Voyager: навигация по таймлайну, управление папками, библиотека промптов и многое другое, с полной совместимостью импорта/экспорта промптов с Voyager! - **[ChatGPT Conversation Timeline](https://github.com/Reborn14/chatgpt-conversation-timeline)** - Оригинальное расширение с таймлайном для ChatGPT, вдохновившее этот проект. - **[Ophel Atlas](https://github.com/urzeye/ophel)** - Расширение браузера, которое превращает диалоги с ИИ в организованные и доступные для поиска документы с автоматическим созданием оглавлений, управлением диалогами и библиотекой промптов, поддерживающее несколько платформ ИИ. ---
Star History Chart

Сделано с ❤️ Jesse Zhang

GPLv3 License © 2026
================================================ FILE: .github/README_ZH.md ================================================
promotion

打造属于你的 Gemini™ 体验 ✨

优雅的时间轴导航、文件夹管理对话、构建专属提示词库。
这是 Google Gemini 缺失的那块拼图。

Chrome Edge Firefox Safari Opera Brave

GitHub Star GitHub Fork 最新版本 GitHub 下载量 Chrome 商店用户数 Chrome 商店评分 Firefox 商店用户数 Firefox 商店评分

Nagi-ovo%2Fgemini-voyager | Trendshift Gemini Voyager - All-in-one Gemini suite: folders, chat export and much more | Product Hunt

✨ 我们已在 Product Hunt 上线!欢迎来分享你的想法和反馈。❤️

📖 文档English繁體中文日本語FrançaisEspañolPortuguêsРусскийالعربية한국어

KOL Recommendation
🎉 感谢知名科技圈大 V 与社区的强烈推荐!

> [!IMPORTANT] > **改名公告**:由于商标版权问题,本插件已正式改名为 **Voyager**。但由于谷歌插件商店审核速度奇慢,七天内未能完成名称更新审核,暂时无法在 Chrome Web Store 使用。 > [!NOTE] > 如果 Voyager 帮到了你,欢迎分享到 X、即刻、小红书、Linux.do、V2EX 等等,也欢迎推荐给海外 KOL。每一次分享都能让更多人看到这个项目,从而改善 Gemini 的使用体验。谢谢。 --- ## 👋 为什么开发 Voyager? 我们都很喜欢 Gemini,但有时候总觉得它少了一点"秩序感"。 这就是我们开发 **Voyager** 的初衷。它不仅仅是一个工具,更是一个能帮你把 AI 对话变得井井有条、触手可及的得力助手。无论你是需要处理大量对话的研究人员,还是喜欢收藏代码片段的开发者,亦或是单纯的整理控,Voyager 都是为你准备的。

Try Voyager
在 2 月 18 号 Google Gemini App 导致部分用户历史对话无法访问的问题中,Voyager 的用户仍然能够在其文件夹中看到被保存下来的对话。

--- ## ✨ 功能特性 ### 🌌 通用核心 (Gemini & AI Studio) - **📂 [文件夹管理](https://voyager.nagi.fun/guide/folders)**: 支持 **多级目录**、**拖拽排序** 及 **Google Drive 同步**。 - **Gemini**: 支持 **多账号隔离模式** 及 **自定义文件夹颜色**。 - **💡 [提示词库](https://voyager.nagi.fun/guide/prompts)**: 跨平台同步提示词,支持 Gemini、AI Studio 及 [自定义网站](https://voyager.nagi.fun/guide/custom-websites)。 - **☁️ [云同步](https://voyager.nagi.fun/guide/cloud-sync)**: 支持将文件夹和提示词库同步到 Google Drive。 - **📐 公式复制**: 一键复制 LaTeX 和 MathML (Word) 源码。 - **🌦️ 视觉特效**: 在设置面板里一键切换 **飘雪**、**电影感雨滴** 或 **樱花飘落**,给页面增加季节氛围。 ### ✨ Gemini 专属增强 - **📍 [时间线导航](https://voyager.nagi.fun/guide/timeline)**: 可视化节点,瞬间跳转消息,星标重点,管理对话分支。 - **💾 [对话导出](https://voyager.nagi.fun/guide/export)**: 支持导出为 JSON、Markdown 或 PDF(含图片)。 - **🧜‍♀️ [Mermaid 渲染](https://voyager.nagi.fun/guide/mermaid)**: 自动渲染流程图、时序图等 Mermaid 图表。 - **📝 [Markdown 渲染修复](https://voyager.nagi.fun/guide/markdown-fix)**: 自动修复 Gemini 注入 HTML 导致的 Markdown 加粗失效问题。 - **🍌 [NanoBanana](https://voyager.nagi.fun/guide/nanobanana)**: 自动去除 Gemini 生成图片的无损水印。 - **🔬 [Deep Research](https://voyager.nagi.fun/guide/deep-research)**: 一键提取 Deep Research 对话的思考过程和研究链接。 - **🛠️ 效率工具**: - **[批量删除](https://voyager.nagi.fun/guide/batch-delete)**: 批量清理对话记录。 - **[引用回复](https://voyager.nagi.fun/guide/quote-reply)**: 选中对话文本即可一键引用回复。 - **[标签页标题同步](https://voyager.nagi.fun/guide/tab-title)**: 自动将标签页标题设为对话标题。 - **[防自动跳转](https://voyager.nagi.fun/guide/prevent-auto-scroll)**: 拦截每次发送新问题后页面强制滚动到底部的内置行为,找回丝滑体验。 - **[输入框折叠](https://voyager.nagi.fun/guide/input-collapse)**: 输入框自动收纳,释放阅读空间。 - **[默认模型](https://voyager.nagi.fun/guide/default-model)**: 为新对话设置默认选中的模型。 - **[隐藏最近项目](https://voyager.nagi.fun/guide/recents-hider)**: 隐藏侧边栏的“最近”列表,减少干扰。 - **隐藏升级提醒**: 自动隐藏 Gemini 侧边栏和模型切换菜单中的“升级到 Google AI Ultra”按钮(默认开启)。 ### 🎨 个性化体验 - 点击插件图标,在设置中的 **视觉特效** 里可切换 `关闭`、`飘雪`、`樱花`、`雨`。 - 特效以轻量全屏覆盖层呈现,不会阻挡页面交互。 - 切换特效或关闭时,粒子会自然退场,不会突兀消失。 --- ## 📥 安装方式 > ⚠️ 注意:提示词管理器是唯一支持 Gemini 企业版的功能。
Chrome 应用商店    Microsoft Edge Add-ons    Firefox Add-ons    Safari 下载

Chrome 应用商店同样适用于 Edge、Opera、Brave、Vivaldi、Arc 等 Chromium 浏览器。

> **商店状态:** Chrome ✅ · Firefox ✅ · Edge ✅ · Safari ✅ 关于 **手动安装** 或 **开发构建**,请参阅 [安装指南](https://voyager.nagi.fun/guide/installation)。 --- ## ☕ 支持本项目
如果 Voyager 提升了你的体验,欢迎请我喝杯咖啡。赞助者将被列入致谢名单。❤️
Buy Me A Coffee Sponsor on GitHub

或通过微信 / 支付宝 / 爱发电支持:

微信支付
微信支付
支付宝
支付宝
Nagi-ovo's Profile
爱发电
### 🎙️ 特别推荐: Typeless 我非常推荐 **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**,一款 AI 语音转文字工具。我在开发过程中一直在使用它,极大地提升了我的工作效率。 > 🎁 **[点击我的邀请链接](https://www.typeless.com/?via=gemini-voyager)**(邀请码 _`gemini-voyager`_)可获得 **5 美元免费额度**。这也是支持本项目的一种免费方式!❤️ --- ## 💬 交流与反馈
关注 X

关注动态
获取最新动态。
Discord

加入社区
与其他用户交流、分享提示词、获取帮助。
--- ## 🤝 参与贡献与开发 [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) 欢迎参与贡献! - **Issue**:使用 [Bug 报告](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/bug_report.yml) 或 [功能请求](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml) 模板。 - **Pull Request**:请查看 [贡献指南](./CONTRIBUTING.md)。
开发环境配置 ```bash # 安装依赖 (推荐 Bun) bun i # 开发模式 bun run dev:chrome bun run dev:firefox bun run dev:safari # 生产构建 bun run build:chrome bun run build:firefox bun run build:safari bun run build:all ``` **Safari 开发**:详见 [safari/README.md](../safari/README.md)。
感谢你让 Voyager 变得更好!❤️ ### ❤️ 特别感谢 特别感谢所有为 Voyager 做出贡献的贡献者们 ❤️ --- ## 🌟 致谢 - **[DeepSeek Voyager](https://github.com/Azurboy/deepseek-voyager)** - 为 DeepSeek 适配的 Fork 版本。 - **[claude-nexus](https://github.com/Qiuner/claude-nexus)** - 受 Voyager 启发的 Claude.ai 增强扩展,提供时间线导航、文件夹管理、提示词库等功能,并与 Voyager 的提示词导入/导出完全兼容! - **[ChatGPT Conversation Timeline](https://github.com/Reborn14/chatgpt-conversation-timeline)** - 本项目的灵感来源。 - **[Ophel Atlas](https://github.com/urzeye/ophel)** - 将 AI 对话转化为有组织、可搜索文档的浏览器扩展,支持自动生成大纲、对话管理和提示词库,兼容多个 AI 平台。 ---
Star History Chart

Made with ❤️ by Jesse Zhang

GPLv3 License © 2026
================================================ FILE: .github/README_ZH_TW.md ================================================
promotion

打造屬於你的 Gemini™ 體驗 ✨

優雅的時間軸導航、資料夾管理對話、構建專屬提示詞庫。
這是 Google Gemini 缺失的那塊拼圖。

Chrome Edge Firefox Safari Opera Brave

GitHub Star GitHub Fork 最新版本 GitHub 下載量 Chrome 商店用戶數 Chrome 商店評分 Firefox 商店用戶數 Firefox 商店評分

Nagi-ovo%2Fgemini-voyager | Trendshift Gemini Voyager - All-in-one Gemini suite: folders, chat export and much more | Product Hunt

✨ 我們已在 Product Hunt 上線!歡迎來分享你的想法和回饋。❤️

📖 文檔English简体中文日本語FrançaisEspañolPortuguêsРусскийالعربية한국어

KOL Recommendation
🎉 感謝知名科技圈大 V 與社區的強烈推薦!

> [!IMPORTANT] > **改名公告**:由於商標版權問題,本插件已正式改名為 **Voyager**。但由於 Chrome Web Store 審核速度極慢,七天內未能完成名稱更新審核,暫時無法在 Chrome Web Store 使用。 > [!NOTE] > 如果 Voyager 有幫助,歡迎分享到 X、Facebook、YouTube、Threads、Dcard 等等。每一次分享都能讓更多人看見這個專案,從而改善 Gemini 的使用體驗。謝謝。 --- ## 👋 為什麼開發 Voyager? 我們都很喜歡 Gemini,但有時候總覺得它少了一點"秩序感"。 這就是我們開發 **Voyager** 的初衷。它不僅僅是一個工具,更是一個能幫你把 AI 對話變得井井有條、觸手可及的得力助手。無論你是需要處理大量對話的研究人員,還是喜歡收藏代碼片段的開發者,亦或是單純的整理控,Voyager 都是為你準備的。

Try Voyager
在 2 月 18 號 Google Gemini App 導致部分用戶歷史對話無法訪問的問題中,Voyager 的用戶仍然能夠在其資料夾中看到被保存下來的對話。

--- ## ✨ 功能特性
teaser
查看完整功能,請訪問我們的 [官方文檔](https://voyager.nagi.fun/zh_TW)。 ### 🌌 通用核心 (Gemini & AI Studio) - **📂 [資料夾管理](https://voyager.nagi.fun/zh_TW/guide/folders)**: 支持 **多級目錄**、**拖拽排序** 及 **Google Drive 同步**。 - **Gemini**: 支持 **多帳號隔離模式** 及 **自定義資料夾顏色**。 - **💡 [提示詞庫](https://voyager.nagi.fun/zh_TW/guide/prompts)**: 跨平台同步提示詞,支持 Gemini、AI Studio 及 [自定義網站](https://voyager.nagi.fun/zh_TW/guide/custom-websites)。 - **☁️ [雲同步](https://voyager.nagi.fun/zh_TW/guide/cloud-sync)**: 支持將資料夾和提示詞庫同步到 Google Drive。 - **📐 公式複製**: 一鍵複製 LaTeX 和 MathML (Word) 源碼。 - **🌦️ 視覺特效**: 在設置面板中一鍵切換 **飄雪**、**電影感雨滴** 或 **櫻花飄落**,給頁面增添季節氛圍。 ### ✨ Gemini 專屬增強 - **📍 [時間線導航](https://voyager.nagi.fun/zh_TW/guide/timeline)**: 可視化節點,瞬間跳轉訊息,星標重點,管理對話分支。 - **💾 [對話導出](https://voyager.nagi.fun/zh_TW/guide/export)**: 支持導出為 JSON、Markdown 或 PDF(含圖片)。 - **🧜‍♀️ [Mermaid 圖表渲染](https://voyager.nagi.fun/zh_TW/guide/mermaid)**: 自動渲染流程圖、時序圖等 Mermaid 圖表。 - **📝 [Markdown 渲染修復](https://voyager.nagi.fun/zh_TW/guide/markdown-fix)**: 自動修復 Gemini 注入 HTML 導致的 Markdown 加粗失效問題。 - **🍌 [NanoBanana](https://voyager.nagi.fun/zh_TW/guide/nanobanana)**: 自動去除 Gemini 生成圖片的無損浮水印。 - **🔬 [Deep Research](https://voyager.nagi.fun/zh_TW/guide/deep-research)**: 一鍵提取 Deep Research 對話的思考過程和研究鏈接。 - **🛠️ 效率工具**: - **[批量刪除](https://voyager.nagi.fun/zh_TW/guide/batch-delete)**: 批量清理對話記錄。 - **[引用回覆](https://voyager.nagi.fun/zh_TW/guide/quote-reply)**: 選中對話文本即可一鍵引用回覆。 - **[標籤頁標題同步](https://voyager.nagi.fun/zh_TW/guide/tab-title)**: 自動將標籤頁標題設為對話標題。 - **[防自動跳轉](https://voyager.nagi.fun/zh_TW/guide/prevent-auto-scroll)**: 攔截每次發送新問題後頁面強制滾動到最底部的內建行為,找回絲滑體驗。 - **[輸入框摺疊](https://voyager.nagi.fun/zh_TW/guide/input-collapse)**: 輸入框自動收納,釋放閱讀空間。 - **[預設模型](https://voyager.nagi.fun/zh_TW/guide/default-model)**: 為新對話設置預設選中的模型。 - **[隱藏最近項目和 Gem](https://voyager.nagi.fun/zh_TW/guide/recents-hider)**: 隱藏側邊欄的”最近”列表,減少干擾。 ### 🎨 個性化體驗 - 點擊插件圖標,在設定中的 **視覺特效** 裡可切換 `關閉`、`飄雪`、`櫻花`、`雨`。 - 特效以輕量全螢幕覆蓋層呈現,不會阻擋頁面互動。 - 切換特效或關閉時,粒子會自然退場,不會突兀消失。 --- ## 📥 安裝方式 > ⚠️ 注意:提示詞管理器是唯一支持 Gemini 企業版的功能。
Chrome 應用商店    Microsoft Edge Add-ons    Firefox Add-ons    Safari 下載

Chrome 應用商店同樣適用於 Edge、Opera、Brave、Vivaldi、Arc 等 Chromium 瀏覽器。

> **商店狀態:** Chrome ✅ · Firefox ✅ · Edge ✅ · Safari ✅ 關於 **手動安裝** 或 **開發構建**,請參閱 [安裝指南](https://voyager.nagi.fun/zh_TW/guide/installation)。 --- ## ☕ 支持本項目
如果 Voyager 提升了你的體驗,歡迎請我喝杯咖啡。贊助者將被列入致謝名單。❤️
Buy Me A Coffee Sponsor on GitHub

或通過微信 / 支付寶 / 愛發電支持:

微信支付
微信支付
支付寶
支付寶
Nagi-ovo's Profile
愛發電
### 🎙️ 特別推薦: Typeless 我非常推薦 **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**,一款 AI 語音轉文字工具。我在開發過程中一直在使用它,極大地提升了我的工作效率。 > 🎁 **[點擊我的邀請鏈接](https://www.typeless.com/?via=gemini-voyager)**(邀請碼 _`gemini-voyager`_)可獲得 **5 美元免費額度**。這也是支持本項目的一種免費方式!❤️ --- ## 💬 交流與回饋
關注 X

關注動態
獲取最新動態。
Discord

加入社區
與其他用戶交流、分享提示詞、獲取幫助。
--- ## 🤝 參與貢獻與開發 [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) 歡迎參與貢獻! - **Issue**:使用 [Bug 報告](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/bug_report.yml) 或 [功能請求](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml) 模板。 - **Pull Request**:請查看 [貢獻指南](./CONTRIBUTING.md)。
開發環境配置 ```bash # 安裝依賴 (推薦 Bun) bun i # 開發模式 bun run dev:chrome bun run dev:firefox bun run dev:safari # 生產構建 bun run build:chrome bun run build:firefox bun run build:safari bun run build:all ``` **Safari 開發**:詳見 [safari/README.md](../safari/README.md)。
感謝你讓 Voyager 變得更好!❤️ ### ❤️ 特別感謝 特別感謝所有為 Voyager 做出貢獻的貢獻者們 ❤️ --- ## 🌟 致謝 - **[DeepSeek Voyager](https://github.com/Azurboy/deepseek-voyager)** - 為 DeepSeek 適配的 Fork 版本。 - **[claude-nexus](https://github.com/Qiuner/claude-nexus)** - 受 Voyager 啟發的 Claude.ai 增強擴充套件,提供時間軸導覽、資料夾管理、提示詞庫等功能,並與 Voyager 的提示詞匯入/匯出完全相容! - **[ChatGPT Conversation Timeline](https://github.com/Reborn14/chatgpt-conversation-timeline)** - 本項目的靈感來源。 - **[Ophel Atlas](https://github.com/urzeye/ophel)** - 將 AI 對話轉化為有組織、可搜尋文件的瀏覽器擴充功能,支援自動生成大綱、對話管理和提示詞庫,相容多個 AI 平台。 ---
Star History Chart

Made with ❤️ by Jesse Zhang

GPLv3 License © 2026
================================================ FILE: .github/RELEASE_TEMPLATE.md ================================================ ## ✨ What's New --- ## 🐛 Bug Fixes --- ## 📚 Documentation --- ## 📥 Installation Download the latest version for your browser: - **Chrome/Edge/Opera/Brave**: `gemini-voyager-chrome-{VERSION}.zip` - **Firefox**: `gemini-voyager-firefox-{VERSION}.zip` - **Safari**: `gemini-voyager-{VERSION}.dmg` See [README](https://github.com/Nagi-ovo/gemini-voyager#-installation) for installation instructions. --- **Full Changelog**: https://github.com/Nagi-ovo/gemini-voyager/compare/{PREV_VERSION}...{VERSION} ================================================ FILE: .github/docs/CHANGELOG.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ### Added - **Safari browser support** 🎉 - Safari build configuration and development mode - Installation guide ([EN](safari/INSTALLATION.md) | [中文](safari/INSTALLATION_ZH.md)) - Development guide ([EN](.../../../safari/README.md) | [中文](.../../../safari/README_ZH.md)) - New commands: `build:safari`, `dev:safari`, `build:all` - **Conversation export (Markdown/PDF)** - Rich Markdown export with formulas, code blocks, tables, lists, headings - Auto-package images: if a chat contains user-uploaded images, export a ZIP with `chat.md` and `assets/` (images rewritten to relative paths) - PDF export: inline images (best-effort) and print-optimized styles - Background service worker for cross-origin image fetch; added host permissions for Google image domains ### Changed - **Cross-browser compatibility** - Migrated to `browser.*` API via `webextension-polyfill` for better compatibility - All storage APIs now use async/await pattern - **Export robustness** - More resilient DOM extraction (supports Angular/custom elements; better selectors) - Reduced noisy logs; cleaner fallback paths - PDF images constrained (max-width ~60%) to avoid oversized visuals ### Fixed - **Dependencies** - Downgraded `marked` to v11 for compatibility - Upgraded `@typescript-eslint/eslint-plugin` to v8 - Resolved peer dependency conflicts - **Export correctness** - Fixed duplicate inclusion of code blocks/tables in Markdown - Fixed export button causing navigation back to `/app` on Gemini - Addressed missing assistant content by adding last-chance plaintext fallback - Avoid CORS failures for images in Markdown by packaging images into ZIP (with relative paths) ### Supported Browsers - **Chromium** (Chrome, Edge, Opera, Brave, Vivaldi, Arc) - **Gecko** (Firefox) - **WebKit** (Safari) ⭐ NEW ## [0.6.1] - Previous Release ### Features - Interactive conversation timeline - Folder management - Prompt library with search - Chat export to JSON - Cross-tab star sync - Markdown/KaTeX rendering - Multi-language (EN, 中文) --- ## Migration Notes ### Users - Chrome/Firefox: No changes needed - Safari: See [installation guide](.github/docs/safari/INSTALLATION.md) ### Developers - API changed from `chrome.*` to `browser.*` - Storage now uses Promises (async/await) - New Safari build commands available ================================================ FILE: .github/docs/IMPORT_EXPORT_GUIDE.md ================================================ # Folder Import/Export Guide ## Overview The folder configuration import/export feature allows you to sync folder configurations across devices without setting up a server. ## How to Use ### 📥 Export Folder Configuration (Download ⬇️) 1. Open Gemini chat page 2. Find the **download icon button** (downward arrow ⬇️) in the folder area 3. Click to download the configuration file (format: `gemini-voyager-folders-YYYYMMDD-HHMMSS.json`) ### 📤 Import Folder Configuration (Upload ⬆️) 1. Click the **upload icon button** (upward arrow ⬆️) in the folder area 2. Choose an import strategy: - **Merge Mode**: Keep existing folders, only add new ones (recommended) - **Overwrite Mode**: Completely replace existing configuration (creates backup) 3. Select a previously exported JSON file 4. Click "Import" to confirm ## Import Strategies ### Merge Mode - ✅ Keeps all existing folders and conversations - ✅ Only adds new folders and conversations - ✅ Automatically skips duplicates (by ID) - 💡 Best for: Importing partial configurations from other devices ### Overwrite Mode - ⚠️ Deletes all existing folders - ✅ Completely uses imported configuration - 🔒 Automatically creates backup (stored in sessionStorage) - 💡 Best for: Full sync to a new device ## 🔄 Backup & Recovery ### Backup Information - **Auto Backup**: Automatically created during overwrite import - **Storage Location**: Browser sessionStorage (temporary storage) - **Validity**: Valid until current tab is closed - **Size Limit**: Usually 5-10MB ### How to Restore Backup (Console Operation) If you encounter issues after import, you can restore the backup while the tab is still open: ```javascript // 1. Open browser console (F12) // 2. Check if backup exists const hasBackup = sessionStorage.getItem('gvFolderBackup'); console.log('Backup exists:', hasBackup !== null); // 3. View backup time const backupTime = sessionStorage.getItem('gvFolderBackupTimestamp'); console.log('Backup time:', backupTime); // 4. Restore backup const backup = JSON.parse(sessionStorage.getItem('gvFolderBackup')); localStorage.setItem('gvFolderData', JSON.stringify(backup)); // 5. Refresh page location.reload(); ``` ### Clear Backup ```javascript sessionStorage.removeItem('gvFolderBackup'); sessionStorage.removeItem('gvFolderBackupTimestamp'); ``` ## Export File Format ```json { "format": "gemini-voyager.folders.v1", "exportedAt": "2025-01-15T10:30:00.000Z", "version": "0.7.2", "data": { "folders": [ { "id": "folder-xxx", "name": "My Folder", "parentId": null, "isExpanded": true, "createdAt": 1736935800000, "updatedAt": 1736935800000 } ], "folderContents": { "folder-xxx": [ { "conversationId": "conv-yyy", "title": "Conversation Title", "url": "https://gemini.google.com/app/...", "addedAt": 1736935800000 } ] } } } ``` ## Data Security - ✅ **Local Storage**: All data is stored locally only, not uploaded to any server - ✅ **Format Validation**: Strict data format validation during import to prevent corruption - ✅ **Auto Backup**: Automatic backup before overwrite operations - ✅ **Version Control**: Files include version numbers for future compatibility ## FAQ ### Q: Where is the backup stored? A: Stored in the browser's `sessionStorage`, only valid for the current tab, automatically cleared when the tab is closed. ### Q: Why can't I see the backup file? A: The backup is temporarily stored in memory and does not generate a file. For permanent storage, use the export feature. ### Q: Can it sync automatically? A: Currently requires manual export/import. Automatic sync would require cloud service support, which is not provided to protect privacy. ### Q: What if the configuration is wrong after import? A: If the tab is still open, you can restore the backup through the console (see instructions above). ### Q: Does it support cross-browser sync? A: Yes! Simply export from one browser and import to another. ## Best Practices 1. **Regular Exports**: Make it a habit to export configurations regularly 2. **Cloud Backup**: Save exported JSON files to cloud storage 3. **Test Import**: Test with merge mode first on new devices 4. **Keep Backups**: Export a backup before important operations 5. **Version Management**: Save multiple versions for different configuration states ## Technical Details - **Format Version**: `gemini-voyager.folders.v1` - **Deduplication Strategy**: Deduplicate by `id` and `conversationId` - **File Encoding**: UTF-8 - **Max File Size**: Theoretically unlimited (limited by browser memory) - **Compatibility**: Chrome 88+, Firefox 85+, Safari 14+ ## Feedback & Support For issues or suggestions, please visit: https://github.com/Nagi-ovo/gemini-voyager/issues/36 ================================================ FILE: .github/docs/IMPORT_EXPORT_GUIDE_ZH.md ================================================ # 文件夹导出/导入功能使用指南 ## 功能概述 文件夹配置导出/导入功能允许您在不同设备间同步文件夹配置,无需搭建服务器。 ## 使用方法 ### 📥 导出文件夹配置(下载 ⬇️) 1. 打开 Gemini 聊天页面 2. 在文件夹区域找到**下载图标按钮**(向下箭头 ⬇️) 3. 点击即可下载配置文件(格式:`gemini-voyager-folders-YYYYMMDD-HHMMSS.json`) ### 📤 导入文件夹配置(上传 ⬆️) 1. 点击文件夹区域的**上传图标按钮**(向上箭头 ⬆️) 2. 选择导入策略: - **合并模式**:保留现有文件夹,只添加新的(推荐) - **覆盖模式**:完全替换现有配置(会创建备份) 3. 选择之前导出的 JSON 文件 4. 点击"导入"按钮确认 ## 导入策略说明 ### 合并模式 (Merge) - ✅ 保留所有现有文件夹和对话 - ✅ 只添加新的文件夹和对话 - ✅ 自动跳过重复项(按 ID 判断) - 💡 适合:从其他设备导入部分配置 ### 覆盖模式 (Overwrite) - ⚠️ 删除所有现有文件夹 - ✅ 完全使用导入的配置 - 🔒 自动创建备份(存储在 sessionStorage) - 💡 适合:完全同步到新设备 ## 🔄 备份与恢复 ### 备份说明 - **自动备份**:覆盖导入时自动创建 - **存储位置**:浏览器 sessionStorage(临时存储) - **有效期**:当前标签页关闭前有效 - **大小限制**:通常为 5-10MB ### 如何恢复备份(控制台操作) 如果导入后发现问题,可以在当前标签页未关闭的情况下恢复备份: ```javascript // 1. 打开浏览器控制台 (F12) // 2. 检查是否有备份 const hasBackup = sessionStorage.getItem('gvFolderBackup'); console.log('备份存在:', hasBackup !== null); // 3. 查看备份时间 const backupTime = sessionStorage.getItem('gvFolderBackupTimestamp'); console.log('备份时间:', backupTime); // 4. 恢复备份 const backup = JSON.parse(sessionStorage.getItem('gvFolderBackup')); localStorage.setItem('gvFolderData', JSON.stringify(backup)); // 5. 刷新页面 location.reload(); ``` ### 清除备份 ```javascript sessionStorage.removeItem('gvFolderBackup'); sessionStorage.removeItem('gvFolderBackupTimestamp'); ``` ## 导出文件格式 ```json { "format": "gemini-voyager.folders.v1", "exportedAt": "2025-01-15T10:30:00.000Z", "version": "0.7.2", "data": { "folders": [ { "id": "folder-xxx", "name": "我的文件夹", "parentId": null, "isExpanded": true, "createdAt": 1736935800000, "updatedAt": 1736935800000 } ], "folderContents": { "folder-xxx": [ { "conversationId": "conv-yyy", "title": "对话标题", "url": "https://gemini.google.com/app/...", "addedAt": 1736935800000 } ] } } } ``` ## 数据安全 - ✅ **本地存储**:所有数据仅存储在本地,不上传到任何服务器 - ✅ **格式验证**:导入时严格验证数据格式,防止损坏 - ✅ **自动备份**:覆盖操作前自动备份 - ✅ **版本控制**:文件包含版本号,便于未来兼容 ## 常见问题 ### Q: 备份存储在哪里? A: 存储在浏览器的 `sessionStorage` 中,仅在当前标签页有效,关闭标签页后自动清除。 ### Q: 为什么看不到备份文件? A: 备份是临时存储在内存中的,不会生成文件。如需永久保存,请使用导出功能。 ### Q: 可以自动同步吗? A: 目前需要手动导出/导入。自动同步需要云服务支持,暂不提供以保护隐私。 ### Q: 导入后发现配置不对怎么办? A: 如果标签页未关闭,可以通过控制台恢复备份(参见上方说明)。 ### Q: 支持跨浏览器同步吗? A: 支持!只需在一个浏览器导出,在另一个浏览器导入即可。 ## 最佳实践 1. **定期导出**:养成定期导出配置的习惯 2. **云盘备份**:将导出的 JSON 文件保存到云盘 3. **测试导入**:在新设备先用合并模式测试 4. **保留备份**:重要操作前先导出一份备份 5. **版本管理**:可以为不同配置状态保存多个版本 ## 技术细节 - **格式版本**: `gemini-voyager.folders.v1` - **去重策略**: 按 `id` 和 `conversationId` 去重 - **文件编码**: UTF-8 - **最大文件大小**: 理论无限制(受浏览器内存限制) - **兼容性**: Chrome 88+, Firefox 85+, Safari 14+ ## 反馈与支持 如有问题或建议,请访问: https://github.com/Nagi-ovo/gemini-voyager/issues/36 ================================================ FILE: .github/docs/safari/INSTALLATION.md ================================================ # Safari Extension Installation Guide English | [简体中文](INSTALLATION_ZH.md) A simple guide for installing Voyager on Safari. ## Requirements - **macOS 11+** - **Safari 14+** ## Installation Steps ### 1. Download Get the latest `gemini-voyager-X.Y.Z.dmg` from [GitHub Releases](https://github.com/Nagi-ovo/gemini-voyager/releases). ### 2. Install Double-click the `.dmg` file and follow the prompts to install the application. ### 3. Enable in Safari 1. Open **Safari → Settings** (or Preferences) 2. Go to **Extensions** tab 3. Check **Voyager** to enable 4. Visit [Gemini](https://gemini.google.com) to test Done! 🎉 ## Troubleshooting ### Safari doesn't show the extension 1. Safari → Settings → Advanced → Enable "Show Develop menu" 2. Develop → Allow Unsigned Extensions 3. Restart Safari ## For Developers Want to build from source or contribute? See the [Safari Development Guide](../../../safari/README.md) for: - Building from source - Development workflow - Adding Swift native code - Advanced debugging ## Uninstall 1. Safari → Settings → Extensions → Uncheck Voyager 2. Delete the app from Applications folder --- **Need help?** Open an issue on [GitHub](https://github.com/Nagi-ovo/gemini-voyager/issues) ================================================ FILE: .github/docs/safari/INSTALLATION_ZH.md ================================================ # Safari 扩展安装指南 [English](INSTALLATION.md) | 简体中文 在 Safari 上安装 Voyager 的简单指南。 ## 系统要求 - **macOS 11+** - **Safari 14+** ## 安装步骤 ### 1. 下载 从 [GitHub Releases](https://github.com/Nagi-ovo/gemini-voyager/releases) 下载最新的 `gemini-voyager-X.Y.Z.dmg`。 ### 2. 安装 双击打开 `.dmg` 文件并按提示安装应用。 ### 3. 在 Safari 中启用 1. 打开 **Safari → 设置**(或偏好设置) 2. 前往 **扩展** 标签页 3. 勾选 **Voyager** 启用 4. 访问 [Gemini](https://gemini.google.com) 测试 完成!🎉 ## 常见问题 ### Safari 中看不到扩展 1. Safari → 设置 → 高级 → 勾选"在菜单栏中显示'开发'菜单" 2. 开发 → 允许未签名的扩展 3. 重启 Safari ## 开发者 想从源代码构建或参与开发?查看 [Safari 开发指南](../../../safari/README_ZH.md) 了解: - 从源代码构建 - 开发工作流 - 添加 Swift 原生代码 - 高级调试 ## 卸载 1. Safari → 设置 → 扩展 → 取消勾选 Voyager 2. 从应用程序文件夹删除该应用 --- **需要帮助?** 在 [GitHub](https://github.com/Nagi-ovo/gemini-voyager/issues) 提交 Issue ================================================ FILE: .github/pull_request_template.md ================================================ ### 🚫 AI Policy / AI 政策 - **We explicitly reject AI-generated PRs that have not been manually verified.** - **本项目拒绝接受任何未经人工复核的 AI 生成的 PR。** - Low-quality AI PRs will be closed immediately. / 低质量的 AI PR 会被直接关闭。 - You must understand and take responsibility for every line of code you submit. / 你必须理解并对你提交的每一行代码负责。 - **Workflow Proficiency / 协作能力**: Ensure you are familiar with GitHub/Git workflows and maintain a clean Git history. Please learn the basics first if needed to avoid messy PR history. / 请确保你熟悉 GitHub/Git 工作流并保持 Git 历史整洁。如有必要请先学习相关知识,避免 PR 历史过于混乱。 --- ### Description / 描述 ### Related Issue / 相关 Issue ### Visual Proof / 可视化证据 ### Browser Testing / 浏览器测试 - [ ] **Chrome / Edge (Chromium)**: Tested / 已测试 - [ ] **Firefox**: Tested (Mandatory) / 已测试(必填) - [ ] **Safari**: Tested (Optional) or labeled as unsupported / 已测试(可选)或已标注为不支持 ### Checklist / 检查清单 - [ ] I have manually verified that the feature works as intended. / 我已手动验证功能按预期工作。 - [ ] I have confirmed that this PR does not break existing functionality. / 我已确认此 PR 不会破坏原有功能。 - [ ] I have run `bun run lint`, `bun run typecheck`, `bun run format` and `bun run build`. / 我已运行代码校验、类型检查、格式化及构建。 - [ ] I have added/updated necessary tests and they pass (`bun run test`). / 我已添加/更新了必要的测试并确保通过(`bun run test`)。 ================================================ FILE: .github/workflows/ci.yml ================================================ name: CI on: push: branches: [main] pull_request: branches: [main] jobs: build-and-check: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Install bun uses: oven-sh/setup-bun@v2 - name: Setup Node uses: actions/setup-node@v4 with: node-version: '20' - name: Install run: bun i - name: Check Formatting run: bun x prettier --check . - name: Lint run: bun run lint - name: Typecheck run: bun run typecheck - name: Test run: bun run test - name: Build (Chrome) run: bun run build:chrome - name: Build (Firefox) run: bun run build:firefox - name: Build (Safari) run: bun run build:safari ================================================ FILE: .github/workflows/deploy-docs.yml ================================================ name: Deploy Docs on: push: branches: - main paths: - 'docs/**' - '.vitepress/**' - 'package.json' - 'package-lock.json' - 'bun.lock' - 'CNAME' workflow_dispatch: permissions: contents: read pages: write id-token: write concurrency: group: pages cancel-in-progress: false jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Bun uses: oven-sh/setup-bun@v1 with: bun-version: latest - name: Install dependencies run: bun install - name: Build docs run: bun run docs:build - name: Copy CNAME to dist run: cp CNAME docs/.vitepress/dist/CNAME - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: docs/.vitepress/dist deploy: needs: build runs-on: ubuntu-latest name: Deploy steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 ================================================ FILE: .github/workflows/issue-claim.yml ================================================ name: Issue Claim on: issue_comment: types: [created] jobs: claim-issue: runs-on: ubuntu-latest if: github.event.issue.pull_request == null && contains(github.event.comment.body, '/claim') permissions: issues: write steps: - name: Check if issue is already assigned id: check uses: actions/github-script@v7 with: script: | const issue = context.payload.issue; const commenter = context.payload.comment.user.login; // Check if already assigned if (issue.assignees && issue.assignees.length > 0) { const assigneeNames = issue.assignees.map(a => a.login).join(', '); await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, body: `❌ This issue is already assigned to: **${assigneeNames}**\n\nIf you'd like to work on this issue, please coordinate with the current assignee(s) or ask a maintainer to reassign.` }); return; } // Assign the commenter try { await github.rest.issues.addAssignees({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, assignees: [commenter] }); // Add "claimed" label if it exists try { await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, labels: ['👷 Claimed'] }); } catch (labelError) { // Label doesn't exist, skip console.log('Claimed label not found, skipping...'); } await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, body: `🎉 **@${commenter}** has claimed this issue!\n\nThank you for your contribution! Here are some tips:\n- Please read our [Contributing Guide](https://github.com/${context.repo.owner}/${context.repo.repo}/blob/main/.github/CONTRIBUTING.md)\n- Feel free to ask questions if you need help\n- When you're ready, submit a PR and reference this issue\n\nIf you're no longer able to work on this, please comment \`/unclaim\` so others can pick it up.` }); } catch (error) { await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, body: `❌ Failed to assign **@${commenter}** to this issue. This may happen if the user doesn't have permission to be assigned.\n\nMaintainers: Please manually assign if appropriate.` }); } unclaim-issue: runs-on: ubuntu-latest if: github.event.issue.pull_request == null && contains(github.event.comment.body, '/unclaim') permissions: issues: write steps: - name: Unclaim issue uses: actions/github-script@v7 with: script: | const issue = context.payload.issue; const commenter = context.payload.comment.user.login; // Check if commenter is assigned const isAssigned = issue.assignees && issue.assignees.some(a => a.login === commenter); if (!isAssigned) { await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, body: `❌ **@${commenter}** is not currently assigned to this issue.` }); return; } // Remove assignment await github.rest.issues.removeAssignees({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, assignees: [commenter] }); // Remove "claimed" label if present try { await github.rest.issues.removeLabel({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, name: '👷 Claimed' }); } catch (labelError) { // Label not present, skip } await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, body: `👋 **@${commenter}** has unclaimed this issue. It's now available for others to work on!\n\nIf you'd like to claim this issue, comment \`/claim\`.` }); ================================================ FILE: .github/workflows/issue-validator.yml ================================================ name: Issue Validator on: issues: types: [opened, edited] jobs: validate: runs-on: ubuntu-latest permissions: issues: write steps: - name: Validate Issue Quality uses: actions/github-script@v7 with: script: | const issue = context.payload.issue; const body = issue.body || ''; // --- Configuration --- const MIN_STEPS_LENGTH = 10; const PLACEHOLDER_VERSION = '1.1.3'; const PLACEHOLDER_STEPS_PART = "Go to '...'"; // Part of the default template text // --- Parsing Logic --- // Helper to extract content between markdown headers function extractSection(text, headerPattern) { const match = text.match(new RegExp(`${headerPattern}\\s+([\\s\\S]*?)(?=\\n###|$)`)); return match ? match[1].trim() : ''; } // Extract fields based on ISSUE_TEMPLATE/bug_report.yml labels const version = extractSection(body, '### 📦 扩展版本 \\| Extension Version'); const steps = extractSection(body, '### 📷 复现步骤 \\| Recurrence Steps'); const os = extractSection(body, '### 💻 系统环境 \\| Operating System'); const browser = extractSection(body, '### 🌐 浏览器 \\| Browser'); // --- Validation Logic --- let failureReason = ''; // 0. Skip validation if it's not a bug report (missing version field) const isBugReport = !!body.match(/### 📦 扩展版本 \| Extension Version/); if (isBugReport) { // 1. Check Version if (!version || version === PLACEHOLDER_VERSION) { failureReason = 'Missing or default extension version.'; } // 2. Check Steps else if (!steps || steps.length < MIN_STEPS_LENGTH) { failureReason = 'Reproduction steps are too short (less than 10 characters).'; } else if (steps.includes(PLACEHOLDER_STEPS_PART)) { failureReason = 'Reproduction steps contain default template text.'; } } // --- Action --- if (failureReason) { console.log(`Closing issue #${issue.number}: ${failureReason}`); // 1. Close the issue await github.rest.issues.update({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, state: 'closed' }); // 2. Add 'invalid' label await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, labels: ['invalid'] }); // 3. Post strict comment const comment = ` ❌ **Issue Closed: Low Quality Report** This issue has been automatically closed because it lacks necessary information or uses default template text. Reason: **${failureReason}** To reopen, please edit your issue to provide: 1. The exact **Extension Version** you are using. 2. Clear, detailed **Reproduction Steps** (do not use the "Go to..." template text). > *This looks like a low quality issue report.* `; await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, body: comment }); } ================================================ FILE: .github/workflows/release.yml ================================================ name: Release run-name: > ${{ (github.event_name == 'workflow_dispatch' && inputs.version && format('chore(release): v{0}', inputs.version)) || (github.event_name == 'workflow_dispatch' && !inputs.version && 'chore(release): auto-increment') || (startsWith(github.ref, 'refs/tags/') && format('Release {0}', github.ref_name)) || format('Release #{0}', github.run_number) }} # 🚀 Release Workflow Guide # ------------------------- # This workflow supports two modes of operation: # # 1. Manual Release (Recommended for "One-Click" Releases) # - How: Go to "Actions" -> "Release" -> "Run workflow". # - Input: Optional "Version" (e.g., 1.2.0). If left empty, it auto-increments the patch version. # - What it does: # 1. Calculates the next version. # 2. Bumps version in package.json & manifest.json. # 3. Commits "chore(release): vX.Y.Z". # 4. Creates git tag "vX.Y.Z". # 5. Pushes commit & tag to main. # 6. Builds artifacts and creates a GitHub Release. # # 2. Tag-based Release (Manual Tagging) # - How: run `git commit -m "..." && git tag v1.2.0 && git push origin v1.2.0` locally. # - What it does: # 1. Detects the pushed tag (v1.2.0). # 2. SKIPS version calculation and bumping (assumes you already did it). # 3. Builds artifacts from that tag. # 4. Creates a GitHub Release for that tag. on: push: tags: - 'v*' workflow_dispatch: inputs: version: description: 'Version to release (e.g. 1.0.8) - leave empty to auto-increment patch version' required: false type: string notes: description: 'Release notes (optional)' required: false type: string permissions: contents: write jobs: # Job 1: Calculate & Bump Version (Only runs on manual trigger) bump-version: if: github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest outputs: new_version: ${{ steps.next_version.outputs.version }} tag_name: ${{ steps.tag.outputs.name }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Node uses: actions/setup-node@v4 with: node-version: '20' - name: Calculate next version id: next_version run: | if [ -n "${{ inputs.version }}" ]; then echo "version=${{ inputs.version }}" >> $GITHUB_OUTPUT echo "Using manual version: ${{ inputs.version }}" else CURRENT=$(node -e "console.log(require('./package.json').version)") echo "Current version: ${CURRENT}" IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT" PATCH=$((PATCH + 1)) # Simple carry logic if [ $PATCH -ge 10 ]; then MINOR=$((MINOR + 1)) PATCH=0 fi if [ $MINOR -ge 10 ]; then MAJOR=$((MAJOR + 1)) MINOR=0 fi NEXT="${MAJOR}.${MINOR}.${PATCH}" echo "version=${NEXT}" >> $GITHUB_OUTPUT echo "Auto-calculated next version: ${NEXT}" fi - name: Compute tag name id: tag run: echo "name=v${{ steps.next_version.outputs.version }}" >> $GITHUB_OUTPUT - name: Update files, commit and push env: VERSION: ${{ steps.next_version.outputs.version }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | echo "Bumping to version ${VERSION}" # Update package.json and manifest.json node -e "const fs=require('fs');const v=process.env.VERSION;const p=JSON.parse(fs.readFileSync('package.json','utf8'));p.version=v;fs.writeFileSync('package.json',JSON.stringify(p,null,2)+'\n');const m=JSON.parse(fs.readFileSync('manifest.json','utf8'));m.version=v;fs.writeFileSync('manifest.json',JSON.stringify(m,null,2)+'\n');" git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git add package.json manifest.json git commit -m "chore(release): v${VERSION}" || echo "No changes to commit" git tag v${VERSION} || echo "Tag exists" # Push commit and tag git push origin HEAD:main --tags # Job 2: Build & Release (Runs on both manual and tag push) build-and-release: needs: bump-version if: always() && (needs.bump-version.result == 'success' || github.event_name == 'push') runs-on: ubuntu-latest steps: - name: Set Release Tag Variable id: vars run: | if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then echo "tag_name=${{ needs.bump-version.outputs.tag_name }}" >> $GITHUB_OUTPUT else echo "tag_name=${{ github.ref_name }}" >> $GITHUB_OUTPUT fi - name: Checkout uses: actions/checkout@v4 with: ref: ${{ steps.vars.outputs.tag_name }} fetch-depth: 0 - name: Setup Bun uses: oven-sh/setup-bun@v2 with: bun-version: 'latest' - name: Install deps run: bun i - name: Build All run: bun run build:all - name: Archive artifacts run: | TAG=${{ steps.vars.outputs.tag_name }} cd dist_chrome && zip -r ../voyager-chrome-${TAG}.zip . && cd .. - name: Build Edge artifact run: bun run build:edge - name: Publish to Microsoft Edge Add-ons continue-on-error: true uses: wdzeng/edge-addon@v2 with: product-id: ${{ secrets.EDGE_PRODUCT_ID }} zip-path: voyager-edge-${{ steps.vars.outputs.tag_name }}.zip api-key: ${{ secrets.EDGE_API_KEY }} client-id: ${{ secrets.EDGE_CLIENT_ID }} - name: Sign Firefox Extension and Submit to AMO run: | TAG=${{ steps.vars.outputs.tag_name }} npx web-ext sign \ --source-dir=dist_firefox \ --api-key=${{ secrets.AMO_JWT_ISSUER }} \ --api-secret=${{ secrets.AMO_JWT_SECRET }} \ --channel=listed # Move signed XPI to root with proper naming mv web-ext-artifacts/*.xpi voyager-firefox-${TAG}.xpi - name: Prepare Release Notes id: release_body env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | TAG=${{ steps.vars.outputs.tag_name }} NOTES="${{ inputs.notes }}" if [ -n "$NOTES" ]; then echo "body<> $GITHUB_OUTPUT echo "$NOTES" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT else # Get the previous tag for auto-generated notes PREV_TAG=$(git describe --tags --abbrev=0 "${TAG}^" 2>/dev/null || echo "") # Generate release notes via GitHub API AUTO_NOTES="" if [ -n "$PREV_TAG" ]; then AUTO_NOTES=$(gh api repos/${{ github.repository }}/releases/generate-notes \ -f tag_name="${TAG}" \ -f target_commitish="main" \ -f previous_tag_name="${PREV_TAG}" \ --jq '.body' 2>/dev/null || echo "") fi cat > release_body.md << 'INSTALL_EOF' ## 📥 Installation
Chrome Web Store    Microsoft Edge Add-ons    Firefox Add-ons
INSTALL_EOF # Append version-specific file names cat >> release_body.md << EOF - **Chrome**: \`voyager-chrome-${TAG}.zip\` - **Firefox**: \`voyager-firefox-${TAG}.xpi\` - **Safari**: \`voyager-${TAG}.dmg\` ### 🍎 Safari 安装与限制 (Safari Installation & Limitations) - **安装 (Installation)**: 下载并打开 \`voyager-${TAG}.dmg\`,按提示安装应用。 Download and open \`voyager-${TAG}.dmg\`, then follow the prompts to install the app. - **限制 (Limitations)**: 受限于 Safari 特性,以下功能暂不支持:(a) Nano Banana 水印去除 (b) 图片导出 (建议使用 PDF 导出) (c) Google Drive 云同步。 Due to Safari's nature, the following features are not supported: (a) Watermark removal (b) Image export (PDF recommended) (c) Cloud sync with Google Drive. EOF # Combine: auto-generated notes first, then installation echo "body<> $GITHUB_OUTPUT if [ -n "$AUTO_NOTES" ]; then echo "$AUTO_NOTES" >> $GITHUB_OUTPUT echo "" >> $GITHUB_OUTPUT fi cat release_body.md >> $GITHUB_OUTPUT echo "BODY_EOF" >> $GITHUB_OUTPUT fi - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: name: Voyager ${{ steps.vars.outputs.tag_name }} tag_name: ${{ steps.vars.outputs.tag_name }} files: | voyager-chrome-*.zip voyager-firefox-*.xpi voyager-*.dmg body: ${{ steps.release_body.outputs.body }} ================================================ FILE: .github/workflows/sponsors.yml ================================================ name: Update Sponsors on: workflow_dispatch: push: branches: - main paths: - 'sponsorkit/sponsors.json' jobs: update-sponsors: runs-on: ubuntu-latest permissions: contents: write steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - name: Generate sponsors SVG run: node scripts/generate-sponsors.cjs env: GITHUB_TOKEN: ${{ secrets.SPONSORKIT_GITHUB_TOKEN }} AFDIAN_USER_ID: ${{ secrets.AFDIAN_USER_ID }} AFDIAN_TOKEN: ${{ secrets.AFDIAN_TOKEN }} - name: Commit changes uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: 'chore: update sponsors.svg' file_pattern: 'docs/public/assets/sponsors.*' ================================================ FILE: .github/workflows/stale.yml ================================================ name: 'Close Stale Issues' on: schedule: - cron: '30 1 * * *' workflow_dispatch: permissions: issues: write pull-requests: write jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@v9 with: stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.' stale-pr-message: 'This pull request has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.' days-before-stale: 7 days-before-close: 14 stale-issue-label: 'stale' stale-pr-label: 'stale' ================================================ FILE: .gitignore ================================================ node_modules/ /dist_chrome/ /dist_firefox/ /dist_safari/ gemini-voyager-edge-*.zip # Vitest coverage/ .vitest/ # Generated Xcode projects (users generate these locally) /Gemini Voyager/ *.xcodeproj/xcuserdata/ *.xcworkspace/xcuserdata/ DerivedData/ safari/Models/Gemini* .git-commit-message.txt package-lock.json npm-debug.log* yarn-debug.log* yarn-error.log* .vscode/ .idea/ .claude/settings.local.json .claude/worktrees/ .DS_Store *.local .env* *.mov *.mp4 !docs/public/assets/*.mov !docs/public/assets/*.mp4 *.xpi *.srt # VitePress docs/.vitepress/dist docs/.vitepress/cache # Sync Service (Commercial - Private) SYNC_SERVICE_ARCHITECTURE.md .env.sync .chrome-dev-data/ # Dev Tools scripts/chrome-profile/ # Git worktrees (local dev only) .worktrees/ # Local agent outputs .agent/ docs/plans/ output/ src/pages/content/printBridge/ gemini-voyager-formal/ ================================================ FILE: .prettierignore ================================================ # Sync project gemini-voyager-sync/ # Build outputs dist_chrome/ dist_firefox/ dist_safari/ dist/ # Dependencies node_modules/ # Lock files bun.lockb package-lock.json pnpm-lock.yaml # VitePress .vitepress/dist .vitepress/cache # Coverage coverage/ # Safari Xcode project (Apple-generated files) Gemini Voyager/ safari/ # Firefox signed extension output web-ext-artifacts/ # Auto-generated data sponsorkit/ # Claude Code internals .entire/ .claude/ CLAUDE.md # Changelog notes (hand-written, not auto-formatted) src/pages/content/changelog/notes/ # System & Misc .DS_Store *.zip gemini-voyager-formal/ ================================================ FILE: .prettierrc ================================================ { "semi": true, "singleQuote": true, "tabWidth": 2, "useTabs": false, "printWidth": 100, "trailingComma": "all", "endOfLine": "lf", "plugins": ["@trivago/prettier-plugin-sort-imports", "prettier-plugin-tailwindcss"], "importOrder": [ "^react", "", "^@core/(.*)$", "^@features/(.*)$", "^@components/(.*)$", "^@pages/(.*)$", "^@assets/(.*)$", "^@locales/(.*)$", "^@/(.*)$", "^[./]" ], "importOrderSeparation": true, "importOrderSortSpecifiers": true } ================================================ FILE: CLAUDE.md ================================================ # CLAUDE.md - Gemini Voyager ## Commands ```bash bun install # Setup bun run dev:chrome # Dev (also: dev:firefox, dev:safari) bun run build:chrome # Build (also: build:firefox, build:safari, build:edge, build:all) bun run test # Test (also: test:watch, test:ui, test:coverage) bun run typecheck # Type check bun run lint # Lint bun run format # Format bun run bump # Version bump (patch) bun run docs:dev # Docs dev server ``` ## Core Rules 1. **No `any` type.** Use `unknown` + narrowing. Use Branded Types for IDs. 2. **No direct `chrome.storage` in UI components.** Use `StorageService`. Content scripts (`src/pages/content/`) are an exception — they use `chrome.storage` directly via ExtGlobal. 3. **No `console.log` in production.** Use `LoggerService`. 4. **No global variables** outside defined Services. 5. **No magic strings.** Use constants/enums for Storage Keys and CSS Classes. 6. **All CSS classes injected into Gemini DOM must be prefixed `gv-`.** 7. **All translations must be updated in all 10 locales** (`en`, `ar`, `es`, `fr`, `ja`, `ko`, `pt`, `ru`, `zh`, `zh_TW`) when adding/modifying i18n keys. 8. **Never modify `dist_*` folders directly.** 9. **Never commit `.env` or secrets.** 10. **When adding Material Symbol icons**, add the icon name to `icon_names=` in the Google Fonts URL in `src/pages/popup/index.html`. ## Verification (run before declaring done) 1. `bun run typecheck` — after any `.ts`/`.tsx` change 2. `bun run lint` — before finishing 3. `bun run test` — all tests pass 4. `bun run build:chrome` — builds without error 5. New features/fixes must include tests ## Commit Format Conventional Commits: `(): ` - Types: `feat`, `fix`, `refactor`, `chore`, `docs`, `test`, `build`, `ci`, `perf`, `style` - Scope: short, feature-focused (e.g., `copy`, `export`, `popup`) - Summary: lowercase, imperative, no trailing period - If the commit relates to a GitHub issue or discussion, include `Closes #xxx` or `Fixes #xxx` in the commit **body** ## Version Bump & Release ```bash bun run bump # auto-updates package.json, manifest.json, manifest.dev.json ``` **Changelog required:** after bumping, ensure `src/pages/content/changelog/notes/` has a `.md` file for the new version before pushing. Do not skip this step. Then: commit `chore: bump to v{VERSION}` → `git tag v{VERSION}` → `git push && git push --tags` ## Design Principles 1. **KISS.** Implement the minimum interpretation of requirements. Never combine orthogonal features (e.g., "fade" and "thin") without explicit confirmation. 2. **Backward compatibility is iron law.** Zero destructiveness to user data (especially `localStorage`). 3. **Data structures first.** Eliminate special cases by redesigning data, not adding branches. 4. **For visual/CSS changes:** describe expected rendering, verify alignment/centering/spacing in both light and dark themes, and check external resources (icon fonts, CDN links). 5. **For ambiguous requirements:** implement the minimal version first. Ask before adding scope. ## Architecture - **Services**: singletons in `src/core/services/`. `StorageService` is single source of truth for persistence. - **Content scripts**: `src/pages/content/`. Each sub-module is self-contained. - **UI**: functional React components + hooks. Business logic in `features/*/services/` or custom hooks, not in UI files. - **Types**: `src/core/types/common.ts` for StorageKeys and shared types. - **Translations**: `src/locales/*/messages.json` (10 languages). - **Injected CSS**: `public/contentStyle.css`. ## Task Map | Task | Where | |------|-------| | Add storage key | `src/core/types/common.ts` → `StorageService.ts` → all 10 locales | | Update translations | `src/locales/*/messages.json` (all 10) | | Change DOM injection | `src/pages/content/` | | Modify popup settings | `src/pages/popup/components/` | | Fix cloud sync | `src/core/services/GoogleDriveSyncService.ts` | | Add keyboard shortcut | `src/core/services/KeyboardShortcutService.ts` + types | ================================================ FILE: CNAME ================================================ voyager.nagi.fun ================================================ FILE: LICENSE ================================================ Copyright (c) 2022 Jonathan Braat Copyright (c) 2026 Jesse Zhang GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: README.md ================================================
promotion

Make Your Gemini™ Experience Truly Yours ✨

Navigate conversations with an elegant timeline, organize chats with folders, and build your own prompt vault.
It's the missing power-up for Google Gemini.

Chrome Edge Firefox Safari Opera Brave

GitHub stars GitHub forks Latest version GitHub downloads Chrome Web Store users Chrome Web Store rating Firefox Add-ons users Firefox Add-ons rating

Nagi-ovo%2Fgemini-voyager | Trendshift Gemini Voyager - All-in-one Gemini suite: folders, chat export and much more | Product Hunt

✨ We're live on Product Hunt! We'd love to hear your thoughts and feedback. ❤️

📖 Documentation简体中文繁體中文日本語FrançaisEspañolPortuguêsРусскийالعربية한국어

KOL Recommendation
🎉 Highly recommended by top tech KOLs and the community!

> [!IMPORTANT] > **Name Change Notice**: Due to trademark and copyright concerns, this extension has been officially renamed to **Voyager**. However, due to the Chrome Web Store's extremely slow review process, the name change was not approved within 7 days — it is temporarily unavailable on the Chrome Web Store under the new name. > [!NOTE] > If Voyager helps you, feel free to share it on X, Reddit, YouTube, Threads, etc. Every share helps more people discover the project and improve the Gemini experience. Thanks. --- ## 👋 Why Voyager? We love Gemini, but sometimes we wish it had just a _bit_ more structure. That's why we built **Voyager**. It's not just a tool; it's a companion that helps you keep your AI conversations organized, accessible, and productive. Whether you're a researcher juggling dozens of threads, a developer saving code snippets, or just someone who loves order, Voyager is designed for you.

Try Voyager
During the issue on February 18th where the Google Gemini App caused some users' historical conversations to become inaccessible, Voyager users were still able to see their saved conversations in their folders.

--- ## ✨ Features ### 🌌 Core (Gemini & AI Studio) - **📂 [Folder Organization](https://voyager.nagi.fun/en/guide/folders)**: Organize chats into a two-level folder hierarchy with drag-and-drop support. - **Gemini**: Supports **Account Isolation Mode** and **Custom Folder Colors**. - **💡 [Prompt Vault](https://voyager.nagi.fun/en/guide/prompts)**: Save and reuse prompts across Gemini, AI Studio, and [custom websites](https://voyager.nagi.fun/en/guide/custom-websites). - **☁️ [Cloud Sync](https://voyager.nagi.fun/en/guide/cloud-sync)**: Sync folders and prompts to Google Drive. - **📐 Formula Copy**: One-click copy for LaTeX and MathML (Word) source codes. - **🌦️ Visual Effects**: Add seasonal ambience with **snow**, **cinematic rain**, or **falling sakura petals** from the settings panel. ### ✨ Gemini Exclusive - **📍 [Timeline Navigation](https://voyager.nagi.fun/en/guide/timeline)**: Visual nodes to jump between messages, star key moments, and manage conversation branches. - **💾 [Chat Export](https://voyager.nagi.fun/en/guide/export)**: Export conversations to JSON, Markdown, or PDF with images included. - **🧜‍♀️ [Mermaid Rendering](https://voyager.nagi.fun/en/guide/mermaid)**: Auto-render flowcharts, sequence diagrams, and other Mermaid charts. - **📝 [Markdown Rendering Fix](https://voyager.nagi.fun/en/guide/markdown-fix)**: Automatically fix broken bold syntax caused by Gemini's injected HTML elements. - **🍌 [NanoBanana](https://voyager.nagi.fun/en/guide/nanobanana)**: Lossless watermark removal for Gemini-generated images. - **🔬 [Deep Research](https://voyager.nagi.fun/en/guide/deep-research)**: Extract thinking processes and research links from Deep Research sessions. - **🛠️ Power Tools**: - **[Batch Delete](https://voyager.nagi.fun/en/guide/batch-delete)**: Bulk delete conversations. - **[Quote Reply](https://voyager.nagi.fun/en/guide/quote-reply)**: Reply with context by selecting text. - **[Tab Title Sync](https://voyager.nagi.fun/en/guide/tab-title)**: Auto-sync browser tab titles. - **[Prevent Auto Scroll](https://voyager.nagi.fun/en/guide/prevent-auto-scroll)**: Intercepts unwanted jumping behavior when hitting enter to send a new prompt. - **[Input Collapse](https://voyager.nagi.fun/en/guide/input-collapse)**: Auto-expandable input area for more reading space. - **[Default Model](https://voyager.nagi.fun/en/guide/default-model)**: Set your favorite model as default. - **[Hide Recent Items](https://voyager.nagi.fun/en/guide/recents-hider)**: Hide "Recent" list in the sidebar to reduce distraction. - **Hide Upgrade Prompts**: Hide "Upgrade to Google AI Ultra" elements in the sidebar and model menu to reduce distraction (Enabled by default). ### 🎨 Personalization - Open the extension popup and find **Visual Effects** to switch between `Off`, `Snow`, `Sakura`, and `Rain`. - Effects are rendered as lightweight full-screen overlays and do not block page interaction. - When you switch effects or turn them off, existing particles drain out naturally instead of disappearing abruptly. --- ## 📥 Installation > ⚠️ Note: Prompt Manager is the only feature that supports Gemini for Enterprise.
Chrome Web Store    Microsoft Edge Add-ons    Firefox Add-ons    Safari Download

Chrome Web Store also works on Edge, Opera, Brave, Vivaldi, Arc, and other Chromium browsers.

> **Store Status:** Chrome ⏳ (name update pending review) · Firefox ✅ · Edge ✅ · Safari ✅ For **manual installation** or **development builds**, please refer to the [Installation Guide](https://voyager.nagi.fun/en/guide/installation). --- ## ☕ Support This Project If Voyager makes your life easier, consider buying me a coffee. It helps keep the updates coming! Sponsors will be featured in our Special Thanks section. ❤️
Buy Me A Coffee Sponsor on GitHub

Or support via WeChat / Alipay / Afdian:

WeChat Pay
WeChat Pay
Alipay
Alipay
Nagi-ovo's Profile
Afdian
### 🎙️ Recommended Tool: Typeless I highly recommend **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**, an AI voice-to-text tool that I used extensively during the development of Voyager. Integrating it into my daily workflow has saved me a tremendous amount of time and significantly boosted my productivity. > 🎁 **[Join via my referral link](https://www.typeless.com/?via=gemini-voyager)** (Code: _`gemini-voyager`_) to get **$5 free credits**. This also gives me credits to keep maintaining this project—a free way to support my work! ❤️ --- ## 💬 Community
Follow on X

Follow for Updates
Get the latest updates.
Discord

Join the Community
Chat with other users, share prompts, and get help.
--- ## 🤝 Contributing & Development [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) We welcome contributions! Whether you want to report bugs, suggest features, improve documentation, or submit code: - **Issues**: Use our [bug report](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/bug_report.md) or [feature request](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml) templates - **Pull Requests**: Check out [CONTRIBUTING.md](./.github/CONTRIBUTING.md) for guidelines
Development Setup ```bash # Install dependencies (Bun recommended) bun i # Development mode (with auto-reload) bun run dev:chrome # Chrome & Chromium browsers bun run dev:firefox # Firefox bun run dev:safari # Safari (requires macOS) # Production builds bun run build:chrome # Chrome bun run build:firefox # Firefox bun run build:safari # Safari bun run build:all # All browsers ``` **Safari Development**: See [safari/README.md](safari/README.md) for additional build steps.
Thank you for helping make Voyager better! ❤️ ### ❤️ Special Thanks Special thanks to all contributors for their contributions to Voyager ❤️ --- ## 🌟 Credits - **[DeepSeek Voyager](https://github.com/Azurboy/deepseek-voyager)** - A fork of Voyager adapted for DeepSeek, bringing timeline navigation and chat management to DeepSeek users! - **[claude-nexus](https://github.com/Qiuner/claude-nexus)** - A Claude.ai enhancement extension inspired by Voyager, featuring timeline navigation, folder management, prompt library and more, with full prompt import/export compatibility with Voyager! - **[ChatGPT Conversation Timeline](https://github.com/Reborn14/chatgpt-conversation-timeline)** - The original timeline navigation extension for ChatGPT that inspired this project: Voyager adapted the timeline concept for Gemini and added extensive new features including folder management, prompt vault, and chat export. - **[Ophel Atlas](https://github.com/urzeye/ophel)** - A browser extension that transforms AI conversations into organized, searchable documents with auto-generated outlines, conversation management, and prompt libraries across multiple AI platforms. ---
Star History Chart

Made with ❤️ by Jesse Zhang

GPLv3 License © 2026
================================================ FILE: commitlint.config.cjs ================================================ module.exports = { extends: ['@commitlint/config-conventional'], rules: { 'type-enum': [ 2, 'always', [ 'feat', 'fix', 'docs', 'style', 'refactor', 'perf', 'test', 'build', 'ci', 'chore', 'revert', 'deps', 'ux', ], ], 'header-max-length': [2, 'always', 100], 'scope-case': [2, 'always', 'lower-case'], 'subject-case': [0], 'body-leading-blank': [2, 'always'], 'footer-leading-blank': [2, 'always'], 'footer-max-line-length': [2, 'always', 120], }, }; ================================================ FILE: custom-vite-plugins.ts ================================================ import fs from 'fs'; import { resolve } from 'path'; import type { NormalizedInputOptions, NormalizedOutputOptions } from 'rollup'; import type { PluginOption } from 'vite'; const FIREFOX_OUT_DIR_MARKER = 'dist_firefox'; const CHANGELOG_PROMO_BANNERS = [ 'changelog-promo-banner.png', 'changelog-promo-banner-cn.png', 'changelog-promo-banner-jp.png', ]; // plugin to remove dev icons from prod build export function stripDevIcons(isDev: boolean) { if (isDev) return null; return { name: 'strip-dev-icons', resolveId(source: string) { return source === 'virtual-module' ? source : null; }, renderStart(outputOptions: NormalizedOutputOptions, _inputOptions: NormalizedInputOptions) { const outDir = outputOptions.dir ?? ''; const isFirefoxBuild = outDir.includes(FIREFOX_OUT_DIR_MARKER); fs.rm(resolve(outDir, 'dev-icon-32.png'), () => console.log(`Deleted dev-icon-32.png from prod build`), ); fs.rm(resolve(outDir, 'dev-icon-128.png'), () => console.log(`Deleted dev-icon-128.png from prod build`), ); if (!isFirefoxBuild) { CHANGELOG_PROMO_BANNERS.forEach((fileName) => { fs.rm(resolve(outDir, fileName), () => console.log(`Deleted ${fileName} from non-Firefox build`), ); }); } // Remove assets directory if it exists const assetsDir = resolve(outDir, 'assets'); fs.rm(assetsDir, { recursive: true, force: true }, () => console.log(`Deleted assets/ directory from prod build`), ); }, writeBundle(outputOptions: NormalizedOutputOptions) { const outDir = outputOptions.dir ?? ''; // Remove .vite directory (Vite's internal manifest, not needed for extension) const viteDir = resolve(outDir, '.vite'); fs.rm(viteDir, { recursive: true, force: true }, () => console.log(`Deleted .vite/ directory from prod build`), ); }, }; } type LocaleMessages = Record; function stripDescriptions(raw: LocaleMessages): LocaleMessages { return Object.fromEntries(Object.entries(raw).map(([k, v]) => [k, { message: v.message }])); } // plugin to strip `description` fields from locale JSON at build time. // Runs before vite:json so we return stripped JSON; vite:json then converts it to ESM normally. export function stripI18nDescriptions(isDev: boolean): PluginOption { if (isDev) return null; return { name: 'strip-i18n-descriptions', enforce: 'pre', transform(code, id) { if (!id.includes('/locales/') || !id.endsWith('messages.json')) return null; const raw: LocaleMessages = JSON.parse(code); return { code: JSON.stringify(stripDescriptions(raw)), map: null }; }, }; } // plugin to support i18n export function crxI18n(options: { localize: boolean; src: string; stripDescriptions?: boolean; }): PluginOption { if (!options.localize) return null; const getJsonFiles = (dir: string): Array => { const files = fs.readdirSync(dir, { recursive: true }) as string[]; return files.filter((file) => !!file && file.endsWith('.json')); }; const entry = resolve(__dirname, options.src); const localeFiles = getJsonFiles(entry); const files = localeFiles.map((file) => { const raw: LocaleMessages = JSON.parse(fs.readFileSync(resolve(entry, file), 'utf-8')); const source = options.stripDescriptions ? JSON.stringify(stripDescriptions(raw)) : JSON.stringify(raw); return { id: '', fileName: file, source }; }); return { name: 'crx-i18n', enforce: 'pre', buildStart: { order: 'post', handler() { files.forEach((file) => { const refId = this.emitFile({ type: 'asset', source: file.source, fileName: '_locales/' + file.fileName, }); file.id = refId; }); }, }, }; } ================================================ FILE: docs/.vitepress/config.mts ================================================ import { GitChangelog, GitChangelogMarkdownSection, } from '@nolebase/vitepress-plugin-git-changelog/vite'; import { defineConfig } from 'vitepress'; // https://vitepress.dev/reference/site-config export default defineConfig({ base: '/', title: 'Voyager', description: '直观的导航。强大的组织。简洁优雅。', lang: 'zh-CN', head: [['link', { rel: 'icon', href: '/favicon.ico' }]], locales: { root: { label: '简体中文', lang: 'zh-CN', themeConfig: { nav: [ { text: '首页', link: '/' }, { text: '指南', link: '/guide/installation' }, ], sidebar: [ { text: '启程', items: [ { text: '安装', link: '/guide/installation' }, { text: '快速上手', link: '/guide/getting-started' }, { text: '赞助', link: '/guide/sponsor' }, { text: '交流与反馈', link: '/guide/community' }, ], }, { text: '通用功能 (Gemini & AI Studio)', items: [ { text: '文件夹', link: '/guide/folders' }, { text: '灵感库', link: '/guide/prompts' }, { text: '云同步', link: '/guide/cloud-sync' }, { text: '公式复制', link: '/guide/formula-copy' }, { text: '侧边栏宽度', link: '/guide/sidebar' }, ], }, { text: 'Gemini 专属功能', items: [ { text: '时间轴', link: '/guide/timeline' }, { text: '对话导出', link: '/guide/export' }, { text: '引用回复', link: '/guide/quote-reply' }, { text: '对话宽度调整', link: '/guide/settings' }, { text: '批量删除', link: '/guide/batch-delete' }, { text: 'Deep Research 导出', link: '/guide/deep-research' }, { text: 'Mermaid 图表渲染', link: '/guide/mermaid' }, { text: 'Markdown 渲染修复', link: '/guide/markdown-fix' }, { text: 'NanoBanana 水印去除', link: '/guide/nanobanana' }, { text: '侧边栏自动收起', link: '/guide/sidebar-auto-hide' }, { text: '防自动跳转', link: '/guide/prevent-auto-scroll' }, { text: '输入框折叠', link: '/guide/input-collapse' }, { text: '隐藏最近项目和 Gem', link: '/guide/recents-hider' }, { text: '默认模型', link: '/guide/default-model' }, { text: '标签页标题同步', link: '/guide/tab-title' }, { text: '对话分支 (实验性)', link: '/guide/fork' }, { text: '上下文同步到IDE(实验性)', link: '/guide/context-sync' }, ], }, ], footer: { message: '本项目开源。欢迎在 GitHub 上给一颗 ⭐ 支持。', copyright: '基于 GPLv3 协议发布 | Copyright © 2026 Jesse Zhang | 隐私政策', }, }, }, zh_TW: { label: '繁體中文', lang: 'zh-TW', link: '/zh_TW/', themeConfig: { nav: [ { text: '首頁', link: '/zh_TW/' }, { text: '指南', link: '/zh_TW/guide/installation' }, ], sidebar: [ { text: '介紹', items: [ { text: '安裝', link: '/zh_TW/guide/installation' }, { text: '快速開始', link: '/zh_TW/guide/getting-started' }, { text: '贊助', link: '/zh_TW/guide/sponsor' }, { text: '社群', link: '/zh_TW/guide/community' }, ], }, { text: '通用功能 (Gemini & AI Studio)', items: [ { text: '資料夾', link: '/zh_TW/guide/folders' }, { text: '提示詞庫', link: '/zh_TW/guide/prompts' }, { text: '雲同步', link: '/zh_TW/guide/cloud-sync' }, { text: '公式複製', link: '/zh_TW/guide/formula-copy' }, { text: '側邊欄寬度', link: '/zh_TW/guide/sidebar' }, ], }, { text: 'Gemini 專屬功能', items: [ { text: '時間軸導航', link: '/zh_TW/guide/timeline' }, { text: '對話導出', link: '/zh_TW/guide/export' }, { text: '引用回覆', link: '/zh_TW/guide/quote-reply' }, { text: '對話寬度', link: '/zh_TW/guide/settings' }, { text: '批次刪除', link: '/zh_TW/guide/batch-delete' }, { text: 'Deep Research 導出', link: '/zh_TW/guide/deep-research' }, { text: 'Mermaid 圖表', link: '/zh_TW/guide/mermaid' }, { text: 'Markdown 渲染修復', link: '/zh_TW/guide/markdown-fix' }, { text: 'NanoBanana', link: '/zh_TW/guide/nanobanana' }, { text: '側邊欄自動收起', link: '/zh_TW/guide/sidebar-auto-hide' }, { text: '防自動跳轉', link: '/zh_TW/guide/prevent-auto-scroll' }, { text: '輸入框摺疊', link: '/zh_TW/guide/input-collapse' }, { text: '隱藏最近項目和 Gem', link: '/zh_TW/guide/recents-hider' }, { text: '預設模型', link: '/zh_TW/guide/default-model' }, { text: '標籤標題同步', link: '/zh_TW/guide/tab-title' }, { text: '對話分支 (實驗性)', link: '/zh_TW/guide/fork' }, { text: '上下文同步(實驗性)', link: '/zh_TW/guide/context-sync' }, ], }, ], footer: { message: '開源專案。如果您喜歡,請在 GitHub 上給我們一顆 ⭐。', copyright: 'GPLv3 授權 | Copyright © 2026 Jesse Zhang | 隱私政策', }, }, }, en: { label: 'English', lang: 'en-US', link: '/en/', themeConfig: { nav: [ { text: 'Home', link: '/en/' }, { text: 'Guide', link: '/en/guide/installation' }, ], sidebar: [ { text: 'Introduction', items: [ { text: 'Installation', link: '/en/guide/installation' }, { text: 'Getting Started', link: '/en/guide/getting-started' }, { text: 'Sponsor', link: '/en/guide/sponsor' }, { text: 'Community', link: '/en/guide/community' }, ], }, { text: 'Common Features (Gemini & AI Studio)', items: [ { text: 'Folder Organization', link: '/en/guide/folders' }, { text: 'Prompt Library', link: '/en/guide/prompts' }, { text: 'Cloud Sync', link: '/en/guide/cloud-sync' }, { text: 'Formula Copy', link: '/en/guide/formula-copy' }, { text: 'Sidebar Width', link: '/en/guide/sidebar' }, ], }, { text: 'Gemini Exclusive Features', items: [ { text: 'Timeline Navigation', link: '/en/guide/timeline' }, { text: 'Chat Export', link: '/en/guide/export' }, { text: 'Quote Reply', link: '/en/guide/quote-reply' }, { text: 'Chat Width Adjustment', link: '/en/guide/settings' }, { text: 'Batch Delete', link: '/en/guide/batch-delete' }, { text: 'Deep Research Export', link: '/en/guide/deep-research' }, { text: 'Mermaid Diagram Rendering', link: '/en/guide/mermaid' }, { text: 'Markdown Rendering Fix', link: '/en/guide/markdown-fix' }, { text: 'NanoBanana (Watermark Remover)', link: '/en/guide/nanobanana' }, { text: 'Sidebar Auto-hide', link: '/en/guide/sidebar-auto-hide' }, { text: 'Prevent Auto Scroll', link: '/en/guide/prevent-auto-scroll' }, { text: 'Input Collapse', link: '/en/guide/input-collapse' }, { text: 'Hide Recent Items and Gems', link: '/en/guide/recents-hider' }, { text: 'Default Model', link: '/en/guide/default-model' }, { text: 'Tab Title Sync', link: '/en/guide/tab-title' }, { text: 'Conversation Fork (Experimental)', link: '/en/guide/fork' }, { text: 'Context Sync to IDE (Experimental)', link: '/en/guide/context-sync' }, ], }, ], footer: { message: 'Open source project. Star us on GitHub if you like it ⭐.', copyright: 'Released under the GPLv3 License | Copyright © 2026 Jesse Zhang | Privacy Policy', }, }, }, ja: { label: '日本語', lang: 'ja-JP', link: '/ja/', themeConfig: { nav: [ { text: 'ホーム', link: '/ja/' }, { text: 'ガイド', link: '/ja/guide/installation' }, ], sidebar: [ { text: 'はじめに', items: [ { text: 'インストール', link: '/ja/guide/installation' }, { text: 'クイックスタート', link: '/ja/guide/getting-started' }, { text: 'スポンサー', link: '/ja/guide/sponsor' }, { text: 'コミュニティ', link: '/ja/guide/community' }, ], }, { text: '共通機能 (Gemini & AI Studio)', items: [ { text: 'フォルダ管理', link: '/ja/guide/folders' }, { text: 'プロンプト', link: '/ja/guide/prompts' }, { text: 'クラウド同期', link: '/ja/guide/cloud-sync' }, { text: '数식コピー', link: '/ja/guide/formula-copy' }, { text: 'サイドバーの幅', link: '/ja/guide/sidebar' }, ], }, { text: 'Gemini 専用機能', items: [ { text: 'タイムライン', link: '/ja/guide/timeline' }, { text: 'エクスポート', link: '/ja/guide/export' }, { text: '引用返信', link: '/ja/guide/quote-reply' }, { text: 'チャット幅', link: '/ja/guide/settings' }, { text: '一括削除', link: '/ja/guide/batch-delete' }, { text: 'Deep Research', link: '/ja/guide/deep-research' }, { text: 'Mermaid', link: '/ja/guide/mermaid' }, { text: 'Markdown レンダリングの修正', link: '/ja/guide/markdown-fix' }, { text: 'NanoBanana', link: '/ja/guide/nanobanana' }, { text: 'サイドバー自動非表示', link: '/ja/guide/sidebar-auto-hide' }, { text: '自動スクロール防止', link: '/ja/guide/prevent-auto-scroll' }, { text: '入力欄の自動非表示', link: '/ja/guide/input-collapse' }, { text: '最近の項目と Gem を非表示', link: '/ja/guide/recents-hider' }, { text: 'デフォルトモデル', link: '/ja/guide/default-model' }, { text: 'タブタイトルの同期', link: '/ja/guide/tab-title' }, { text: '会話の分岐 (実験的)', link: '/ja/guide/fork' }, { text: 'IDEへのコンテキスト同期(実験的)', link: '/ja/guide/context-sync' }, ], }, ], footer: { message: 'オープンソースプロジェクトです。GitHub でスター ⭐ をつけて応援してください。', copyright: 'GPLv3 ライセンス | Copyright © 2026 Jesse Zhang | プライバシーポリシー', }, }, }, ko: { label: '한국어', lang: 'ko-KR', link: '/ko/', themeConfig: { nav: [ { text: '홈', link: '/ko/' }, { text: '가이드', link: '/ko/guide/installation' }, ], sidebar: [ { text: '소개', items: [ { text: '설치', link: '/ko/guide/installation' }, { text: '시작하기', link: '/ko/guide/getting-started' }, { text: '후원', link: '/ko/guide/sponsor' }, { text: '커뮤니티', link: '/ko/guide/community' }, ], }, { text: '공통 기능 (Gemini & AI Studio)', items: [ { text: '폴더 관리', link: '/ko/guide/folders' }, { text: '프롬프트 라이브러리', link: '/ko/guide/prompts' }, { text: '클라우드 동기화', link: '/ko/guide/cloud-sync' }, { text: '수식 복사', link: '/ko/guide/formula-copy' }, { text: '사이드바 너비', link: '/ko/guide/sidebar' }, ], }, { text: 'Gemini 전용 기능', items: [ { text: '타임라인 탐색', link: '/ko/guide/timeline' }, { text: '대화 내보내기', link: '/ko/guide/export' }, { text: '인용 답장', link: '/ko/guide/quote-reply' }, { text: '대화 너비 조정', link: '/ko/guide/settings' }, { text: '일괄 삭제', link: '/ko/guide/batch-delete' }, { text: 'Deep Research 내보내기', link: '/ko/guide/deep-research' }, { text: 'Mermaid 다이어그램 렌더링', link: '/ko/guide/mermaid' }, { text: 'Markdown 렌더링 수정', link: '/ko/guide/markdown-fix' }, { text: 'NanoBanana (워터마크 제거)', link: '/ko/guide/nanobanana' }, { text: '사이드바 자동 숨김', link: '/ko/guide/sidebar-auto-hide' }, { text: '자동 스크롤 방지', link: '/ko/guide/prevent-auto-scroll' }, { text: '입력창 접기', link: '/ko/guide/input-collapse' }, { text: '최근 항목 및 Gem 숨기기', link: '/ko/guide/recents-hider' }, { text: '기본 모델', link: '/ko/guide/default-model' }, { text: '탭 제목 동기화', link: '/ko/guide/tab-title' }, { text: '대화 분기 (실험적)', link: '/ko/guide/fork' }, { text: 'IDE 컨텍스트 동기화 (실험적)', link: '/ko/guide/context-sync' }, ], }, ], footer: { message: '오픈 소스 프로젝트입니다. 마음에 드신다면 GitHub에서 ⭐를 눌러주세요.', copyright: 'GPLv3 라이선스 하에 배포됨 | Copyright © 2026 Jesse Zhang | 개인정보 처리방침', }, }, }, fr: { label: 'Français', lang: 'fr-FR', link: '/fr/', themeConfig: { nav: [ { text: 'Accueil', link: '/fr/' }, { text: 'Guide', link: '/fr/guide/installation' }, ], sidebar: [ { text: 'Introduction', items: [ { text: 'Installation', link: '/fr/guide/installation' }, { text: 'Commencer', link: '/fr/guide/getting-started' }, { text: 'Sponsor', link: '/fr/guide/sponsor' }, { text: 'Communauté', link: '/fr/guide/community' }, ], }, { text: 'Fonctionnalités Communes (Gemini & AI Studio)', items: [ { text: 'Dossiers', link: '/fr/guide/folders' }, { text: 'Bibliothèque de Prompts', link: '/fr/guide/prompts' }, { text: 'Synchronisation Cloud', link: '/fr/guide/cloud-sync' }, { text: 'Copie de Formules', link: '/fr/guide/formula-copy' }, { text: 'Largeur de la barre latérale', link: '/fr/guide/sidebar' }, ], }, { text: 'Fonctionnalités Exclusives Gemini', items: [ { text: 'Navigation Temporelle', link: '/fr/guide/timeline' }, { text: 'Export de Chat', link: '/fr/guide/export' }, { text: 'Réponse avec Citation', link: '/fr/guide/quote-reply' }, { text: 'Largeur de Chat', link: '/fr/guide/settings' }, { text: 'Suppression par Lot', link: '/fr/guide/batch-delete' }, { text: 'Export Deep Research', link: '/fr/guide/deep-research' }, { text: 'Diagrammes Mermaid', link: '/fr/guide/mermaid' }, { text: 'Correction du Rendu Markdown', link: '/fr/guide/markdown-fix' }, { text: 'NanoBanana', link: '/fr/guide/nanobanana' }, { text: 'Masquage auto barre latérale', link: '/fr/guide/sidebar-auto-hide' }, { text: 'Empêcher le défilement auto', link: '/fr/guide/prevent-auto-scroll' }, { text: 'Réduction Entrée', link: '/fr/guide/input-collapse' }, { text: 'Masquer les éléments récents et les Gems', link: '/fr/guide/recents-hider' }, { text: 'Modèle par Défaut', link: '/fr/guide/default-model' }, { text: 'Synchro Titre Onglet', link: '/fr/guide/tab-title' }, { text: 'Bifurcation de Conversation (Expérimental)', link: '/fr/guide/fork' }, { text: 'Synchro Contexte IDE', link: '/fr/guide/context-sync' }, ], }, ], footer: { message: 'Projet Open Source. Mettez une ⭐ sur GitHub si vous aimez.', copyright: 'Licence GPLv3 | Copyright © 2026 Jesse Zhang | Politique de Confidentialité', }, }, }, es: { label: 'Español', lang: 'es-ES', link: '/es/', themeConfig: { nav: [ { text: 'Inicio', link: '/es/' }, { text: 'Guía', link: '/es/guide/installation' }, ], sidebar: [ { text: 'Introducción', items: [ { text: 'Instalación', link: '/es/guide/installation' }, { text: 'Comenzar', link: '/es/guide/getting-started' }, { text: 'Patrocinar', link: '/es/guide/sponsor' }, { text: 'Comunidad', link: '/es/guide/community' }, ], }, { text: 'Funciones Comunes (Gemini & AI Studio)', items: [ { text: 'Carpetas', link: '/es/guide/folders' }, { text: 'Biblioteca de Prompts', link: '/es/guide/prompts' }, { text: 'Sincronización en la Nube', link: '/es/guide/cloud-sync' }, { text: 'Copia de Fórmulas', link: '/es/guide/formula-copy' }, { text: 'Ancho de la barra lateral', link: '/es/guide/sidebar' }, ], }, { text: 'Funciones Exclusivas de Gemini', items: [ { text: 'Navegación de Línea de Tiempo', link: '/es/guide/timeline' }, { text: 'Exportación de Chat', link: '/es/guide/export' }, { text: 'Respuesta con Cita', link: '/es/guide/quote-reply' }, { text: 'Ancho de Chat', link: '/es/guide/settings' }, { text: 'Eliminación por Lote', link: '/es/guide/batch-delete' }, { text: 'Exportación Deep Research', link: '/es/guide/deep-research' }, { text: 'Gráficos Mermaid', link: '/es/guide/mermaid' }, { text: 'Corrección de Renderizado Markdown', link: '/es/guide/markdown-fix' }, { text: 'NanoBanana', link: '/es/guide/nanobanana' }, { text: 'Ocultar barra lateral auto', link: '/es/guide/sidebar-auto-hide' }, { text: 'Evitar desplazamiento automático', link: '/es/guide/prevent-auto-scroll' }, { text: 'Colapso de Entrada', link: '/es/guide/input-collapse' }, { text: 'Ocultar elementos recientes y Gems', link: '/es/guide/recents-hider' }, { text: 'Modelo Predeterminado', link: '/es/guide/default-model' }, { text: 'Sincronización de Título de Pestaña', link: '/es/guide/tab-title', }, { text: 'Bifurcación de Conversación (Experimental)', link: '/es/guide/fork', }, { text: 'Sincronización de contexto a IDE (Experimental)', link: '/es/guide/context-sync', }, ], }, ], footer: { message: 'Proyecto de Código Abierto. Danos una ⭐ en GitHub si te gusta.', copyright: 'Licencia GPLv3 | Copyright © 2026 Jesse Zhang | Política de Privacidad', }, }, }, pt: { label: 'Português', lang: 'pt-PT', link: '/pt/', themeConfig: { nav: [ { text: 'Início', link: '/pt/' }, { text: 'Guia', link: '/pt/guide/installation' }, ], sidebar: [ { text: 'Introdução', items: [ { text: 'Instalação', link: '/pt/guide/installation' }, { text: 'Começar', link: '/pt/guide/getting-started' }, { text: 'Patrocinar', link: '/pt/guide/sponsor' }, { text: 'Comunidade', link: '/pt/guide/community' }, ], }, { text: 'Funcionalidades Comuns (Gemini & AI Studio)', items: [ { text: 'Pastas', link: '/pt/guide/folders' }, { text: 'Biblioteca de Prompts', link: '/pt/guide/prompts' }, { text: 'Sincronização na Nuvem', link: '/pt/guide/cloud-sync' }, { text: 'Cópia de Fórmulas', link: '/pt/guide/formula-copy' }, { text: 'Largura da barra lateral', link: '/pt/guide/sidebar' }, ], }, { text: 'Funcionalidades Exclusivas Gemini', items: [ { text: 'Navegação na Linha do Tempo', link: '/pt/guide/timeline' }, { text: 'Exportação de Chat', link: '/pt/guide/export' }, { text: 'Resposta com Citação', link: '/pt/guide/quote-reply' }, { text: 'Largura do Chat', link: '/pt/guide/settings' }, { text: 'Exclusão em Lote', link: '/pt/guide/batch-delete' }, { text: 'Exportação Deep Research', link: '/pt/guide/deep-research' }, { text: 'Gráficos Mermaid', link: '/pt/guide/mermaid' }, { text: 'Correção de Renderização Markdown', link: '/pt/guide/markdown-fix' }, { text: 'NanoBanana', link: '/pt/guide/nanobanana' }, { text: 'Ocultar barra lateral auto', link: '/pt/guide/sidebar-auto-hide' }, { text: 'Prevenir rolamento automático', link: '/pt/guide/prevent-auto-scroll' }, { text: 'Colapso de Entrada', link: '/pt/guide/input-collapse' }, { text: 'Ocultar Itens Recentes e Gems', link: '/pt/guide/recents-hider' }, { text: 'Modelo Padrão', link: '/pt/guide/default-model' }, { text: 'Sincronização do Título da Aba', link: '/pt/guide/tab-title' }, { text: 'Bifurcação de Conversa (Experimental)', link: '/pt/guide/fork' }, { text: 'Sincronização de Contexto (Experimental)', link: '/pt/guide/context-sync' }, ], }, ], footer: { message: 'Projeto Open Source. Dê uma ⭐ no GitHub se você gostar.', copyright: 'Licença GPLv3 | Copyright © 2026 Jesse Zhang | Política de Privacidade', }, }, }, ar: { label: 'العربية', lang: 'ar-SA', link: '/ar/', dir: 'rtl', themeConfig: { nav: [ { text: 'الرئيسية', link: '/ar/' }, { text: 'الدليل', link: '/ar/guide/installation' }, ], sidebar: [ { text: 'مقدمة', items: [ { text: 'التثبيت', link: '/ar/guide/installation' }, { text: 'البدء', link: '/ar/guide/getting-started' }, { text: 'رعاية', link: '/ar/guide/sponsor' }, { text: 'المجتمع', link: '/ar/guide/community' }, ], }, { text: 'الميزات العامة (Gemini & AI Studio)', items: [ { text: 'المجلدات', link: '/ar/guide/folders' }, { text: 'مكتبة المطالبات', link: '/ar/guide/prompts' }, { text: 'مزامنة السحابية', link: '/ar/guide/cloud-sync' }, { text: 'نسخ الصيغ', link: '/ar/guide/formula-copy' }, { text: 'عرض الشريط الجانبي', link: '/ar/guide/sidebar' }, ], }, { text: 'ميزات Gemini الحصرية', items: [ { text: 'تصفح الجدول الزمني', link: '/ar/guide/timeline' }, { text: 'تصدير الدردشة', link: '/ar/guide/export' }, { text: 'الرد مع اقتباس', link: '/ar/guide/quote-reply' }, { text: 'عرض الدردشة', link: '/ar/guide/settings' }, { text: 'الحذف الجماعي', link: '/ar/guide/batch-delete' }, { text: 'تصدير البحث العميق', link: '/ar/guide/deep-research' }, { text: 'رسوم بيانية Mermaid', link: '/ar/guide/mermaid' }, { text: 'إصلاح عرض Markdown', link: '/ar/guide/markdown-fix' }, { text: 'NanoBanana', link: '/ar/guide/nanobanana' }, { text: 'إخفاء الشريط الجانبي تلقائياً', link: '/ar/guide/sidebar-auto-hide' }, { text: 'منع التمرير التلقائي', link: '/ar/guide/prevent-auto-scroll' }, { text: 'طي الإدخال', link: '/ar/guide/input-collapse' }, { text: 'إخفاء العناصر الأخيرة والـ Gems', link: '/ar/guide/recents-hider' }, { text: 'النموذج الافتراضي', link: '/ar/guide/default-model' }, { text: 'مزامنة عنوان علامة التبويب', link: '/ar/guide/tab-title' }, { text: 'تفريع المحادثة (تجريبي)', link: '/ar/guide/fork' }, { text: 'مزامنة السياق (تجريبي)', link: '/ar/guide/context-sync' }, ], }, ], footer: { message: 'مشروع مفتوح المصدر. امنحنا ⭐ على GitHub إذا أعجبك.', copyright: 'رخصة GPLv3 | حقوق النشر © 2026 Jesse Zhang | سياسة الخصوصية', }, }, }, ru: { label: 'Русский', lang: 'ru-RU', link: '/ru/', themeConfig: { nav: [ { text: 'Главная', link: '/ru/' }, { text: 'Руководство', link: '/ru/guide/installation' }, ], sidebar: [ { text: 'Введение', items: [ { text: 'Установка', link: '/ru/guide/installation' }, { text: 'Начало работы', link: '/ru/guide/getting-started' }, { text: 'Поддержать', link: '/ru/guide/sponsor' }, { text: 'Сообщество', link: '/ru/guide/community' }, ], }, { text: 'Общие функции (Gemini & AI Studio)', items: [ { text: 'Папки', link: '/ru/guide/folders' }, { text: 'Библиотека промптов', link: '/ru/guide/prompts' }, { text: 'Облачная синхронизация', link: '/ru/guide/cloud-sync' }, { text: 'Копирование формул', link: '/ru/guide/formula-copy' }, { text: 'Ширина боковой панели', link: '/ru/guide/sidebar' }, ], }, { text: 'Эксклюзивные функции Gemini', items: [ { text: 'Навигация по таймлайну', link: '/ru/guide/timeline' }, { text: 'Экспорт чата', link: '/ru/guide/export' }, { text: 'Ответ с цитированием', link: '/ru/guide/quote-reply' }, { text: 'Ширина чата', link: '/ru/guide/settings' }, { text: 'Пакетное удаление', link: '/ru/guide/batch-delete' }, { text: 'Экспорт Deep Research', link: '/ru/guide/deep-research' }, { text: 'Mermaid диаграммы', link: '/ru/guide/mermaid' }, { text: 'Исправление рендеринга Markdown', link: '/ru/guide/markdown-fix' }, { text: 'NanoBanana', link: '/ru/guide/nanobanana' }, { text: 'Авто-скрытие боковой панели', link: '/ru/guide/sidebar-auto-hide' }, { text: 'Предотвращение автопрокрутки', link: '/ru/guide/prevent-auto-scroll' }, { text: 'Сворачивание ввода', link: '/ru/guide/input-collapse' }, { text: 'Скрытие недавних элементов и Gems', link: '/ru/guide/recents-hider' }, { text: 'Модель по умолчанию', link: '/ru/guide/default-model' }, { text: 'Синхронизация заголовка', link: '/ru/guide/tab-title', }, { text: 'Ветвление разговора (Экспериментально)', link: '/ru/guide/fork', }, { text: 'Синхронизация контекста (Экспериментально)', link: '/ru/guide/context-sync', }, ], }, ], footer: { message: 'Проект с открытым исходным кодом. Поставьте ⭐ на GitHub, если вам нравится.', copyright: 'Лицензия GPLv3 | Copyright © 2026 Jesse Zhang | Политика конфиденциальности', }, }, }, }, themeConfig: { logo: '/logo.png', outline: [2, 4], socialLinks: [{ icon: 'github', link: 'https://github.com/Nagi-ovo/gemini-voyager' }], search: { provider: 'local', }, }, vite: { plugins: [ GitChangelog({ repoURL: () => 'https://github.com/Nagi-ovo/gemini-voyager', // Only track the Chinese source docs to avoid 281-file EAGAIN; // translated copies share the same git history via the source. include: ['docs/guide/**/*.md'], maxGitLogCount: 200, }), GitChangelogMarkdownSection(), ], ssr: { noExternal: ['vue3-marquee', '@nolebase/vitepress-plugin-git-changelog'], }, }, }); ================================================ FILE: docs/.vitepress/theme/components/HomeAskAI.vue ================================================ ================================================ FILE: docs/.vitepress/theme/components/HomeReviews.vue ================================================ ================================================ FILE: docs/.vitepress/theme/components/HomeTeaser.vue ================================================ ================================================ FILE: docs/.vitepress/theme/components/README.md ================================================ # SafariDownloadLink Component This Vue component automatically fetches the latest release version from GitHub and generates the correct Safari download URL. ## Usage In any markdown file: ```markdown Download the latest Safari version. ``` ## How It Works 1. On component mount, it fetches the latest release from GitHub API 2. Extracts the version number from the tag name 3. Generates the download URL: `https://github.com/Nagi-ovo/gemini-voyager/releases/download/v{version}/gemini-voyager-v{version}.dmg` 4. If the API call fails, it falls back to version `1.2.3` ## Features - ✅ Automatic version detection - ✅ Fallback to default version on error - ✅ Loading state support - ✅ Customizable link text via slot - ✅ Works in all VitePress markdown files ## Example ```vue Download Safari Extension Get the latest version ``` ================================================ FILE: docs/.vitepress/theme/components/SafariDownloadLink.vue ================================================ ================================================ FILE: docs/.vitepress/theme/index.ts ================================================ import { NolebaseGitChangelogPlugin } from '@nolebase/vitepress-plugin-git-changelog/client'; import '@nolebase/vitepress-plugin-git-changelog/client/style.css'; import { type Theme } from 'vitepress'; import DefaultTheme from 'vitepress/theme'; import { h } from 'vue'; import HomeAskAI from './components/HomeAskAI.vue'; import HomeReviews from './components/HomeReviews.vue'; import HomeTeaser from './components/HomeTeaser.vue'; import SafariDownloadLink from './components/SafariDownloadLink.vue'; import './style.css'; export default { extends: DefaultTheme, Layout: () => { return h(DefaultTheme.Layout, null, { 'home-hero-after': () => h(HomeTeaser), 'home-features-after': () => [h(HomeAskAI), h(HomeReviews)], }); }, enhanceApp({ app }) { app.use(NolebaseGitChangelogPlugin); app.component('HomeReviews', HomeReviews); app.component('HomeTeaser', HomeTeaser); app.component('HomeAskAI', HomeAskAI); app.component('SafariDownloadLink', SafariDownloadLink); }, } satisfies Theme; ================================================ FILE: docs/.vitepress/theme/style.css ================================================ /** * Customize default theme styling by overriding CSS variables: * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css */ :root { /* Shadcn Primary Color (Light Mode): oklch(0.7227 0.1920 149.5793) */ /* Converted to approx Hex for compatibility if needed, but trying OKLCH first */ --vp-c-brand-1: oklch(0.7227 0.192 149.5793); --vp-c-brand-2: oklch(0.65 0.192 149.5793); /* Slightly darker */ --vp-c-brand-3: oklch(0.6 0.192 149.5793); /* Even darker */ } .dark { /* Shadcn Primary Color (Dark Mode): oklch(0.7729 0.1535 163.2231) */ --vp-c-brand-1: oklch(0.7729 0.1535 163.2231); --vp-c-brand-2: oklch(0.82 0.1535 163.2231); /* Slightly lighter */ --vp-c-brand-3: oklch(0.87 0.1535 163.2231); /* Even lighter */ } /* Force 4-column layout for features on large screens */ @media (min-width: 1280px) { .VPFeatures .VPFeature.item { width: 25%; } /* Fallback selector structure just in case of version differences */ .VPFeatures .items .item { width: 25%; } } ================================================ FILE: docs/ar/guide/batch-delete.md ================================================ # الحذف الجماعي احذف محادثات متعددة في وقت واحد، وداعاً للحذف واحدة تلو الأخرى. ## المميزات - **وضع التحديد المتعدد**: اضغط مطولاً على أي محادثة للدخول في وضع التحديد المتعدد وحدد محادثات متعددة لحذفها. - **تنظيف بنقرة واحدة**: بمجرد التحديد، انقر فوق زر الحذف لإزالة جميع المحادثات المحددة في وقت واحد. - **ملاحظات التقدم**: يتم عرض التقدم في الوقت الفعلي أثناء الحذف حتى تعرف الحالة الحالية. - **تأكيد آمن**: يظهر مربع حوار تأكيد قبل الحذف لمنع العمليات العرضية.
الحذف الجماعي
## كيفية الاستخدام 1. في قائمة المحادثات بالشريط الجانبي، **اضغط مطولاً** على أي عنصر محادثة. 2. بعد الدخول في وضع التحديد المتعدد، ستظهر مربعات اختيار على الجانب الأيسر (أو الأيمن حسب الاتجاه) من كل محادثة. 3. حدد المحادثات التي تريد حذفها (حتى 50 في المرة الواحدة). 4. انقر فوق **زر الحذف** الذي يظهر. 5. انقر فوق "تأكيد" في منطقة التأكيد الحمراء التي تظهر **فوق قائمة المجلدات** لبدء الحذف. ::: tip ملاحظة تغطي لوحة التأكيد منطقة المجلد لتجنب حجب قائمة المحادثات. لا يمكن التراجع عن عمليات الحذف الجماعي، لذا يرجى المتابعة بحذر. ::: ================================================ FILE: docs/ar/guide/cloud-sync.md ================================================ # مزامنة السحابية قم بمزامنة مجلداتك ومكتبة المطالبات والبيانات الأخرى مع Google Drive للحفاظ على اتساق تجربتك عبر الأجهزة. ## المميزات - **مزامنة عبر أجهزة متعددة**: حافظ على مزامنة تكويناتك عبر أجهزة كمبيوتر متعددة باستخدام Google Drive. - **خصوصية البيانات**: يتم تخزين البيانات مباشرة في مساحة تخزين Google Drive الخاصة بك، مما يضمن الخصوصية دون وجود خوادم خارجية. - **مزامنة مرنة**: دعم الرفع اليدوي وتنزيل/دمج البيانات. ::: info **قريباً**: سيدعم الإصدار القادم مزامنة المحادثات المميزة بنجمة. ::: ## كيفية الاستخدام 1. انقر فوق أيقونة الامتداد في الزاوية اليمنى السفلية من صفحة Gemini™ لفتح لوحة الإعدادات. 2. حدد موقع قسم **مزامنة السحابية**. 3. انقر فوق **تسجيل الدخول باستخدام Google** وأكمل التفويض. 4. بمجرد التفويض، انقر فوق **رفع إلى السحابة** لمزامنة بياناتك المحلية مع السحابة، أو **تنزيل ودمج** لجلب بيانات السحابة إلى جهازك المحلي. ### 💡 مزامنة سريعة أسهل طريقة هي النقر على زري **"رفع إلى السحابة"** أو **"تنزيل ودمج"** في أعلى منطقة المجلدات في الشريط الجانبي الأيسر (أو الأيمن حسب اللغة). أزرار المزامنة السريعة للسحابة ::: warning **توصية أمنية: حماية مزدوجة** على الرغم من أن المزامنة السحابية توفر راحة كبيرة، إلا أننا نوصي بشدة بإنشاء نسخ احتياطية دورية لبياناتك الأساسية باستخدام **الملفات المحلية**. 1. **تصدير كامل**: قم بتصدير حزمة كاملة تحتوي على جميع الإعدادات والمجلدات والمطالبات من "النسخ الاحتياطي والاستعادة" في أسفل لوحة الإعدادات. تصدير كامل 2. **تصدير جميع المجلدات**: انقر فوق "تصدير" في قسم "المجلدات" في لوحة الإعدادات لنسخ جميع مجلداتك ومحادثاتك احتياطيًا، باستثناء المطالبات. تصدير جميع المجلدات ::: ================================================ FILE: docs/ar/guide/community.md ================================================ # المجتمع والملاحظات نحن نقدر صوت كل مستخدم. سواء واجهت خطأً (Bug)، أو كان لديك اقتراح لميزة، أو كنت ترغب في مشاركة مكتبة المطالبات الخاصة بك، يمكنك الاتصال بنا عبر القنوات التالية. ## 📢 تابع التحديثات تابع حسابنا على X (Twitter) للحصول على أحدث تطورات التطوير. - **إصدارات جديدة**: كن أول من يعرف عن التحديثات. - **ميزات قادمة**: احصل على نظرة خاطفة عما هو قادم. ## 💬 مجتمع Discord انضم إلى خادم Discord الخاص بنا وتبادل الأفكار مع Voyagers الآخرين! - **دردشة فورية**: تحدث مباشرة مع المستخدمين الآخرين والمطورين. - **مشاركة المطالبات**: انظر ما هي أنواع المطالبات التي يستخدمها الآخرون. - **تقدم التطوير**: احصل على أخبار حول تطوير الميزات الجديدة. ## 🐙 مشكلات GitHub إذا وجدت خطأً في البرنامج (Bug) أو كان لديك طلب ميزة واضح (Feature Request)، نوصي بتقديم مشكلة (Issue) على GitHub: - [تقديم تقرير خطأ](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=bug_report.yml) - [تقديم طلب ميزة](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=feature_request.yml) شكراً لدعمك لـ Voyager! ❤️ ================================================ FILE: docs/ar/guide/context-sync.md ================================================ # نقل الذاكرة: مزامنة السياق (تجريبي) **أبعاد مختلفة، مشاركة سلسة** قم بتطوير المنطق على الويب وتنفيذ الكود في بيئة التطوير (IDE). يقوم Voyager بكسر الحواجز بين الأبعاد، مما يمنح IDE الخاص بك "عملية التفكير" من الويب على الفور. ## وداعاً للتنقل المتكرر بين التبويبات أكثر ما يزعج المطورين: مناقشة حل بالتفصيل على الويب، والعودة إلى VS Code/Trae/Cursor لتضطر إلى إعادة شرح المتطلبات وكأنك غريب. نظرًا للحصص وسرعة الاستجابة، فإن الويب هو "الدماغ" وIDE هو "اليدين". يسمح Voyager لهما بمشاركة نفس الروح. ## ثلاث خطوات بسيطة، تنفس متزامن 1. **تثبيت وتفعيل CoBridge**: قم بتثبيت إضافة **CoBridge** في VS Code. إنها الجسر الأساسي الذي يربط واجهة الويب ببيئة التطوير المحلية الخاصة بك (IDE). - **[التثبيت عبر متجر VS Code](https://open-vsx.org/extension/windfall/co-bridge)** ![إضافة CoBridge](/assets/CoBridge-extension.png) بعد التثبيت، **افتح أي دليل عمل**، وانقر فوق الأيقونة الموجودة على اليمين وقم بتشغيل الخادم. ![خادم CoBridge قيد التشغيل](/assets/CoBridge-on.png) 2. **مصافحة الاتصال**: - قم بتمكين "مزامنة السياق" في إعدادات Voyager. - قم بمحاذاة رقم المنفذ. عندما ترى "IDE Online"، فهذا يعني أنهما متصلان. ![لوحة مزامنة السياق](/assets/context-sync-console.png) 3. **مزامنة بنقرة واحدة**: انقر فوق **"Sync to IDE"**. سواء كانت **جداول بيانات** معقدة أو **صوراً توضيحية**، سيتم نقل كل شيء فوراً إلى IDE الخاص بك. ![اكتملت المزامنة](/assets/sync-done.png) ## ترسيخ الجذور بمجرد اكتمال المزامنة، سيظهر ملف `.cobridge/AI_CONTEXT.md` في دليل العمل لبيئة التطوير (IDE) الخاصة بك. سواء كان Trae أو Cursor أو Copilot، فسيقومون تلقائيًا بقراءة هذه «الذاكرة» من خلال ملفات الـ Rule الخاصة بكل منهم. ``` your-project/ ├── .cobridge/ │ ├── images/ │ │ ├── context_img_1_1.png │ │ └── context_img_1_2.png │ └── AI_CONTEXT.md ├── .github/ │ └── copilot-instructions.md ├── .gitignore ├── .traerules └── .cursorrules ``` ## مبادئها - **صفر تلوث**: يقوم CoBridge تلقائيًا بإدارة ملف `.gitignore` ، مما يضمن عدم دفع محادثاتك الخاصة إلى مستودعات Git. - **خبير**: تنسيق Markdown كامل، مما يجعل الذكاء الاصطناعي في IDE يقرأه بسلاسة مثل دليل التعليمات. - **نصيحة**: إذا كانت المحادثة قديمة، فاستخدم [الجدول الزمني] للتمرير لأعلى وجعل الويب "يتذكر" السياق قبل المزامنة للحصول على نتائج أفضل. --- ## ابدأ الآن **الفكر جاهز بالفعل في السحابة، والآن، اتركه يرسخ جذوره محليًا.** - **[تثبيت إضافة CoBridge](https://open-vsx.org/extension/windfall/co-bridge)**: ابحث عن بوابة الأبعاد الخاصة بك وقم بتمكين "التنفس المتزامن" بنقرة واحدة. - **[زيارة مستودع GitHub](https://github.com/Winddfall/CoBridge)**: تعرف على المزيد حول المنطق الكامن وراء CoBridge أو امنح هذا المشروع "مزامنة الأرواح" نجمة. > **النماذج الكبيرة لم تعد تفقد الذاكرة بعد الآن، جاهزة للعمل فورًا.** ================================================ FILE: docs/ar/guide/deep-research.md ================================================ # تصدير Deep Research قم بتصدير التقرير النهائي الذي أنشأته Deep Research، أو احفظ عملية "التفكير" الكاملة كملف Markdown. ## 1. تصدير التقرير (PDF / صورة) يمكن تصدير التقارير التي تم إنشاؤها بواسطة Deep Research كملفات PDF منسقة بشكل جميل أو كصور فردية قابلة للمشاركة (يتم دعم تنسيقات Markdown و JSON أيضاً). ![تصدير التقرير](/assets/deep-research-report-export.png) ## 2. تصدير عملية التفكير (Markdown) بالإضافة إلى التقرير النهائي، يمكنك أيضاً تصدير محتوى "التفكير" الكامل من محادثات Deep Research. ### المميزات - **تصدير بنقرة واحدة**: يظهر زر التنزيل في قائمة المحادثة (⋮) - **تنسيق منظم**: يحافظ على مراحل التفكير، وعناصر التفكير، والمواقع التي تم بحثها بترتيبها الأصلي - **عناوين ثنائية اللغة**: ملفات Markdown تتضمن عناوين الأقسام بالإنجليزية ولغتك الحالية - **تسمية تلقائية**: يتم وضع طابع زمني للملفات لسهولة التنظيم (مثال: `deep-research-thinking-20240128-153045.md`) ### كيفية الاستخدام 1. افتح محادثة Deep Research في Gemini™ 2. انقر فوق زر **مشاركة وتصدير** في المحادثة 3. حدد "تنزيل محتوى التفكير" (Download thinking content) 4. سيتم تنزيل ملف Markdown تلقائياً ![تصدير تفكير Deep Research](/assets/deepresearch_download_thinking.png) ### تنسيق الملف المصدر يتضمن ملف Markdown المصدر: - **العنوان**: عنوان المحادثة - **البيانات الوصفية**: وقت التصدير وإجمالي مراحل التفكير - **مراحل التفكير**: تحتوي كل مرحلة على: - عناصر التفكير (مع العناوين والمحتوى) - المواقع التي تم بحثها (مع الروابط والعناوين) #### مثال على البنية ```markdown # عنوان محادثة Deep Research **وقت التصدير / Exported At:** 2025-12-28 17:25:35 **إجمالي المراحل / Total Phases:** 3 --- ## مرحلة التفكير 1 / Thinking Phase 1 ### عنوان التفكير 1 محتوى التفكير... ### عنوان التفكير 2 محتوى التفكير... #### المواقع التي تم بحثها / Researched Websites - [domain.com](https://example.com) - عنوان الصفحة - [another.com](https://another.com) - عنوان آخر --- ## مرحلة التفكير 2 / Thinking Phase 2 ... ``` ## الخصوصية يتم كل الاستخراج والتنسيق بنسبة 100% محلياً في متصفحك. لا يتم إرسال أي بيانات إلى خوادم خارجية. ================================================ FILE: docs/ar/guide/default-model.md ================================================ # النموذج الافتراضي ::: info **ملاحظة**: هذه الميزة مدعومة في الإصدار 1.1.9 وما بعده. ::: قم بتعيين نموذج Gemini™ المفضل لديك كنموذج افتراضي لتجنب التبديل اليدوي في كل محادثة جديدة.
## المميزات - **إعداد تفاعلي**: يضيف زر "نجمة" مباشرةً في قائمة اختيار النماذج الأصلية لـ Gemini. - **تبديل تلقائي**: يتم التبديل تلقائياً إلى نموذجك المفضل في كل مرة تبدأ فيها محادثة جديدة. - **تفضيل مستمر**: يتم حفظ خيارك ومزامنته عبر أجهزتك. - **محسن للتطبيق وحيد الصفحة (SPA)**: يتم التفعيل بدقة عند النقر على زر "محادثة جديدة"، أو استخدام الاختصارات، أو العودة إلى الصفحة الرئيسية. ## كيفية الاستخدام 1. انقر على **محدد النماذج** فوق منطقة إدخال Gemini. 2. حرك المؤشر فوق النموذج المفضل لديك وانقر على **أيقونة النجمة**. 3. بمجرد أن تصبح النجمة **ممتلئة**، يتم تعيين هذا النموذج كنموذج افتراضي. 4. ستعمل الإضافة تلقائياً على اختيار هذا النموذج لجميع المحادثات الجديدة. 5. لإلغاء التعيين، ما عليك سوى النقر على أيقونة النجمة الممتلئة مرة أخرى. ================================================ FILE: docs/ar/guide/export.md ================================================ # Total Freedom Data lock-in is the enemy. We believe that if you create it, you own it. ## Export Everything Voyager lets you pull your data out of the cloud and into your hands. ### The Formats - **Markdown**: For your Obsidian vault or Notion. Clean, formatted text. (مستخدمو Safari: لا يمكن استخراج الصور بسبب قيود المتصفح، استخدم تصدير PDF للصور) - **PDF**: For sharing or printing. Beautifully laid out, images included. - **JSON**: Raw data. For developers who want to build on top of their history. ### How to Export 1. Hover your mouse over the Gemini logo to see the **Export Icon**. 2. Choose your format. 3. Done. It’s your data. Do what you want with it.

Step 1: Hover Logo

Export guide step 1

Step 2: The Choice

Export guide step 2
### Safari PDF Export Note Exporting PDF on Safari requires a slightly different process (manual print): 1. Click the **Export** button and select PDF format. 2. **Wait for about a second** (allow the page to prepare print styles). 3. Press `Command + P` to open the print dialog. 4. Select **"Save to PDF"** in the print dialog. Safari Export PDF ================================================ FILE: docs/ar/guide/folders.md ================================================ # المجلدات كما يجب أن تكون لماذا تنظيم محادثات الذكاء الاصطناعي صعب للغاية؟ لقد أصلحنا ذلك. قمنا ببناء نظام ملفات لأفكارك.

Gemini™

مجلدات Gemini

AI Studio

مجلدات AI Studio
## فيزياء التنظيم يبدو الأمر صحيحاً تماماً. - **السحب والإفلات**: التقط محادثة. ألقها في مجلد. إنها عملية ملموسة. - **التسلسل الهرمي المتداخل**: المشاريع تحتوي على مشاريع فرعية. قم بإنشاء مجلدات داخل مجلدات. نظمها بطريقتك _الخاصة_. - **تباعد المجلدات**: اضبط كثافة الشريط الجانبي بحرية، من مضغوط إلى واسع. > _ملاحظة: في Mac Safari، قد لا تكون التعديلات فورية؛ قم بتحديث الصفحة لرؤية التأثير._ - **المزامنة الفورية**: نظم على جهاز الكمبيوتر الخاص بك. شاهده على جهازك المحمول. ## نصائح للمحترفين - **التحديد المتعدد**: اضغط مطولاً على عنصر المحادثة للدخول في وضع التحديد المتعدد، ثم حدد محادثات متعددة وانقلها جميعاً مرة واحدة. - **إعادة التسمية**: انقر نقراً مزدوجاً على أي مجلد لإعادة تسميته. - **الأيقونات**: نكتشف تلقائياً نوع الـ Gem (برمجة، إبداع، إلخ) ونخصص الأيقونة الصحيحة. ليس عليك فعل أي شيء. ## اختلافات الميزات حسب المنصة ### ميزات مشتركة - **الإدارة الأساسية**: السحب والإفلات، إعادة التسمية، التحديد المتعدد. - **التعرف الذكي**: يكتشف تلقائياً أنواع المحادثات ويخصص الأيقونات. - **التسلسل الهرمي المتداخل**: دعم تداخل المجلدات. - **تكييف AI Studio**: الميزات المتقدمة ستتوفر قريباً على AI Studio. - **مزامنة Google Drive**: مزامنة هيكل المجلدات مع Google Drive. ### حصري لـ Gemini #### ألوان مخصصة انقر على أيقونة المجلد لتخصيص لونه. اختر من بين 7 ألوان افتراضية أو استخدم ملتقط الألوان لاختيار أي لون تريده. ألوان المجلدات #### عزل الحساب انقر على أيقونة "الشخص" في الرأس لتصفية المحادثات من حسابات Google الأخرى فوراً. حافظ على مساحة عملك نظيفة عند استخدام حسابات متعددة. عزل الحساب #### التنظيم التلقائي بالذكاء الاصطناعي محادثات كثيرة وكسول عن ترتيبها؟ دع Gemini يفكر عنك. بنقرة واحدة تنسخ هيكل محادثاتك الحالي، الصقه في Gemini، وسيولّد خطة مجلدات جاهزة للاستيراد — تنظيم فوري. **الخطوة 1: انسخ هيكل محادثاتك** في أسفل قسم المجلدات في نافذة الإضافة المنبثقة، انقر على زر **AI Organize**. يجمع تلقائياً جميع محادثاتك غير المصنفة وهيكل المجلدات الحالي، ويولّد موجّهاً وينسخه إلى الحافظة. AI Organize Button **الخطوة 2: دع Gemini يرتّب** الصق محتوى الحافظة في محادثة Gemini. سيحلل عناوين محادثاتك ويخرج خطة مجلدات بصيغة JSON. **الخطوة 3: استورد النتائج** انقر على **استيراد المجلدات** من قائمة لوحة المجلدات، اختر **أو لصق JSON مباشرة**، الصق الـ JSON الذي أرجعه Gemini، ثم انقر **استيراد**.
Import Menu
Paste JSON Import
- **الدمج التراكمي**: يستخدم استراتيجية "الدمج" افتراضياً — يضيف فقط المجلدات والتعيينات الجديدة، ولا يدمر تنظيمك الحالي أبداً. - **متعدد اللغات**: يستخدم الموجّه تلقائياً لغتك المُعدّة، وأسماء المجلدات تُولّد بتلك اللغة أيضاً. ### حصري لـ AI Studio - **تعديل الشريط الجانبي**: اسحب لتغيير عرض الشريط الجانبي. - **تكامل المكتبة**: اسحب مباشرة من المكتبة (Library) إلى المجلدات. ================================================ FILE: docs/ar/guide/fork.md ================================================ # تفريع المحادثة (تجريبي) يجب ألا يكون التفكير طريقاً ذا اتجاه واحد. في الاستكشافات المعقدة، غالباً ما نحتاج إلى العودة إلى نقطة حاسمة وتجربة احتمالات مختلفة. مع ميزة **التفريع**، يتيح لك Voyager توسيع أفكارك واستكشاف أكوان موازية من دردشتك. ## كيف تعمل > **⚠️ ملاحظة**: هذه ميزة تجريبية. تحتاج إلى تمكينها أولاً عن طريق النقر على أيقونة الإضافة في شريط الأدوات الخاص بك لفتح نافذة الإعدادات المنبثقة، وتشغيل مفتاح **"تمكين تفريع المحادثة"**. عندما ترغب في اتخاذ مسار مختلف، ما عليك سوى تمرير مؤشر الماوس فوق سؤالك والنقر على زر **تفريع**: ![التفريع](/assets/branching.png) سيقوم Voyager على الفور بالتقاط السياق بالكامل من البداية حتى تلك النقطة و**سيبدأ محادثة جديدة تماماً** من أجلك. في هذا الفرع الجديد، يمكنك تعديل سؤالك بحرية واستكشاف اتجاهات مختلفة دون القلق بشأن تدمير سجل الدردشة الأصلي. أطلق العنان لإبداعك وفضولك! ================================================ FILE: docs/ar/guide/formula-copy.md ================================================ # نسخ الصيغ يجعل Voyager من السهل جداً إعادة استخدام الصيغ الرياضية والرموز العلمية. وهو يدعم النسخ بنقرة واحدة لكود مصدر LaTeX وتنسيق MathML المتوافق مع Microsoft Word. ## مقدمة عندما تطلب من Gemini اشتقاق صيغ أو كتابة تعبيرات رياضية، فإنه عادة ما يعرضها باستخدام LaTeX. وبينما يبدو المظهر جميلاً، فإن استخراج كود المصدر لاستخدامه في أوراقك أو مستنداتك أو محرراتك الخاصة يتطلب غالباً جهداً يدوياً. يوفر Voyager دعماً سلسلاً لهذا: 1. **التعرف التلقائي**: يتعرف Voyager تلقائياً على صيغ LaTeX المعروضة على الصفحة. 2. **زر النسخ**: عند تمرير الماوس فوق صيغة، يظهر رمز النسخ على جانبها الأيمن. 3. **خيارات التنسيق**: انقر فوق الرمز للاختيار: - **Copy LaTeX**: ينسخ كود مصدر LaTeX القياسي، وهو مثالي لـ Overleaf ومحررات Markdown وما إلى ذلك. - **Copy MathML**: ينسخ كود مصدر MathML، وهو أفضل تنسيق للصق مباشرة في **Microsoft Word**. ![نسخ الصيغ](/assets/gemini-math-copy.png) ## المميزات - **التوافق مع Word**: مع دعم MathML، يمكنك لصق الصيغ المعقدة التي ينشئها الذكاء الاصطناعي مباشرة في مستندات Word مع الحفاظ على تنسيق قابل للتحرير بشكل مثالي. - **الحفاظ على السياق**: لا ينسخ الصيغة نفسها فحسب، بل يحافظ أيضاً على سياقها الرياضي. - **استجابة فورية**: تتم المعالجة محلياً بالكامل للحصول على نتائج فورية. ## نصائح الاستخدام - **الكتابة الأكاديمية**: عند كتابة الأوراق البحثية في Word، اجعل Gemini يشتق الصيغ، ثم استخدم نسخ ولصق MathML لتجنب عناء الإدخال اليدوي في محرر معادلات Word. - **تدوين الملاحظات**: عند تدوين الملاحظات في Obsidian أو Notion، ما عليك سوى نسخ مصدر LaTeX مباشرة. ================================================ FILE: docs/ar/guide/getting-started.md ================================================ # مرحباً بك على متن الرحلة تهانينا. لقد قمت للتو بترقية عقلك. Voyager ليس مجرد أداة مساعدة؛ إنه سير عمل. إليك كيفية الاستفادة منه إلى أقصى حد في أول 5 دقائق. ## 1. الإعداد إذا لم تقم بتثبيته بعد، فانتقل إلى [دليل التثبيت](/ar/guide/installation). بمجرد التثبيت، قم بتحديث علامة تبويب Gemini. سترى الفرق على الفور. ## 2. الجدول الزمني ابدأ محادثة. واحدة طويلة. اسأل عن تاريخ الطباعة أو فيزياء الثقوب السوداء. انظر إلى اليمين (أو اليسار في RTL). **شريط النقاط ذاك؟ تلك هي خريطتك.** - **مرر الماوس** لإلقاء نظرة خاطفة على ما قلته. - **انقر** للانتقال الفوري إلى هناك. - **اضغط مطولاً** لتمييز لحظة تريد الاحتفاظ بها بنجمة. لا مزيد من التمرير اللانهائي. أنت الآن تتنقل بسرعة التفكير. ## 3. التنظيم انظر إلى قائمة الدردشة الخاصة بك. هل لاحظت شيئاً جديداً؟ **المجلدات.** التقط محادثة. اسحبها. أسقطها في مجلد. يبدو الأمر طبيعياً، أليس كذلك؟ لأنه كذلك. يمكنك تداخلها، وإعادة تسميتها، وأخيراً إزالة الفوضى من عقلك. ## 4. الخزنة لقد كتبت للتو المطالبة (Prompt) المثالية. لا تدعها تختفي في الفراغ. انقر فوق **أيقونة الشرارة** (✨) في مربع الإدخال. احفظها. ضع علامة عليها. في المرة القادمة؟ فقط انقر فوق الأيقونة للعثور عليها وإدراجها. أنت لا تدردش فقط بعد الآن. أنت تبني خزنة لعبقريتك الخاصة. --- **أنت جاهز.** استكشف الأدلة المحددة للتعمق أكثر: - [إتقان الجدول الزمني](/ar/guide/timeline) - [إدارة المجلدات](/ar/guide/folders) - [هندسة المطالبات](/ar/guide/prompts) - [تصدير البيانات](/ar/guide/export) ================================================ FILE: docs/ar/guide/input-collapse.md ================================================ # طي الإدخال قم بطي منطقة الإدخال عندما تكون فارغة للحصول على مساحة قراءة أكبر. انقر فوق الشريط المطوي للتوسيع والبدء في الكتابة.
طي الإدخال
## كيفية الاستخدام 1. عندما تكون منطقة الإدخال فارغة وتفقد التركيز، يتم طيها تلقائياً في زر مضغوط. 2. انقر فوق الزر لتوسيع منطقة الإدخال والبدء في الكتابة. 3. يمكنك أيضاً الضغط على Ctrl/+I لتوسيع منطقة الإدخال بسرعة. 4. يمكنك تمكين هذه الميزة أو تعطيلها في لوحة الإعدادات (معطلة افتراضياً). ================================================ FILE: docs/ar/guide/installation.md ================================================ # التثبيت ::: info أخبار 🍎 **إضافة Safari الأصلية تم إطلاقها!** هي مجانية بالكامل وتدعم التثبيت بنقرة واحدة. ::: اختر طريقك. > ⚠️ ملاحظة: مدير المطالبات هو الميزة الوحيدة التي تدعم Gemini™ للمؤسسات. ## 1. متاجر الإضافات (موصى به) أبسط طريقة للبدء. التحديثات تلقائية. **Chrome / Brave / Opera / Vivaldi:** [التثبيت من سوق Chrome الإلكتروني](https://chromewebstore.google.com/detail/kjdpnimcnfinmilocccippmododhceol?utm_source=github&utm_medium=docs&utm_campaign=organic_growth&utm_content=ar) ::: warning ⚠️ متجر Chrome الإلكتروني غير متاح مؤقتاً تمت إعادة تسمية الامتداد رسمياً إلى **Voyager** بسبب مخاوف العلامات التجارية. تحديث الاسم في Chrome Web Store لا يزال قيد المراجعة. اطلع على [هذا المنشور](https://x.com/Nag1ovo/status/2031561180213313944) للتفاصيل. استخدم **Edge / Firefox** أو **التثبيت اليدوي** في الوقت الحالي. ::: **Microsoft Edge:** [التثبيت من وظائف Microsoft Edge الإضافية](https://microsoftedge.microsoft.com/addons/detail/gemini-voyager/gibmkggjijalcjinbdhcpklodjkhhlne) **Firefox:** [التثبيت من إضافات Firefox](https://addons.mozilla.org/firefox/addon/gemini-voyager/) ## 2. الطريقة اليدوية (أحدث الميزات) يمكن أن تكون عملية مراجعة متجر الويب بطيئة. إذا كنت تريد أحدث إصدار فوراً، فقم بالتثبيت يدوياً. **لـ Chrome / Edge / Brave / Opera:** 1. قم بتنزيل أحدث `gemini-voyager-chrome-vX.Y.Z.zip` من [إصدارات GitHub](https://github.com/Nagi-ovo/gemini-voyager/releases). 2. قم بفك ضغط الملف. 3. افتح صفحة الإضافات في متصفحك (`chrome://extensions`). 4. قم بتمكين **وضع المطور** (أعلى اليسار أو اليمين حسب اللغة). 5. انقر فوق **تحميل إضافات غير حزمة** وحدد المجلد الذي قمت بفك ضغطه للتو. **لـ Firefox:** 1. قم بتنزيل أحدث `gemini-voyager-firefox-vX.Y.Z.xpi` من [الإصدارات](https://github.com/Nagi-ovo/gemini-voyager/releases). 2. افتح مدير الإضافات (`about:addons`). 3. اسحب ملف `.xpi` وأفلته للتثبيت (أو انقر فوق أيقونة الترس ⚙️ -> **تثبيت إضافة من ملف**). > 💡 ملف XPI موقع رسمياً من Mozilla ويمكن تثبيته بشكل دائم في جميع إصدارات Firefox. ## 3. Safari (macOS) Safari يدعم الآن التوزيع المباشر! قم بتنزيل التطبيق الموقع مسبقاً: 1. قم بتنزيل أحدث إصدار Safari (.dmg). 2. افتح الملف واتبع تعليمات التثبيت. 3. انقر نقراً مزدوجاً لتشغيل التطبيق. 4. قم بالتفعيل في **إعدادات Safari > الإضافات**. > 💡 إصدار Safari موقع مباشرة للتوزيع — لا حاجة لتحويل Xcode! > > ⚠️ **القيود**: نظرًا لطبيعة Safari، فإن (أ) إزالة العلامة المائية (ب) تصدير الصور (يُنصح باستخدام PDF) غير مدعومة. --- _إعداد التطوير؟ إذا كنت مطوراً وتتطلع للمساهمة، تحقق من [دليل المساهمة](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/CONTRIBUTING.md) الخاص بنا._ ================================================ FILE: docs/ar/guide/markdown-fix.md ================================================ # إصلاح عرض Markdown تقوم واجهة ويب Gemini™ أحياناً بإدراج عناصر HTML (مثل مصادر الاقتباس أو علامات التمييز) داخل النص، مما قد يؤدي إلى كسر تنسيق Markdown للنص العريض (`**النص**`)، ويتسبب في عدم ظهور النص بشكل عريض صحيحاً. يتضمن Voyager ميزة إصلاح تلقائي مدمجة تتعرف بذكاء على علامات النص العريض المكسورة هذه وتقوم بإصلاحها، مما يضمن عرض مستنداتك بشكل نظيف ودقيق. > [!INFO] > هذه الميزة مفعلة تلقائياً ولا تتطلب أي إعدادات إضافية. ================================================ FILE: docs/ar/guide/mermaid.md ================================================ # Mermaid Diagram Rendering Automatically render Mermaid code as visual diagrams. ## Overview When Gemini™ outputs Mermaid code blocks (flowcharts, sequence diagrams, Gantt charts, etc.), Voyager automatically detects and renders them as interactive diagrams. ### Key Features - **Auto-detection**: Supports `graph`, `flowchart`, `sequenceDiagram`, `gantt`, `pie`, `classDiagram`, and all major Mermaid diagram types - **Toggle view**: Switch between rendered diagram and source code with one click - **Fullscreen mode**: Click the diagram to enter fullscreen with zoom and pan support - **Dark mode**: Automatically adapts to page theme ## How to Use 1. Ask Gemini to generate any Mermaid diagram code 2. The code block is automatically replaced with the rendered diagram 3. Click the ** Code** button to view source code 4. Click the **📊 Diagram** button to switch back to diagram view 5. Click the diagram area to enter fullscreen ## Fullscreen Controls - **Scroll wheel**: Zoom in/out - **Drag**: Pan the diagram - **+/-**: Toolbar zoom buttons - **⊙**: Reset view - **✕ / ESC**: Close fullscreen ## التوافق وإصلاح المشكلات ::: warning ملاحظة - **قيود Firefox**: بسبب قيود البيئة، يستخدم Firefox الإصدار 9.2.2 ولا يدعم الميزات الجديدة مثل **Timeline** أو **Sankey**. - **أخطاء الصياغة**: غالباً ما يكون فشل المعالجة بسبب أخطاء في صياغة الكود الناتج من Gemini. نحن نقوم بجمع الحالات السيئة (Bad Cases) لإصلاح أخطاء التوليد الشائعة تلقائياً في التحديثات القادمة. :::
Mermaid diagram rendering
================================================ FILE: docs/ar/guide/nanobanana.md ================================================ # NanoBanana Option ::: warning توافق المتصفح حالياً، ميزة **NanoBanana** **غير مدعومة على متصفح Safari** بسبب قيود واجهة برمجة تطبيقات المتصفح. نوصي باستخدام **Chrome** or **Firefox** إذا كنت بحاجة إلى استخدام هذه الميزة. يمكن لمستخدمي Safari تحميل صورهم يدوياً إلى مواقع مثل [banana.ovo.re](https://banana.ovo.re/) لمعالجتها (على الرغم من أن النجاح غير مضمون لجميع الصور بسبب اختلاف الدقة). ::: **AI Images, kept pure.** Images generated by Gemini™ come with a visible watermark by default. While this is intended for safety, there are creative scenarios where you need a perfectly clean slate. ## Lossless Reconstruction NanoBanana uses a **Reverse Alpha Blending** algorithm. - **Not AI Inpainting**: Traditional watermark removal often uses AI to "smear" the area, which destroys pixel details. - **Pixel Perfection**: We use mathematical calculations to precisely remove the transparent watermark layer, restoring the 100% original pixels. - **Zero Quality Loss**: The processed image remains identical to the original in all non-watermarked areas. ## How to Use 1. **Enable it**: Find "NanoBanana Option" at the end of the Voyager settings panel and toggle it on. 2. **Auto-process**: Every image you generate will now be automatically processed in the background. 3. **Download directly**: - Hover over a processed image and you'll see a 🍌 button. - **The 🍌 button completely replaces** the native download button to ensure you always get the 100% unwatermarked image directly.
NanoBanana Demo
## Acknowledgement This feature is based on the [gemini-watermark-remover](https://github.com/journey-ad/gemini-watermark-remover) project by [journey-ad (Jad)](https://github.com/journey-ad), which is a JavaScript port of the [original C++ implementation](https://github.com/allenk/GeminiWatermarkTool) by [allenk](https://github.com/allenk). We are grateful for their contributions to the community. 🧡 ## Privacy & Security All processing happens **locally in your browser**. Your images are never uploaded to any third-party servers, ensuring your privacy and creative security. ================================================ FILE: docs/ar/guide/prevent-auto-scroll.md ================================================ # منع التمرير التلقائي عندما تقوم بقراءة المحادثات السابقة، فإن إرسال مطالبة (Prompt) جديدة وتوليد إجابة من Gemini™ يجبر الصفحة على التمرير التلقائي إلى الأسفل بشدة لمتابعة النص الجديد. قد يسبب هذا الإزعاج ويقطع تسلسل القراءة الخاصة بك. ميزة **منع التمرير التلقائي** توقف هذا السلوك الغير المرغوب به: - عندما تقوم بالتمرير للأعلى لقراءة المحادثة، سيقوم النظام بمنع الصفحة من النزول تلقائياً إلى الأسفل. - هذه الميزة **معطلة** بشكل افتراضي. يمكنك تفعيلها من خلال إعدادات الإضافة ضمن "Timeline Options". ## كيفية التفعيل 1. انقر على أيقونة إضافة Voyager في متصفحك لفتح النافذة. 2. ابحث عن قسم "Timeline Options" (خيارات الجدول الزمني). 3. قم بتفعيل الخيار "Prevent auto-scroll to bottom" (منع التمرير التلقائي للأسفل). ================================================ FILE: docs/ar/guide/prompts.md ================================================ # أصلك الرقمي: مكتبة المطالبات قضيت وقتاً طويلاً في كتابة مطالبة (Prompt) مذهلة ساعدت كثيراً. تستخدمها وترميها؟ لا، احفظها. ## خزنة الأوامر هذه هي خزنة الأوامر الخاصة بك. ### 1. التقاط هل كتبت شيئاً جيداً؟ انقر فوق **الأيقونة العائمة** بجوار مربع الإدخال. احفظها في الخزنة، لتشعر بالأمان. ### 2. تصنيف أضف وسوماً مثل `#كود`، `#بريد_إلكتروني`، `#أكاديمي`. يجب أن تكون الأدوات مفيدة ومنظمة أيضاً. ### 3. نشر في المرة القادمة التي تحتاج إليها، لا تعيد كتابة كل شيء. افتح المكتبة، ابحث عن طريق الوسم، انقر للإدراج. استدعاء بنقرة واحدة، ضاعف الكفاءة. ![مدير المطالبات](/assets/gemini-prompt-manager.png) ## يعمل على أي موقع يمكن الآن استخدام مدير المطالبات على أي موقع تختاره، ولا يقتصر على Gemini™ و AI Studio. ### كيفية التفعيل 1. انقر فوق أيقونة Voyager في شريط أدوات إضافات المتصفح. 2. مرر لأسفل إلى قسم **مدير المطالبات**. 3. أدخل عنوان URL للموقع (مثل: `chatgpt.com` أو `claude.ai`). 4. انقر فوق **إضافة موقع** وامنح الإذن. 5. **قم بتحديث الصفحة المستهدفة**، وسترى الكرة العائمة. ### أمثلة لمواقع AI الشائعة - `chatgpt.com` - ChatGPT - `claude.ai` - Claude - `copilot.microsoft.com` - Microsoft Copilot - `poe.com` - Poe ::: tip في المواقع المخصصة، يتم تفعيل ميزة مدير المطالبات **فقط**. الميزات الأخرى مثل الجدول الزمني والمجلدات وما إلى ذلك مخصصة لـ Gemini ولن يتم تحميلها. ::: ================================================ FILE: docs/ar/guide/quote-reply.md ================================================ # الرد مع اقتباس حدد للاقتباس، تماماً مثل Discord أو Slack. حدد أي نص في رد Gemini™، وسيظهر زر **"اقتباس"**. انقر عليه لإدراج المحتوى المحدد في مربع الإدخال، منسقاً كاقتباس Markdown. هذا مفيد بشكل خاص لطرح أسئلة متابعة حول أجزاء معينة من إجابة طويلة.
الرد مع اقتباس
================================================ FILE: docs/ar/guide/recents-hider.md ================================================ # إخفاء العناصر الأخيرة والـ Gems ::: info **ملاحظة**: هذه الميزة مدعومة في الإصدار 1.1.9 وما بعده. ::: أضف مفتاح تبديل أنيق لإخفاء قسم "المحفوظات مؤخرًا" في صفحة Gemini™ الرئيسية للحصول على واجهة أكثر ترتيبًا. يدعم الآن أيضًا إخفاء قائمة Gems في الشريط الجانبي!

إخفاء المحفوظات مؤخرًا

إخفاء قائمة Gems

## المميزات - **تبديل سياقي**: يظهر زر إخفاء خفي فقط عند تمرير الماوس فوق قسم العناصر الأخيرة. - **حالة تبسيطية**: عند الإخفاء، يتم استبداله بـ "شريط نظرة خاطفة" خفيف في الأسفل. - **استعادة بنقرة واحدة**: ما عليك سوى تمرير الماوس فوق شريط النظرة الخاطفة والنقر لاستعادة العناصر الأخيرة فورًا. - **حماية الخصوصية**: يمنع الآخرين القريبين من رؤية أنشطتك الأخيرة، مثالي للأماكن العامة. - **الاستمرارية**: يتم حفظ تفضيلاتك وتطبيقها تلقائيًا في زيارتك القادمة. ## كيفية الاستخدام 1. مرر الماوس فوق قسم "الأخيرة" في صفحة Gemini الرئيسية. 2. انقر فوق أيقونة العين المشطوبة التي تظهر في الزاوية العلوية اليمنى لإخفاء القسم. 3. للاستعادة، مرر الماوس فوق الخط الرفيع المتبقي في أسفل المنطقة وانقر. ================================================ FILE: docs/ar/guide/settings.md ================================================ # عرض الدردشة استخدم شاشتك العريضة بالكامل. يقوم Gemini™ بتقييد المحتوى الرئيسي بعرض ثابت. يقوم Voyager بتحرير ذلك. انتقل إلى لوحة الإعدادات واسحب شريط تمرير **"عرض الدردشة"**. - **توسيع**: مثالي جداول الكود، وتحليل البيانات، والنوافذ المقسمة. - **تركيز**: قم بتضييقه للقراءة العميقة دون تشتيت.
ضبط عرض الدردشة
## ترتيب مخصص هل يوجد أقسام كثيرة في النافذة المنبثقة والأقسام التي تستخدمها أكثر مدفونة في الأسفل؟ مرر الماوس فوق أي بطاقة إعدادات وستظهر أزرار ▲/▼ في الزاوية العلوية اليمنى. انقر لتحريك البطاقة لأعلى أو لأسفل. يتم حفظ ترتيبك تلقائيًا. ## التأثيرات البصرية اختر `ثلج` أو `ساكورا` أو `مطر` لأجواء موسمية. Voyager لا يقتصر على التحسينات العملية. يمكنك أيضاً تغيير مزاج الصفحة. - **ثلج**: رقاقات ثلج ناعمة لإحساس شتوي هادئ. - **ساكورا**: بتلات أزهار الكرز لأجواء ربيعية أخف. - **مطر**: طبقة مطر سينمائية بخطوط مائلة وقطرات خفيفة. - **التبديل السلس**: عند إيقاف التأثير أو التبديل لآخر، تتلاشى الجسيمات بشكل طبيعي. ================================================ FILE: docs/ar/guide/sidebar-auto-hide.md ================================================ # إخفاء الشريط الجانبي تلقائياً هل تريد تجربة دردشة أكثر اندماجاً؟ نحن نوفر ميزة **إخفاء الشريط الجانبي تلقائياً**. عند تفعيلها، سيتم طي الشريط الجانبي تلقائياً عندما يغادر الماوس المنطقة، ويتم توسيعه تلقائياً عندما تحرك الماوس نحوه. ### عرض توضيحي
### كيفية التفعيل 1. افتح لوحة إعدادات Voyager. 2. ابحث عن مفتاح **Auto-hide sidebar** في **الإعدادات العامة**. 3. قم بتشغيل المفتاح للتفعيل. _ملاحظة: هذه الميزة تدعم حالياً Google Gemini فقط._ ================================================ FILE: docs/ar/guide/sidebar.md ================================================ # عرض الشريط الجانبي هل أسماء المجلدات طويلة جدًا ولا تظهر بالكامل؟ أو هل يأخذ الشريط الجانبي مساحة كبيرة من الدردشة؟ الآن يمكنك ضبط عرض الشريط الجانبي بحرية. ## كيفية الضبط 1. افتح لوحة إعدادات Voyager (انقر فوق أيقونة الإضافة في أعلى يمين المتصفح). كيفية فتح لوحة الإعدادات 2. ابحث عن خيار **عرض الشريط الجانبي**. 3. اسحب المؤشر لاختيار العرض المناسب لك. - **ضيق**: توفير المساحة والتركيز على المحادثة. - **واسع**: رؤية أسماء المجلدات الطويلة بوضوح. ## المنصات المدعومة هذه الميزة تدعم: - **Google Gemini** - **Google AI Studio** يتم حفظ إعداداتك تلقائيًا. ================================================ FILE: docs/ar/guide/sponsor.md ================================================ # رعاية المشروع > [!NOTE] > إذا كان Voyager مفيداً لك، فشاركْه على X أو Reddit أو YouTube إلخ. كل مشاركة تساعد المزيد من الناس على اكتشاف المشروع وتحسين تجربة Gemini. شكراً. إذا كان Voyager يحسن إنتاجيتك اليومية، يرجى التفكير في رعاية المشروع. يساعدنا دعمك في الحفاظ على التطوير النشط، وإصلاح الأخطاء، وإضافة ميزات جديدة. ## طرق الدعم ### 💖 رعاة GitHub الطريقة المفضلة. يذهب 100% من رعايتك للمطور (لا يتقاضى GitHub رسوماً). [رعاة GitHub](https://github.com/sponsors/Nagi-ovo) ### ☕ اشتري لي قهوة طريقة بسيطة لتقديم قهوة كشكر. [اشتري لي قهوة](https://buymeacoffee.com/nagiovo) ### ⭐ نجمة على GitHub إنه مجاني ويساعد كثيراً! امنح مستودعنا نجمة لمساعدتنا في الوصول إلى المزيد من الأشخاص. [نجوم GitHub](https://github.com/Nagi-ovo/gemini-voyager) ## أين تذهب الأموال؟ - **رسوم مطور Apple**: للحفاظ على إصدار Safari حياً وموقعاً ($99/سنة). - **الخادم والنطاق**: لاستضافة هذه الوثائق وخدمات الخلفية. - **القهوة**: وقود أساسي لتحويل الكود إلى ميزات. شكراً لكونك Voyager! 🚀 ================================================ FILE: docs/ar/guide/tab-title.md ================================================ # مزامنة عنوان علامة التبويب لا تضيع أبداً في بحر من علامات تبويب "Gemini™". افتراضياً، تقول جميع علامات تبويب Gemini ببساطة "Gemini". عندما يكون لديك 10 علامات تبويب مفتوحة، فإن العثور على العلامة الصحيحة هو كابوس. يقوم Voyager تلقائياً بتغيير عنوان علامة تبويب المتصفح ليطابق عنوان المحادثة الحالية. - **قبل**: Gemini, Gemini, Gemini - **بعد**: فيزياء الكم، وصفة المعكرونة، تصحيح أخطاء Python اعثر على ما تحتاجه بلمحة. ================================================ FILE: docs/ar/guide/timeline.md ================================================ # تصفح الجدول الزمني ميزة Voyager المميزة. طريقة بصرية ومكانية لتصفح محادثاتك. ## المشكلة يمكن أن تصبح محادثات الذكاء الاصطناعي طويلة. طويلة جداً. التمرير بطيء. "Cmd+F" غير عملي. تفقد السياق. ## الحل انظر إلى يمين (أو يسار) الشاشة. هذا هو الجدول الزمني. تمثل كل نقطة تبادلاً (سؤالك + إجابة Gemini™). ### التفاعلات - **تحويم (Hover)**: شاهد معاينة فورية لما تمت مناقشته في تلك النقطة. لا نقر، لا تمرير. مجرد نظرة خاطفة. - **نقر**: انتقل فوراً إلى تلك الرسالة. انتقال آني. - **تمييز السياق**: أثناء التمرير، تضيء النقطة المقابلة، حتى تعرف دائماً مكانك على "الخريطة". ## المفضلة (Stars) اضغط مطولاً (أو انقر بزر الماوس الأيمن) على أي نقطة **لتمييزها بنجمة**. تصبح النقاط المميزة بنجمة أكبر وأكثر سطوعاً. استخدمها لتمييز: - الكود النهائي الذي يعمل. - أفضل شرح لمفهوم ما. - المطالبة التي فتحت كل شيء. يحول الجدول الزمني جداراً من النص العادي إلى خريطة منظمة للمعرفة. ================================================ FILE: docs/ar/index.md ================================================ --- layout: home hero: name: 'Voyager' text: 'نظام التشغيل المفقود لـ Gemini.' tagline: 'نحن نحب Gemini. أردنا فقط أن يكون مثالياً.' image: src: /logo.png alt: شعار Voyager actions: - theme: brand text: تحميل link: ./guide/installation - theme: alt text: ابدأ الرحلة link: ./guide/getting-started teaser: title: 'إنه يعمل ببساطة.' description: 'لم نرد بناء مجرد إضافة أخرى. أردنا بناء طريقة أفضل للتفكير.
عندما تستخدم Voyager، تتوقف عن مصارعة الواجهة وتبدأ في الانسياب معها.' image: '/assets/teaser.png' features: - title: 'الجدول الزمني' details: 'لا تمرر الشاشة. حلق. اقفز إلى أي نقطة في محادثتك فوراً.' - title: 'المجلدات' details: 'أخيراً، نظام ملفات للذكاء الاصطناعي الخاص بك. أصلي، بديهي، وقوي.' - title: 'الحرية' details: 'بياناتك ملكك. قم بالتصدير إلى JSON أو Markdown أو PDF بنقرة واحدة.' features: - icon: 🧭 title: الجدول الزمني details: خريطة لعقلك. تنقل في المحادثات بصرياً. - icon: 🗂️ title: المجلدات details: نظام من الفوضى. سحب، إفلات، تم. - icon: ✨ title: الخزنة details: إبداعك محفوظ. احفظ وأعد استخدام أفضل مطالباتك. - icon: 💬 title: الرد مع اقتباس details: حدد للاقتباس. ردود مدركة للسياق لتواصل فعال. - icon: ↔️ title: عرض الدردشة details: وسّع رؤيتك. اضبط عرض الدردشة بحرية لتجربة مشاهدة أفضل. - icon: 💾 title: تصدير الدردشة details: سيادة البيانات. الأرشفة بتنسيقات متعددة لكي لا تضيع المعرفة أبداً. - icon: 🌦️ title: التأثيرات البصرية details: اضبط الأجواء كما تريد. بدّل بين الثلج والمطر وبتلات الساكورا من النافذة المنبثقة. - icon: 🍌 title: إزالة العلامة المائية NanoBanana details: إزالة العلامة المائية بدون فقدان للجودة. حافظ على لحظات الذكاء الاصطناعي نقية. - icon: 📐 title: نسخ الصيغ details: نسخ بنقرة واحدة لأكواد المصدر LaTeX و MathML (Word). - icon: 🧜‍♀️ title: رسوم بيانية Mermaid details: من كود إلى مرئيات. مخططات انسيابية، مخططات تسلسلية، ومخططات غانت تظهر فوراً. - icon: 🏷️ title: مزامنة عنوان علامة التبويب details: اعرف بلمحة. مزامنة تلقائية لعنوان علامة تبويب المتصفح مع دردشتك. - icon: 🔀 title: تفريع المحادثة (تجريبي) details: التفكير التباعدي. فرع المحادثة عند أي عقدة لاستكشاف احتمالات مختلفة. - icon: 🗑️ title: الحذف الجماعي details: تنظيف بالجملة. حدد محادثات متعددة واحذفها جميعاً دفعة واحدة. - icon: ☁️ title: المزامنة السحابية details: دائماً متصل. انسخ المجلدات والمطالبات احتياطياً إلى Google Drive عبر الأجهزة. - icon: ⚡️ title: النموذج الافتراضي details: توقف عن تكرار نفسك. التبديل التلقائي إلى نموذجك المفضل في المحادثات الجديدة. - icon: 🔬 title: البحث العميق details: افتح الصندوق الأسود. استخرج عمليات التفكير وروابط البحث من جلسات Deep Research. ---
⚠️ إشعار تغيير الاسم: بسبب مخاوف تتعلق بالعلامات التجارية وحقوق النشر، تم تغيير اسم هذا الامتداد رسمياً إلى Voyager. ومع ذلك، بسبب البطء الشديد في عملية مراجعة Chrome Web Store، لم يتم الموافقة على تغيير الاسم خلال 7 أيام — وهو غير متاح مؤقتاً على Chrome Web Store.

كل تثبيت هو تصويت بالثقة

أرقام حية من متجر Chrome الإلكتروني و GitHub. شكراً لركوبكم معنا، أيها المسافرون الزملاء.

نجوم GitHub تشعبات GitHub أحدث إصدار تنزيلات GitHub مستخدمو متجر Chrome الإلكتروني تقييم متجر Chrome الإلكتروني إضافات Edge مستخدمو إضافات Firefox تقييم إضافات Firefox
Nagi-ovo%2Fgemini-voyager | Trendshift

شكر خاص

✨ نحن مباشرون على Product Hunt! نود سماع أفكاركم وملاحظاتكم. ❤️

Voyager على Product Hunt

"إنها ليست مجرد أداة. إنها دراجة للعقل."

انظر ما هو ممكن ←

================================================ FILE: docs/ar/privacy.md ================================================ # سياسة الخصوصية آخر تحديث: 16 مارس 2026 ## مقدمة يلتزم Voyager ("نحن"، "نا"، أو "لنا") بحماية خصوصيتك. توضح سياسة الخصوصية هذه كيفية قيام إضافة المتصفح الخاصة بنا بجمع معلوماتك واستخدامها وحمايتها. ## جمع البيانات واستخدامها **نحن لا نجمع أي معلومات شخصية.** يعمل Voyager بالكامل داخل متصفحك. يتم تخزين جميع البيانات التي يتم إنشاؤها أو إدارتها بواسطة الإضافة (مثل المجلدات وقوالب الأوامر والرسائل المفضلة والإعدادات): 1. محلياً على جهازك (`chrome.storage.local`) 2. في التخزين المتزامن لمتصفحك (`chrome.storage.sync`) إذا كان متاحاً، لمزامنة الإعدادات عبر أجهزتك. ليس لدينا حق الوصول إلى بياناتك الشخصية أو سجل الدردشة أو أي معلومات خاصة أخرى. نحن لا نتتبع سجل تصفحك. ## مزامنة Google Drive (اختياري) إذا قمت بتفعيل ميزة مزامنة Google Drive بشكل صريح، تستخدم الإضافة واجهة Chrome Identity API للحصول على رمز OAuth2 (بنطاق `drive.file` فقط) لعمل نسخة احتياطية من مجلداتك وأوامرك إلى **Google Drive الخاص بك**. يتم هذا النقل مباشرة بين متصفحك وخوادم Google. ليس لدينا حق الوصول إلى هذه البيانات، ولا يتم إرسالها أبداً إلى أي خادم نديره. ## الأذونات تطلب الإضافة الحد الأدنى من الأذونات اللازمة للعمل: - **Storage (التخزين)**: لحفظ تفضيلاتك ومجلداتك وأوامرك ورسائلك المفضلة وخيارات تخصيص الواجهة محلياً وعبر الأجهزة. - **Identity (الهوية)**: لمصادقة Google لميزة مزامنة Google Drive الاختيارية. يُستخدم فقط عند تفعيل المزامنة السحابية بشكل صريح. - **Scripting (البرمجة النصية)**: لحقن نصوص المحتوى ديناميكياً في صفحات Gemini وفي المواقع المخصصة التي يحددها المستخدم لميزة مدير الأوامر. يتم حقن النصوص المضمنة في الإضافة فقط — لا يتم جلب أو تنفيذ أي كود عن بُعد. - **Host Permissions (أذونات المضيف)** (gemini.google.com، aistudio.google.com، إلخ): لحقن نصوص المحتوى التي تعزز واجهة Gemini بميزات مثل المجلدات والتصدير والخط الزمني والاقتباس في الرد. نطاقات Google الإضافية (googleapis.com، accounts.google.com) مطلوبة لمصادقة مزامنة Google Drive. - **Optional Host Permissions (أذونات المضيف الاختيارية)** (جميع عناوين URL): تُطلب فقط في وقت التشغيل عند إضافة مواقع مخصصة لمدير الأوامر بشكل صريح. لا يتم تفعيلها أبداً دون إجراء من المستخدم. ## خدمات الطرف الثالث لا يشارك Voyager أي بيانات مع خدمات الطرف الثالث أو المعلنين أو مزودي التحليلات. ## التغييرات على هذه السياسة قد نقوم بتحديث سياسة الخصوصية الخاصة بنا من وقت لآخر. سنخطرك بأي تغييرات عن طريق نشر سياسة الخصوصية الجديدة على هذه الصفحة. ## اتصل بنا إذا كان لديك أي أسئلة حول سياسة الخصوصية هذه، يرجى الاتصال بنا عبر [مستودع GitHub](https://github.com/Nagi-ovo/gemini-voyager). ================================================ FILE: docs/en/guide/batch-delete.md ================================================ # Batch Delete Delete multiple conversations at once, no more deleting one by one. ## Features - **Multi-select Mode**: Long-press any conversation to enter multi-select mode and check multiple conversations to delete. - **One-click Cleanup**: Once selected, click the delete button to remove all selected conversations at once. - **Progress Feedback**: Real-time progress is displayed during deletion so you know the current status. - **Safe Confirmation**: A confirmation dialog appears before deletion to prevent accidental operations.
Batch Delete
## How to Use 1. In the sidebar conversation list, **long-press** any conversation item. 2. After entering multi-select mode, checkboxes will appear on the left side of each conversation. 3. Check the conversations you want to delete (up to 50 at a time). 4. Click the **Delete button** that appears. 5. Click "Confirm" in the red confirmation area that appears **above the folder list** to start the deletion. ::: tip Note The confirmation panel overlays the folder area to avoid blocking the conversation list. Batch delete operations cannot be undone, so please proceed with caution. ::: ================================================ FILE: docs/en/guide/cloud-sync.md ================================================ # Cloud Sync Sync your folders, prompt library, and other data to Google Drive to keep your experience consistent across devices. ## Features - **Multi-Device Sync**: Keep your configurations in sync across multiple computers using Google Drive. - **Data Privacy**: Data is stored directly in your own Google Drive storage, ensuring privacy without third-party servers. - **Flexible Sync**: Support for manual uploading and downloading/merging of data. ::: info **Coming Soon**: The next version will support syncing starred conversations. ::: ## How to Use 1. Click the extension icon in the bottom-right corner of the Gemini™ page to open the settings panel. 2. Locate the **Cloud Sync** section. 3. Click **Sign in with Google** and complete the authorization. 4. Once authorized, click **Upload to Cloud** to sync your local data to the cloud, or **Download & Merge** to bring cloud data to your local machine. ### 💡 Quick Sync The easiest way is to click the **"Upload to Cloud"** or **"Download & Merge"** buttons at the top of the folder area in the left sidebar. Cloud Sync Quick Buttons ::: warning **Security Recommendation: Double Protection** While Cloud Sync offers great convenience, we strongly recommend that you also periodically back up your core data using **local files**. 1. **Full Export**: Export a complete package containing all settings, folders, and prompts from "Backup & Restore" at the bottom of the settings panel. Full Export 2. **Export All Folders**: Click "Export" in the "Folders" section of the settings panel to back up all your folders and conversations, excluding prompts. Export All Folders ::: ================================================ FILE: docs/en/guide/community.md ================================================ # Community & Feedback We value every user's voice. Whether you've found a bug, have a feature suggestion, or want to share your prompt vault, there are several ways to get in touch. ## 📢 Follow for Updates Follow us on X (Twitter) to get the latest development updates. - **New Releases**: Be the first to know about updates. - **Feature Previews**: Get a sneak peek at upcoming features. ## 💬 Discord Community Join our Discord server to chat with other Voyagers! - **Real-time Chat**: Talk directly with other users and the developers. - **Prompt Sharing**: See how others are using Gemini™ and share your best prompts. - **Development Updates**: Get the latest news on upcoming features and releases. ## 🐙 GitHub Issues If you've found a bug or have a specific feature request, please open an issue on GitHub: - [Report a Bug](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=bug_report.yml) - [Suggest a Feature](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=feature_request.yml) Thank you for supporting Voyager! ❤️ ================================================ FILE: docs/en/guide/context-sync.md ================================================ # Memory Transport: Context Sync (Experimental) **Different Dimensions, Seamless Sharing** Iterate logic on the web, and implement code in the IDE. Voyager breaks down the dimensional barriers, giving your IDE the "thinking process" of the web instantly. ## No More Tab Hopping The biggest pain for developers: after discussing a solution thoroughly on the web, you return to VS Code/Trae/Cursor only to have to re-explain the requirements like a stranger. Due to quotas and response speeds, the web is the "brain" and the IDE is the "hands." Voyager lets them share the same soul. ## Three Simple Steps to Synchronize 1. **Install and Wake Up CoBridge**: Install the **CoBridge** extension in VS Code. It serves as the core bridge connecting the web interface and your local IDE. - **[Install via VS Code Marketplace](https://open-vsx.org/extension/windfall/co-bridge)** ![CoBridge Extension](/assets/CoBridge-extension.png) After installation, **open any working directory**, click the icon on the right and start the server. ![CoBridge Server On](/assets/CoBridge-on.png) 2. **Handshake Connection**: - Enable "Context Sync" in Voyager settings. - Align the port numbers. When you see "IDE Online," they are connected. ![Context Sync Console](/assets/context-sync-console.png) 3. **One-Click Sync**: Click **"Sync to IDE"**. Whether it's complex **data tables** or intuitive **reference images**, everything can be instantly synchronized to your IDE. ![Sync Done](/assets/sync-done.png) ## Rooting in the IDE After synchronization, a `.cobridge/AI_CONTEXT.md` file will appear in your IDE working directory. Whether it's Trae, Cursor, or Copilot, they will automatically read this "memory" through their respective Rule files. ``` your-project/ ├── .cobridge/ │ ├── images/ │ │ ├── context_img_1_1.png │ │ └── context_img_1_2.png │ └── AI_CONTEXT.md ├── .github/ │ └── copilot-instructions.md ├── .gitignore ├── .traerules └── .cursorrules ``` ## Principles - **Zero Pollution**: CoBridge automatically handles `.gitignore`, ensuring your private conversations are never pushed to Git repositories. - **Industry Savvy**: Full Markdown format, making it as smooth for the AI in your IDE to read as an instruction manual. - **Pro Tip**: If the conversation is from a while ago, scroll up using the [Timeline] first to let the web "remember" the context for better sync results. --- ## Ready for Liftoff **The logic is primed in the cloud; now, let it take root locally.** - **[Install CoBridge Extension](https://open-vsx.org/extension/windfall/co-bridge)**: Find your dimensional portal and activate "synchronized breathing" with a single click. - **[Access GitHub Repository](https://github.com/Winddfall/CoBridge)**: Dive deep into the underlying logic of CoBridge, or give a Star to this "soul-syncing" project. > **LLMs will never lose their memory again; ready for action right out of the box.** ================================================ FILE: docs/en/guide/deep-research.md ================================================ # Deep Research Export Export the final report generated by Deep Research, or save its complete "thinking" process as a Markdown file. ## 1. Report Export (PDF / Image) Reports generated by Deep Research can be exported as beautifully formatted PDFs or shareable single images (Markdown and JSON formats are also supported). ![Report Export](/assets/deep-research-report-export.png) ## 2. Thinking Process Export (Markdown) In addition to the final report, you can also export the complete "thinking" content from Deep Research conversations. ### Features - **One-click export**: Download button appears in the conversation menu (⋮) - **Structured format**: Preserves thinking phases, thought items, and researched websites in their original order - **Bilingual headers**: Markdown files include section headers in both English and your current language - **Automatic naming**: Files are timestamped for easy organization (e.g., `deep-research-thinking-20240128-153045.md`) ### How to Use 1. Open a Deep Research conversation on Gemini™ 2. Click the **Share & Export** button in the conversation 3. Select "Download thinking content" (下载 Thinking 内容) 4. The Markdown file will be automatically downloaded ![Deep Research Thinking Export](/assets/deepresearch_download_thinking.png) ### Exported File Format The exported Markdown file includes: - **Title**: The conversation title - **Metadata**: Export timestamp and total number of thinking phases - **Thinking Phases**: Each phase contains: - Thought items (with headers and content) - Researched websites (with links and titles) #### Example Structure ```markdown # Deep Research Conversation Title **导出时间 / Exported At:** 2025-12-28 17:25:35 **总思考阶段 / Total Phases:** 3 --- ## 思考阶段 1 / Thinking Phase 1 ### Thought Title 1 Thought content... ### Thought Title 2 Thought content... #### 研究网站 / Researched Websites - [domain.com](https://example.com) - Page Title - [another.com](https://another.com) - Another Title --- ## 思考阶段 2 / Thinking Phase 2 ... ``` ## Privacy All extraction and formatting happens 100% locally in your browser. No data is sent to external servers. ================================================ FILE: docs/en/guide/default-model.md ================================================ # Default Model ::: info **Note**: This feature is supported in version 1.1.9 and later. ::: Set a preferred Gemini™ model as your default to avoid manual switching for every new conversation.
## Features - **Interactive Setup**: Adds a "Star" button directly into Gemini's native model selection menu. - **Auto-Switching**: Automatically switches to your preferred model whenever you start a new conversation. - **Persistent Preference**: Your choice is saved and synced across your devices. - **SPA Optimized**: Accurately triggers when clicking the "New Chat" button, using shortcuts, or navigating back to the home page. ## How to Use 1. Click the **Model Selector** above the Gemini input area. 2. Hover over your preferred model and click the **Star icon**. 3. Once the star is **filled**, that model is set as your default. 4. The extension will now automatically select this model for all new chats. 5. To unset, simply click the filled star icon again. ================================================ FILE: docs/en/guide/export.md ================================================ # Total Freedom Data lock-in is the enemy. We believe that if you create it, you own it. ## Export Everything Voyager lets you pull your data out of the cloud and into your hands. ### The Formats - **Markdown**: For your Obsidian vault or Notion. Clean, formatted text. (Safari Users: Images cannot be extracted due to browser limitations, use PDF export for images) - **PDF**: For sharing or printing. Beautifully laid out, images included. - **JSON**: Raw data. For developers who want to build on top of their history. ### How to Export 1. Hover your mouse over the Gemini logo to see the **Export Icon**. 2. Choose your format. 3. Done. It’s your data. Do what you want with it.

Step 1: Hover Logo

Export guide step 1

Step 2: The Choice

Export guide step 2
### Safari PDF Export Note Exporting PDF on Safari requires a slightly different process (manual print): 1. Click the **Export** button and select PDF format. 2. **Wait for about a second** (allow the page to prepare print styles). 3. Press `Command + P` to open the print dialog. 4. Select **"Save to PDF"** in the print dialog. Safari Export PDF ================================================ FILE: docs/en/guide/folders.md ================================================ # Folders Done Right Why is organizing AI chats so hard? We fixed it. We built a file system for your thoughts.

Gemini™

Gemini Folders

AI Studio

AI Studio Folders
## The Physics of Organization It just feels right. - **Drag and Drop**: Pick up a chat. Drop it in a folder. It’s tactile. - **Nested Hierarchy**: Projects have sub-projects. Create folders inside folders. Structure it _your_ way. - **Folder Spacing**: Adjust vertical density from compact to spacious. > _Note: On Mac Safari, adjustments may not be real-time; refresh the page to see the effect._ - **Instant Sync**: Organize on your desktop. See it on your laptop. ## Pro Tips - **Multi-Select**: Long-press a conversation to enter multi-select mode, then select multiple chats and move them all at once. - **Renaming**: Double-click any folder to rename it. - **Icons**: We automatically detect the Gem type (Coding, Creative, etc.) and assign the right icon. You don't have to do a thing. ## Platform Feature Differences ### Common Features - **Basic Management**: Drag and drop, rename, multi-select. - **Smart Recognition**: Automatically detect chat types and assign icons. - **Nested Hierarchy**: Support for folder nesting. - **AI Studio Adaptive**: Advanced features coming soon to AI Studio. - **Google Drive Sync**: Sync folder structure to Google Drive. ### Gemini Exclusive #### Custom Colors Click the folder icon to customize its color. Choose from 7 default colors or use the color picker to select any custom color. Folder Colors #### Account Isolation Click the "person" icon in the header to instantly filter out chats from other Google accounts. Keep your workspace clean when using multiple accounts. Account Isolation #### AI Auto-Organize Too many chats, too lazy to sort? Let Gemini do the thinking. One click copies your current conversation structure, paste it into Gemini, and it generates a ready-to-import folder plan — instant organization. **Step 1: Copy Your Conversation Structure** At the bottom of the folder section in the extension popup, click the **AI Organize** button. It automatically collects all your unfiled conversations and existing folder structure, generates a prompt, and copies it to your clipboard. AI Organize Button **Step 2: Let Gemini Sort It Out** Paste the clipboard content into a Gemini conversation. It will analyze your chat titles and output a JSON folder plan. **Step 3: Import the Results** Click **Import folders** from the folder panel menu, select **Or paste JSON directly**, paste the JSON that Gemini returned, and click **Import**.
Import Menu
Paste JSON Import
- **Incremental Merge**: Uses the "Merge" strategy by default — only adds new folders and assignments, never destroys your existing organization. - **Multilingual**: The prompt automatically uses your configured language, and folder names are generated in that language too. ### AI Studio Exclusive - **Sidebar Adjustment**: Drag to resize the sidebar width. - **Library Integration**: Drag directly from your Library into folders. ================================================ FILE: docs/en/guide/fork.md ================================================ # Conversation Fork (Experimental) Thinking shouldn't be a one-way street. In complex explorations, we often need to return to a crucial node and try different possibilities. With the **Conversation Fork** feature, Voyager allows you to branch out your thoughts and explore parallel universes of your chat. ## How it Works > **⚠️ Note**: This is an experimental feature. You need to enable it first by clicking the extension icon in your browser toolbar to open the settings popup, and turning on the **Enable Conversation Fork** switch. Whenever you want to take a different path, simply hover over your prompt and click the **Fork** button: ![Conversation Fork](/assets/branching.png) Voyager will instantly capture the entire context from the beginning up to that point and **start a brand-new conversation** for you. In this new branch, you can freely modify your question and explore different directions without worrying about destroying your original chat history. Unleash your creativity and curiosity! ================================================ FILE: docs/en/guide/formula-copy.md ================================================ # Formula Copy Voyager makes it effortless to reuse mathematical formulas and scientific symbols. It supports one-click copying of LaTeX source code and Microsoft Word-compatible MathML format. ## Introduction When you ask Gemini to derive formulas or write mathematical expressions, it usually renders them using LaTeX. While beautiful, extracting the source code to use in your own papers, documents, or editors often requires manual effort. Voyager provides seamless support for this: 1. **Auto-Detection**: Voyager automatically identifies LaTeX formulas rendered on the page. 2. **Copy Button**: When you hover over a formula, a copy icon appears on its right side. 3. **Format Options**: Click the icon to choose: - **Copy LaTeX**: Copies standard LaTeX source, ideal for Overleaf, Markdown editors, etc. - **Copy MathML**: Copies MathML source, the best format for pasting directly into **Microsoft Word**. ![Formula Copy](/assets/gemini-math-copy.png) ## Features - **Word Compatibility**: With MathML support, you can paste complex AI-generated formulas directly into Word documents while maintaining perfect editable formatting. - **Context Preservation**: Not only copies the formula itself but also preserves its mathematical context. - **Instant Response**: Processed entirely locally for immediate results. ## Usage Tips - **Academic Writing**: When writing papers in Word, have Gemini derive formulas, then use MathML copy-paste to avoid the hassle of manual entry in the Word Equation Editor. - **Note Taking**: When taking notes in Obsidian or Notion, simply copy the LaTeX source directly. ================================================ FILE: docs/en/guide/getting-started.md ================================================ # Welcome Aboard Congratulations. You’ve just upgraded your intellect. Voyager isn’t just a utility; it’s a workflow. Here is how to make the most of it in your first 5 minutes. ## 1. The Setup If you haven't installed it yet, head over to the [Installation Guide](/guide/installation). Once installed, refresh your Gemini tab. You’ll see the difference immediately. ## 2. The Timeline Start a conversation. A long one. Ask about the history of typography or the physics of black holes. Look to the right. **That strip of dots? That’s your map.** - **Hover** to peek at what you said. - **Click** to teleport there. - **Long-press** to star a moment you want to keep. No more endless scrolling. You are now navigating at the speed of thought. ## 3. Organization Look at your chat list on the left. Notice something new? **Folders.** Pick up a chat. Drag it. Drop it into a folder. It feels natural, doesn't it? That’s because it is. You can nest them, rename them, and finally clear the clutter from your mind. ## 4. The Vault You just wrote the perfect prompt. Don't let it disappear into the void. Click the **Sparkle Icon** (✨) in the input box. Save it. Tag it. Next time? Just click the icon to find and insert it. You aren't just chatting anymore. You are building a vault of your own genius. --- **You are ready.** Explore the specific guides for deep dives: - [Timeline Mastery](/guide/timeline) - [Folder Management](/guide/folders) - [Prompt Engineering](/guide/prompts) - [Data Export](/guide/export) ================================================ FILE: docs/en/guide/input-collapse.md ================================================ # Input Collapse Collapse the input area when empty to gain more reading space. Click the collapsed bar to expand and start typing.
Input collapse
## How to Use 1. When the input area is empty and loses focus, it automatically collapses into a compact pill button 2. Click the pill button to expand the input area and start typing 3. You can also press Ctrl/+I to quickly expand the input area 4. You can enable or disable this feature in the settings panel (disabled by default) ================================================ FILE: docs/en/guide/installation.md ================================================ # Installation ::: info News 🍎 **Safari Native Extension is launched!** It is completely free and supports one-click installation. ::: Choose your path. > ⚠️ Note: Prompt Manager is the only feature that supports Gemini™ for Enterprise. ## 1. Extension Stores (Recommended) The simplest way to get started. Updates are automatic. **Chrome / Brave / Opera / Vivaldi:** [Install from Chrome Web Store](https://chromewebstore.google.com/detail/kjdpnimcnfinmilocccippmododhceol?utm_source=github&utm_medium=docs&utm_campaign=organic_growth&utm_content=en) ::: warning ⚠️ Chrome Web Store temporarily unavailable The extension has been officially renamed to **Voyager** due to trademark concerns. The Chrome Web Store name update is pending review. See [this post](https://x.com/Nag1ovo/status/2031561180213313944) for details. Please use **Edge / Firefox** or **manual installation** in the meantime. ::: **Microsoft Edge:** [Install from Microsoft Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/gemini-voyager/gibmkggjijalcjinbdhcpklodjkhhlne) **Firefox:** [Install from Firefox Add-ons](https://addons.mozilla.org/firefox/addon/gemini-voyager/) ## 2. The Manual Way (Latest Features) The Web Store review process can be slow. If you want the cutting-edge version immediately, install manually. **For Chrome / Edge / Brave / Opera:** 1. Download the latest `gemini-voyager-chrome-vX.Y.Z.zip` from [GitHub Releases](https://github.com/Nagi-ovo/gemini-voyager/releases). 2. Unzip the file. 3. Open your browser's Extensions page (`chrome://extensions`). 4. Enable **Developer mode** (top right). 5. Click **Load unpacked** and select the folder you just unzipped. **For Firefox:** 1. Download the latest `gemini-voyager-firefox-vX.Y.Z.xpi` from [Releases](https://github.com/Nagi-ovo/gemini-voyager/releases). 2. Open the Add-ons Manager (`about:addons`). 3. Drag and drop the `.xpi` file to install (or click the gear icon ⚙️ -> **Install Add-on From File**). > 💡 The XPI file is officially signed by Mozilla and can be permanently installed in all Firefox versions. ## 3. Safari (macOS) Safari now supports direct distribution! Download the pre-signed app: 1. Download the latest Safari version (.dmg). 2. Double-click to open and follow the prompts to install. 3. Double-click to launch the app. 4. Enable the extension in **Safari Settings > Extensions**. > 💡 The Safari build is now directly signed for distribution—no Xcode conversion needed! > > ⚠️ **Limitations**: Due to Safari's nature, (a) Watermark removal (b) Image export (PDF recommended) are not supported. --- _Development setup? If you are a developer looking to contribute, check out our [Contributing Guide](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/CONTRIBUTING.md)._ ================================================ FILE: docs/en/guide/markdown-fix.md ================================================ # Markdown Rendering Fix The Gemini™ web interface sometimes inserts HTML elements (such as citation sources or highlight markers) within text, which can break Markdown bold syntax (`**text**`), causing the text to fail to render as bold correctly. Voyager has a built-in automatic fix feature that intelligently identifies and repairs these broken bold tags, ensuring that your document renders cleanly and accurately. > [!INFO] > This feature is automatically enabled and requires no additional configuration. ================================================ FILE: docs/en/guide/mermaid.md ================================================ # Mermaid Diagram Rendering Automatically render Mermaid code as visual diagrams. ## Overview When Gemini™ outputs Mermaid code blocks (flowcharts, sequence diagrams, Gantt charts, etc.), Voyager automatically detects and renders them as interactive diagrams. ### Key Features - **Auto-detection**: Supports `graph`, `flowchart`, `sequenceDiagram`, `gantt`, `pie`, `classDiagram`, and all major Mermaid diagram types - **Toggle view**: Switch between rendered diagram and source code with one click - **Fullscreen mode**: Click the diagram to enter fullscreen with zoom and pan support - **Dark mode**: Automatically adapts to page theme ## How to Use 1. Ask Gemini to generate any Mermaid diagram code 2. The code block is automatically replaced with the rendered diagram 3. Click the ** Code** button to view source code 4. Click the **📊 Diagram** button to switch back to diagram view 5. Click the diagram area to enter fullscreen ## Fullscreen Controls - **Scroll wheel**: Zoom in/out - **Drag**: Pan the diagram - **+/-**: Toolbar zoom buttons - **⊙**: Reset view - **✕ / ESC**: Close fullscreen ## Compatibility & Troubleshooting ::: warning Note - **Firefox Limitation**: Due to environment restrictions, Firefox uses version 9.2.2 and does not support new features like **Timeline** or **Sankey**. - **Syntax Errors**: Rendering failures are often due to syntax errors in Gemini's output. We are collecting "bad cases" to implement automatic patches for common generation errors in future updates. :::
Mermaid diagram rendering
================================================ FILE: docs/en/guide/nanobanana.md ================================================ # NanoBanana Option ::: warning Browser Compatibility Currently, the **NanoBanana** feature is **not supported on Safari** due to browser API limitations. We recommend using **Chrome** or **Firefox** if you need to use this feature. Safari users can manually upload their downloaded images to [banana.ovo.re](https://banana.ovo.re/) for processing (though success is not guaranteed for all images due to varying resolutions). ::: **AI Images, kept pure.** Images generated by Gemini™ come with a visible watermark by default. While this is intended for safety, there are creative scenarios where you need a perfectly clean slate. ## Lossless Reconstruction NanoBanana uses a **Reverse Alpha Blending** algorithm. - **Not AI Inpainting**: Traditional watermark removal often uses AI to "smear" the area, which destroys pixel details. - **Pixel Perfection**: We use mathematical calculations to precisely remove the transparent watermark layer, restoring the 100% original pixels. - **Zero Quality Loss**: The processed image remains identical to the original in all non-watermarked areas. ## How to Use 1. **Enable it**: Find "NanoBanana Option" at the end of the Voyager settings panel and toggle it on. 2. **Auto-process**: Every image you generate will now be automatically processed in the background. 3. **Download directly**: - Hover over a processed image and you'll see a 🍌 button. - **The 🍌 button completely replaces** the native download button to ensure you always get the 100% unwatermarked image directly.
NanoBanana Demo
## Acknowledgement This feature is based on the [gemini-watermark-remover](https://github.com/journey-ad/gemini-watermark-remover) project by [journey-ad (Jad)](https://github.com/journey-ad), which is a JavaScript port of the [original C++ implementation](https://github.com/allenk/GeminiWatermarkTool) by [allenk](https://github.com/allenk). We are grateful for their contributions to the community. 🧡 ## Privacy & Security All processing happens **locally in your browser**. Your images are never uploaded to any third-party servers, ensuring your privacy and creative security. ================================================ FILE: docs/en/guide/prevent-auto-scroll.md ================================================ # Prevent Auto Scroll When you are reading past conversations, hitting Enter to send a new prompt causes Gemini™ to forcefully scroll the page to the bottom to track the newly generated response. This can disrupt your reading experience. The **Prevent Auto Scroll** feature intercepts this unwanted jumping behavior: - When you have scrolled up to read history, the system blocks the page from jumping back down. - This feature is **disabled** by default. You can manually enable it in the popup settings under "Timeline Options". ## How to Enable 1. Click the Voyager extension icon in your browser toolbar to open the popup. 2. Locate the "Timeline Options" section. 3. Toggle on the "Prevent auto-scroll to bottom" switch. ================================================ FILE: docs/en/guide/prompts.md ================================================ # Your Intellectual Assets: Prompt Library You craft a perfect prompt. It solves a complex coding problem or writes a beautiful email. Do you throw it away? No. You save it. ## The Prompt Vault This is your personal repository of genius. ### 1. Capture When you write something great, click the **Prompt Manager** icon (floating near the input box). It’s now part of your vault. ### 2. Categorize Add tags like `#coding`, `#email`, or `#research`. Keep your tools sharpened and sorted. ### 3. Deploy Next time you need it, don't type it again. Open the manager, search by tag or keyword, and click to insert. One click. Infinite leverage. ![Prompt Manager](/assets/gemini-prompt-manager.png) ## Available Anywhere The Prompt Manager can now be used on any website you choose, not just Gemini™ and AI Studio. ### How to Enable 1. Click the Voyager icon in your browser's extension toolbar. 2. Scroll to the **Prompt Manager** section. 3. Enter the website URL (e.g., `chatgpt.com` or `claude.ai`). 4. Click **Add website** and grant permission. 5. **Reload the target page** to see the floating button. ### Popular AI Websites - `chatgpt.com` - ChatGPT - `claude.ai` - Claude - `copilot.microsoft.com` - Microsoft Copilot - `poe.com` - Poe ::: tip On custom websites, **only** the Prompt Manager feature is activated. Other features like Timeline and Folders are designed specifically for Gemini and will not load. ::: ================================================ FILE: docs/en/guide/quote-reply.md ================================================ # Quote Reply Voyager offers a convenient "Quote Reply" feature, making replies to specific content more precise and efficient. ## Introduction In daily conversations, we often need to follow up on or refute a specific part of the AI's output. The traditional method involves copying that text and manually typing the `> ` symbol in the input box, which is tedious. Voyager simplifies this process: 1. **Select to Quote**: Use your mouse to select any text in the conversation page (whether it's your question or Gemini's answer). 2. **Floating Button**: A "Quote Reply" button will automatically appear near the selected text. 3. **One-Click Insert**: Click the button, and the selected text will be automatically inserted into your input box in standard Markdown blockquote format (`> content`). ![Quote Reply](/assets/quote-reply.png) ## Features - **Context Aware**: Intelligently identifies conversation content to avoid accidental triggering in unrelated areas (like the input box itself). - **Standard Format**: Uses universal Markdown syntax, which Gemini understands perfectly, leading to more precise responses. - **Multi-line Support**: If multiple lines of text are selected, Voyager automatically adds quote symbols to each line to keep the format clean. ## Tips - **Follow up on details**: Select a confusing concept in Gemini's answer, click quote, and then type "Please explain this concept in detail." - **Correct errors**: Select incorrect code or facts in the answer, quote them, and point out "This is incorrect, it should be..." ================================================ FILE: docs/en/guide/recents-hider.md ================================================ # Hide Recent Items and Gems ::: info **Note**: This feature is supported in version 1.1.9 and later. ::: Add an elegant toggle to hide the "Recently saved" section on the Gemini™ homepage for a cleaner interface. Now also supports hiding the **Gems** list in the sidebar!

Hide Recently Saved

Hide Gems List

## Features - **Contextual Toggle**: A subtle hide button appears only when you hover over the Recent Items section. - **Minimalist State**: When hidden, it's replaced by a discreet "peek bar" at the bottom. - **One-Click Restore**: Simply hover over the peek bar and click to bring your recent items back instantly. - **Privacy Protection**: Prevents others nearby from seeing your recent activities, perfect for public spaces. - **Persistence**: Your preference is saved and applied automatically on your next visit. ## How to Use 1. Hover over the "Recent" section on the Gemini homepage. 2. Click the eye-off icon that appears in the top-right corner to hide the section. 3. To restore, hover over the thin line that remains at the bottom of the area and click. ================================================ FILE: docs/en/guide/settings.md ================================================ # Make It Yours The default experience is great. But you might want it perfect. Customize every pixel. ## Cinema Mode Why view the future through a tiny keyhole? Voyager lets you expand the chat width. - **Wide**: 1400px for coding and complex tables. - **Focused**: 800px for reading. - **You decide**: Use the slider to find your sweet spot. ## Control Click the extension icon to access the control center. - **Scroll Mode**: Natural or classic. - **Timeline Position**: Put it where it feels right. - **Visual Effects**: Pick `Snow`, `Sakura`, or `Rain` for a seasonal atmosphere. ## Custom Order Too many sections in the popup, and the ones you use most are buried at the bottom? Hover over any settings card and ▲/▼ arrows appear in the top-right corner. Click to move a card up or down. Your layout is saved automatically and persists across sessions. ## Atmosphere Voyager is not limited to utility tweaks. You can also change the mood of the page. - **Snow**: Soft drifting flakes for a calm winter feel. - **Sakura**: Floating cherry blossom petals for a lighter spring vibe. - **Rain**: A cinematic rain overlay with angled streaks and subtle splash ripples. - **Smooth switching**: Turning an effect off or switching to another one lets existing particles fade out naturally.

Open Settings

Open settings guide

Adjust Width

Chat width adjustment
================================================ FILE: docs/en/guide/sidebar-auto-hide.md ================================================ # Sidebar Auto-hide Want a more immersive chat experience? We provide a **Sidebar Auto-hide** feature. When enabled, the sidebar automatically collapses when your mouse leaves the sidebar area, and automatically expands when you move your mouse back into it. ### Demo
### How to Enable 1. Open the Voyager settings panel. 2. Find the **Auto-hide sidebar** toggle in **General Settings**. 3. Toggle it on to activate. _Note: This feature currently only supports Google Gemini._ ================================================ FILE: docs/en/guide/sidebar.md ================================================ # Sidebar Width Folder names too long to see? Or is the sidebar taking up too much precious chat space? Now you can freely adjust the width of the sidebar. ## How to Adjust 1. Open the Voyager settings panel (click the extension icon in the top right of your browser). How to open settings panel 2. Find the **Sidebar width** option in **General Settings**. 3. Drag the slider to choose the width that feels right for you. - **Narrow**: Save space and focus on the conversation. - **Wide**: See full folder names clearly at a glance. ## Supported Platforms This feature supports both: - **Google Gemini** - **Google AI Studio** Your settings are saved automatically and will apply the next time you open the page. ================================================ FILE: docs/en/guide/sponsor.md ================================================ # Sponsor > [!NOTE] > If Voyager helps you, feel free to share it on X, Reddit, YouTube, Threads, etc. Every share helps more people discover the project and improve the Gemini experience. Thanks. Maintaining open-source projects is mainly driven by passion (and coffee) ☕ **[Voyager](https://github.com/Nagi-ovo/gemini-voyager)** is a completely free and open-source browser extension designed to enhance your Gemini experience. If this extension helps you use Gemini more efficiently, please consider supporting the continued development and maintenance of this project. --- ## Online Platforms Afdian ### 🎙️ Recommended Tool: Typeless I highly recommend **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**, an AI voice-to-text tool that I used extensively during the development of Voyager. Integrating it into my daily workflow has saved me a tremendous amount of time and significantly boosted my productivity. > 🎁 **[Join via my referral link](https://www.typeless.com/?via=gemini-voyager)** (Code: _`gemini-voyager`_) to get **$5 free credits**. This also gives me credits to keep maintaining this project—a free way to support my work! ❤️ --- ## Buy Me a Coffee (QR) 🍵
WeChat Pay WeChat Pay
Alipay Alipay
--- Thank you for your support! Every contribution is a great encouragement to me ❤️ ================================================ FILE: docs/en/guide/tab-title.md ================================================ # Tab Title Sync Automatically syncs the browser tab title with the current Gemini™ chat title. ## Features - **Real-time Sync**: When the chat title changes (e.g., AI generates a new title or you manually rename it), the browser tab title updates instantly from "Gemini" to the specific conversation topic. - **Universal Support**: Works perfectly with standard chat pages, Gem conversations, and multi-account environments. - **Toggle Control**: If you prefer the default behavior, you can easily disable this feature in the "General Options" section of the settings panel.
Tab Title Sync
## How to Use 1. This feature is enabled by default upon installation. 2. Open any Gemini conversation and observe the browser tab title; it will automatically update to match the chat title. 3. To disable: - Click the extension icon to open the settings panel. - Find "General Options". - Toggle off "Update Tab Title". ================================================ FILE: docs/en/guide/timeline.md ================================================ # Time Travel Long conversations are messy. You scroll up, you scroll down, you lose your place. Voyager turns your conversation into a timeline. ## See the Shape of Your Chat Look at the right side of your screen. Each node represents a message. The timeline visualizes the rhythm of your dialogue. ## Navigation, Solved. - **Teleport**: Click a node to jump instantly to that message. - **Peek**: Hover to see what's inside without moving. - **Bookmark**: Long-press a node to **Star** it. It's like a bookmark for your brain. - **Levels (Experimental)**: Right-click a node to set various levels (1-3) or collapse children. Perfect for making branched conversations clear. - **Keyboard**: Navigate at the speed of thought. Default `j`/`k`, customize to anything. ![Timeline Navigation](/assets/teaser.png) ## Even Faster with Keys Don't want to use the mouse? Use your keyboard. **It's like turning on Vim mode in Gemini.** ### Default Shortcuts - `k` - Jump to previous node - `j` - Jump to next node ### Customize It Open extension settings, click a shortcut box, press any key you want. Any key, any combo. `n`/`p`? `,`/`.`? Your call. **Flow mode**: Rapid presses queue up smoothly. **Jump mode**: Instant response, max speed. ================================================ FILE: docs/en/index.md ================================================ --- layout: home hero: name: 'Voyager' text: 'The missing OS for Gemini.' tagline: 'We love Gemini. We just wanted it to be perfect.' image: src: /logo.png alt: Voyager Logo actions: - theme: brand text: Download link: ./guide/installation - theme: alt text: Start the Journey link: ./guide/getting-started teaser: title: 'It just works.' description: ‘We didn’t want to build another extension. We wanted to build a better way to think.
When you use Voyager, you stop fighting the interface and start flowing with it.’ image: '/assets/teaser.png' features: - title: 'Timeline' details: 'Don’t scroll. Fly. Jump to any point in your conversation instantly.' - title: 'Folders' details: 'Finally, a file system for your AI. Native, intuitive, powerful.' - title: 'Freedom' details: 'Your data is yours. Export to JSON, Markdown, or PDF with one click.' features: - icon: 🧭 title: Timeline details: A map for your mind. Navigate conversations visually. - icon: 🗂️ title: Folders details: Order from chaos. Drag, drop, done. - icon: ✨ title: Vault details: Your genius, captured. Save and reuse your best prompts. - icon: 💬 title: Quote Reply details: Select to quote. Context-aware replies for efficient communication. - icon: ↔️ title: Chat Width details: Go wide. Freely adjust the chat width for a better viewing experience. - icon: 💾 title: Chat Export details: Data sovereignty. Archive in multiple formats so knowledge is never lost. - icon: 🌦️ title: Visual Effects details: Set the mood. Switch between snow, rain, and sakura petals from the popup. - icon: 🍌 title: NanoBanana Watermark Removal details: Lossless watermark removal. Keeping AI moments pure. - icon: 📐 title: Formula Copy details: One-click copy for LaTeX and MathML (Word) source codes. - icon: 🧜‍♀️ title: Mermaid Diagrams details: Code to visuals. Flowcharts, sequence diagrams, Gantt charts rendered instantly. - icon: 🏷️ title: Tab Title Sync details: Know at a glance. Auto-sync browser tab title with your chat. - icon: 🔀 title: Conversation Fork (Experimental) details: Divergent thinking. Branch conversation at any node to explore different possibilities. - icon: 🗑️ title: Batch Delete details: Clean up in bulk. Select multiple conversations and delete them all at once. - icon: ☁️ title: Cloud Sync details: Always in sync. Back up folders and prompts to Google Drive across devices. - icon: ⚡️ title: Default Model details: Stop repeating yourself. Auto-switch to your preferred model on new chats. - icon: 🔬 title: Deep Research details: Unbox the thinking. Extract research processes and links from Deep Research sessions. ---
⚠️ Name Change Notice: Due to trademark and copyright concerns, this extension has been officially renamed to Voyager. However, due to the Chrome Web Store's extremely slow review process, the name change was not approved within 7 days — it is temporarily unavailable on the Chrome Web Store.

Every install is a vote of trust

Live numbers from Chrome Web Store and GitHub. Thanks for riding with us, fellow Voyagers.

GitHub Stars GitHub Forks Latest Release GitHub Downloads Chrome Web Store Users Chrome Web Store Rating Edge Add-ons Firefox Add-ons Users Firefox Add-ons Rating
Nagi-ovo%2Fgemini-voyager | Trendshift

Special Thanks

✨ We're live on Product Hunt! We'd love to hear your thoughts and feedback. ❤️

Voyager on Product Hunt

“It's not just a tool. It's a bicycle for the mind.”

See what's possible →

================================================ FILE: docs/en/privacy.md ================================================ # Privacy Policy Last updated: March 16, 2026 ## Introduction Voyager ("we", "our", or "us") is committed to protecting your privacy. This Privacy Policy explains how our browser extension collects, uses, and safeguards your information. ## Data Collection and Usage **We do not collect any personal information.** Voyager operates entirely within your browser. All data generated or managed by the extension (such as folders, prompt templates, starred messages, and settings) is stored: 1. Locally on your device (`chrome.storage.local`) 2. In your browser's synchronized storage (`chrome.storage.sync`) if available, to sync settings across your devices. We do not have access to your personal data, chat history, or any other private information. We do not track your browsing history. ## Google Drive Sync (Optional) If you explicitly opt in to the Google Drive Sync feature, the extension uses the Chrome Identity API to obtain an OAuth2 token (with `drive.file` scope only) to back up your folders and prompts to **your own Google Drive**. This transfer occurs directly between your browser and Google's servers. We have no access to this data, and it is never sent to any server we operate. ## Permissions The extension requests the minimum permissions necessary to function: - **Storage**: To save your preferences, folders, prompts, starred messages, and UI customization options locally and across devices. - **Identity**: To authenticate with Google for the optional Google Drive Sync feature. Only used when you explicitly enable cloud sync. - **Scripting**: To dynamically inject content scripts on Gemini pages and on user-specified custom websites for the Prompt Manager feature. Only the extension's own bundled scripts are injected — no remote code is fetched or executed. - **Host Permissions** (gemini.google.com, aistudio.google.com, etc.): To inject content scripts that enhance the Gemini UI with features like folders, export, timeline, and quote-reply. Additional Google domains (googleapis.com, accounts.google.com) are required for Google Drive Sync authentication. - **Optional Host Permissions** (all URLs): Only requested at runtime when you explicitly add custom websites for the Prompt Manager. Never activated without your action. ## Third-Party Services Voyager does not share any data with third-party services, advertisers, or analytics providers. ## Changes to This Policy We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page. ## Contact Us If you have any questions about this Privacy Policy, please contact us via our [GitHub Repository](https://github.com/Nagi-ovo/gemini-voyager). ================================================ FILE: docs/es/guide/batch-delete.md ================================================ # Eliminación por Lote Elimina múltiples conversaciones a la vez, di adiós a la tediosa eliminación una por una. ## Características - **Modo Selección Múltiple**: Mantén presionado cualquier conversación para entrar en el modo de selección múltiple, puedes marcar varias conversaciones para eliminar. - **Limpieza en un Clic**: Después de seleccionar, haz clic en el botón de eliminar para borrar todas las conversaciones seleccionadas. - **Progreso en Tiempo Real**: Muestra el progreso en tiempo real durante la eliminación, para que sepas el estado actual. - **Confirmación de Seguridad**: Aparecerá un cuadro de confirmación antes de eliminar para evitar operaciones accidentales.
Eliminación por Lote
## Cómo Usar 1. En la lista de conversaciones de la barra lateral, **mantén presionado** cualquier elemento de conversación. 2. Después de entrar en el modo de selección múltiple, aparecerán casillas de verificación a la izquierda de los elementos de conversación. 3. Marca las conversaciones que deseas eliminar (máximo 50 a la vez). 4. Haz clic en el **botón de eliminar** que aparece. 5. Haz clic en "Aceptar" en el área roja de confirmación que aparece **sobre la lista de carpetas** para comenzar la eliminación por lote. ::: tip Consejo El panel de confirmación de eliminación cubrirá directamente el área de carpetas para evitar bloquear la lista de conversaciones. La operación de eliminación por lote no se puede deshacer, por favor opera con precaución. ::: ================================================ FILE: docs/es/guide/cloud-sync.md ================================================ # Sincronización en la Nube Sincroniza tus carpetas, biblioteca de prompts y otros datos en Google Drive para mantener tu experiencia consistente en todos tus dispositivos. ## Características - **Sincronización multidispositivo**: Mantén tus configuraciones sincronizadas en varias computadoras usando Google Drive. - **Privacidad de datos**: Los datos se almacenan directamente en tu propio almacenamiento de Google Drive, lo que garantiza la privacidad sin servidores de terceros. - **Sincronización flexible**: Soporte para carga manual y descarga/fusión de datos. ::: info **Próximamente**: La próxima versión admitirá la sincronización de conversaciones destacadas. ::: ## Cómo usar 1. Haz clic en el icono de la extensión en la esquina inferior derecha de la página de Gemini™ para abrir el panel de configuración. 2. Localiza la sección **Sincronización en la Nube**. 3. Haz clic en **Iniciar sesión con Google** y completa la autorización. 4. Una vez autorizado, haz clic en **Subir a la Nube** para sincronizar tus datos locales con la nube, o en **Descargar y Fusionar** para traer los datos de la nube a tu máquina local. ### 💡 Sincronización rápida La forma más sencilla es hacer clic en los botones **"Subir a la Nube"** o **"Descargar y Fusionar"** en la parte superior del área de carpetas en la barra lateral izquierda. Botones de sincronización rápida en la nube ::: warning **Recomendación de seguridad: Protección doble** Si bien la sincronización en la nube ofrece una gran comodidad, le recomendamos encarecidamente que también realice periódicamente copias de seguridad de sus datos principales mediante **archivos locales**. 1. **Exportación completa**: Exporta un paquete completo con todas las configuraciones, carpetas y prompts desde "Copia de seguridad y restauración" al final del panel. Exportación completa 2. **Exportar todas las carpetas**: Haz clic en "Exportar" en la sección "Carpetas" del panel para guardar todas tus carpetas y conversaciones, excluyendo los prompts. Exportar todas las carpetas ::: ================================================ FILE: docs/es/guide/community.md ================================================ # Comunidad y Comentarios Valoramos mucho la voz de cada usuario. Ya sea que encuentres un error, tengas una sugerencia de funcionalidad o quieras compartir tu bóveda de prompts, puedes contactarnos a través de los siguientes canales. ## 📢 Mantente Informado Sigue nuestra cuenta de X (Twitter) para obtener los últimos avances en desarrollo. - **Nuevas versiones**: Sé el primero en conocer las actualizaciones. - **Próximas funciones**: Entérate de antemano sobre las funciones que vendrán. ## 💬 Comunidad en Discord ¡Únete a nuestro servidor de Discord y chatea con otros Voyagers! - **Chat en tiempo real**: Habla directamente con otros usuarios y desarrolladores. - **Compartir Prompts**: Mira qué prompts están usando otros. - **Progreso del desarrollo**: Obtén las últimas noticias sobre nuevas funciones. ## 🐙 GitHub Issues Si encuentras un error (Bug) o tienes una solicitud de función clara (Feature Request), te recomendamos enviar un Issue en GitHub: - [Reportar un Bug](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=bug_report.yml) - [Solicitar una función](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=feature_request.yml) ¡Gracias por tu apoyo a Voyager! ❤️ ================================================ FILE: docs/es/guide/context-sync.md ================================================ # Transporte de memoria: Sincronización de contexto (Experimental) **Diferentes dimensiones, intercambio fluido** Desarrolla la lógica en la web e implementa el código en el IDE. Voyager rompe las barreras dimensionales, dotando instantáneamente a tu IDE del "proceso de pensamiento" de la web. ## Adiós al salto constante entre pestañas El mayor dolor de cabeza de los desarrolladores: después de discutir a fondo una solución en la web, regresas a VS Code/Trae/Cursor y tienes que volver a explicar los requisitos como si fueras un extraño. Debido a las cuotas y la velocidad de respuesta, la web es el "cerebro" y el IDE son las "manos". Voyager les permite compartir una misma alma. ## Tres pasos sencillos, respiración sincronizada 1. **Instalar y activar CoBridge**: Instala la extensión **CoBridge**. Es el puente central que conecta la web con tu IDE local. - **[Instalar desde el Marketplace](https://open-vsx.org/extension/windfall/co-bridge)** ![Extensión CoBridge](/assets/CoBridge-extension.png) Después de la instalación, **abre cualquier directorio de trabajo**, haz clic en el icono de la derecha y activa el servidor. ![Servidor CoBridge activado](/assets/CoBridge-on.png) 2. **Conexión y saludo**: - Activa la "Sincronización de contexto" en los ajustes de Voyager. - Alinea los números de puerto. Cuando veas "IDE Online", significa que están conectados. ![Consola de sincronización de contexto](/assets/context-sync-console.png) 3. **Sincronización con un clic**: Haz clic en **"Sync to IDE"**. Ya sean **tablas de datos** complejas o **imágenes de referencia** intuitivas, todo se sincronizará instantáneamente con tu IDE. ![Sincronización completada](/assets/sync-done.png) ## Arraigando en el IDE Una vez finalizada la sincronización, aparecerá un archivo `.cobridge/AI_CONTEXT.md` en el directorio de trabajo de tu IDE. Ya sea Trae, Cursor o Copilot, leerán automáticamente esta «memoria» a través de sus respectivos archivos Rule. ``` your-project/ ├── .cobridge/ │ ├── images/ │ │ ├── context_img_1_1.png │ │ └── context_img_1_2.png │ └── AI_CONTEXT.md ├── .github/ │ └── copilot-instructions.md ├── .gitignore ├── .traerules └── .cursorrules ``` ## Sus principios - **Cero contaminación**: CoBridge gestiona automáticamente el archivo `.gitignore`, garantizando que tus conversaciones privadas nunca se suban a los repositorios de Git. - **Optimizado para IA**: Formato Markdown completo, lo que hace que la lectura por parte de la IA en tu IDE sea tan fluida como leer un manual de instrucciones. - **Consejo**: Si la conversación es de hace tiempo, desplázate primero hacia arriba usando la [Línea de tiempo] para que la web "recuerde" el contexto y obtener mejores resultados de sincronización. --- ## Listos para el Despegue **La lógica ya está lista en la nube; ahora, permite que eche raíces localmente.** - **[Instalar la extensión CoBridge](https://open-vsx.org/extension/windfall/co-bridge)**: Encuentra tu portal dimensional y activa la "respiración sincronizada" con un solo clic. - **[Visitar el repositorio en GitHub](https://github.com/Winddfall/CoBridge)**: Explora la lógica subyacente de CoBridge o dale una estrella a este proyecto de "sincronización de almas". > **Los grandes modelos ya no sufren de amnesia; listos para la acción inmediata.** ================================================ FILE: docs/es/guide/deep-research.md ================================================ # Exportación de Deep Research Exporta el informe final generado por Deep Research o guarda su proceso de "pensamiento" completo como un archivo Markdown. ## 1. Exportación de informes (PDF / Imagen) Los informes generados por Deep Research se pueden exportar como PDF bellamente formateados o como imágenes individuales para compartir (también se admiten los formatos Markdown y JSON). ![Exportación de informes](/assets/deep-research-report-export.png) ## 2. Exportación del proceso de pensamiento (Markdown) Además del informe final, también puedes exportar el contenido completo de "pensamiento" de las conversaciones de Deep Research. ### Características - **Exportación en un clic**: Haz clic en el botón de compartir y exportar para descargar. - **Formato Estructurado**: Conserva las fases de pensamiento, las entradas de pensamiento y los sitios web de investigación en su orden original. - **Encabezados bilingües**: Los archivos Markdown incluyen encabezados de sección en inglés y en tu idioma actual. - **Nombres Automáticos**: Los archivos se nombran con marcas de tiempo para una fácil organización (por ejemplo: `deep-research-thinking-20240128-153045.md`). ### Cómo Usar 1. Abre una conversación de Deep Research en Gemini™. 2. Haz clic en el botón **Compartir y exportar** de la conversación. 3. Selecciona "Descargar contenido de pensamiento" (Download thinking content). 4. El archivo Markdown se descargará automáticamente. ![Exportación de pensamiento de Deep Research](/assets/deepresearch_download_thinking.png) ### Formato del Archivo Exportado El archivo Markdown exportado contiene: - **Título**: Título de la conversación. - **Metadatos**: Hora de exportación y número total de fases de pensamiento. - **Fases de Pensamiento**: Cada fase contiene: - Entradas de pensamiento (con título y contenido). - Sitios web investigados (con enlace y título). #### Estructura de Ejemplo ```markdown # Título de la conversación Deep Research **Hora de exportación / Exported At:** 2025-12-28 17:25:35 **Fases totales / Total Phases:** 3 --- ## Fase de Pensamiento 1 / Thinking Phase 1 ### Título del Pensamiento 1 Contenido del pensamiento... ### Título del Pensamiento 2 Contenido del pensamiento... #### Sitios Web Investigados / Researched Websites - [domain.com](https://example.com) - Título de la página - [another.com](https://another.com) - Otro título --- ## Fase de Pensamiento 2 / Thinking Phase 2 ... ``` ## Privacidad Todas las operaciones de extracción y formateo se realizan 100% localmente en tu navegador. No se envían datos a servidores externos. ================================================ FILE: docs/es/guide/default-model.md ================================================ # Modelo Predeterminado ::: info **Nota**: Esta función es compatible con la versión 1.1.9 y posteriores. ::: Establece un modelo de Gemini™ preferido como predeterminado para evitar el cambio manual en cada nueva conversación.
## Características - **Configuración Interactiva**: Añade un botón de "Estrella" directamente en el menú nativo de selección de modelos de Gemini. - **Cambio Automático**: Cambia automáticamente a tu modelo preferido cada vez que inicias una nueva conversación. - **Preferencia Persistente**: Tu elección se guarda y se sincroniza entre tus dispositivos. - **Optimizado para SPA**: Se activa con precisión al hacer clic en el botón "Nuevo chat", usar atajos o navegar de regreso a la página de inicio. ## Cómo usar 1. Haz clic en el **Selector de modelos** arriba del área de entrada de Gemini. 2. Pasa el cursor sobre tu modelo preferido y haz clic en el **icono de Estrella**. 3. Una vez que la estrella esté **llena**, ese modelo quedará configurado como predeterminado. 4. La extensión seleccionará automáticamente este modelo para todos los chats nuevos. 5. Para deshabilitarlo, simplemente haz clic en el icono de estrella llena nuevamente. ================================================ FILE: docs/es/guide/export.md ================================================ # Libertad Total Los datos bloqueados son la peor experiencia. Nuestro credo es simple: lo que creas, es tuyo. ## Llévatelo Todo Voyager te ayuda a bajar tus datos de la nube a tu palma. ### Elige tu Formato - **Markdown**: Para usar en Obsidian o Notion. Limpio y fresco. (Usuarios de Safari: No se pueden extraer imágenes debido a limitaciones del navegador, use la exportación a PDF) - **PDF**: Para enviar a otros o imprimir. Maquetación hermosa, texto e imágenes. - **JSON**: Para desarrolladores. Datos brutos, juega con ellos como quieras. ### Cómo Exportar 1. Pase el ratón sobre el logo de Gemini para ver el **icono de exportación**. 2. Elige el formato. 3. Llévatelo. Tus datos, tus reglas.

1. Pasa el ratón

Guía de exportación paso 1

2. Elige el formato

Guía de exportación paso 2
### Nota sobre la exportación a PDF en Safari La exportación a PDF en Safari requiere un proceso ligeramente diferente (impresión manual): 1. Haz clic en el botón **Exportar** y selecciona el formato PDF. 2. **Espera aproximadamente un segundo** (para que la página prepare los estilos de impresión). 3. Presiona `Command + P` para abrir el cuadro de diálogo de impresión. 4. Selecciona **"Guardar como PDF"** (Save to PDF) en el cuadro de diálogo de impresión. Safari Export PDF ================================================ FILE: docs/es/guide/folders.md ================================================ # Carpetas bien hechas ¿Por qué es tan difícil organizar los chats de IA? Lo hemos solucionado. Hemos construido un sistema de archivos para tus pensamientos.

Gemini™

Carpetas Gemini

AI Studio

Carpetas AI Studio
## La física de la organización Simplemente se siente bien. - **Arrastrar y soltar**: Toma un chat. Suéltalo en una carpeta. Es táctil. - **Jerarquía anidada**: Los proyectos tienen subproyectos. Crea carpetas dentro de carpetas. Estructúralo a _tu_ manera. - **Espaciado de carpetas**: Ajusta la densidad de la barra lateral, de compacto a espacioso. > _Nota: En Mac Safari, es posible que los ajustes no sean en tiempo real; actualiza la página para ver el efecto._ - **Sincronización instantánea**: Organiza en tu escritorio. Míralo en tu portátil. ## Consejos profesionales - **Selección Múltiple**: Mantén presionado un elemento de chat para entrar en modo de selección múltiple, opera en lote, listo de una vez. - **Renombrar**: Doble clic en la carpeta, cámbialo directamente. - **Reconocimiento**: Código, escritura, charla... Identificamos automáticamente el tipo de Gema y asignamos un icono. Tú solo úsalo, déjanos el resto a nosotros. ## Diferencias de características por plataforma ### Funciones comunes - **Gestión básica**: Arrastrar y soltar, renombrar, selección múltiple. - **Reconocimiento inteligente**: Detecta automáticamente tipos de chat y asigna iconos. - **Jerarquía anidada**: Soporte para anidamiento de carpetas. - **Adaptación para AI Studio**: Las funciones avanzadas estarán disponibles pronto en AI Studio. - **Sincronización con Google Drive**: Sincroniza la estructura de carpetas con Google Drive. ### Exclusivo de Gemini #### Colores personalizados Haz clic en el icono de la carpeta para personalizar su color. Elige entre 7 colores predeterminados o usa el selector de colores para elegir cualquier color. Colores de carpeta #### Aislamiento de cuenta Haz clic en el icono "persona" en el encabezado para filtrar instantáneamente los chats de otras cuentas de Google. Mantén tu espacio de trabajo limpio cuando uses varias cuentas. Aislamiento de cuenta #### Organización automática con IA Demasiados chats, demasiada pereza para ordenar? Deja que Gemini piense por ti. Un clic copia tu estructura de conversaciones actual, pégalo en Gemini, y genera un plan de carpetas listo para importar — organización instantánea. **Paso 1: Copia tu estructura de conversaciones** En la parte inferior de la sección de carpetas del popup de la extensión, haz clic en el botón **AI Organize**. Recopila automáticamente todas tus conversaciones sin clasificar y la estructura de carpetas existente, genera un prompt y lo copia al portapapeles. AI Organize Button **Paso 2: Deja que Gemini lo ordene** Pega el contenido del portapapeles en una conversación de Gemini. Analizará los títulos de tus chats y generará un plan de carpetas en JSON. **Paso 3: Importa los resultados** Haz clic en **Importar carpetas** desde el menú del panel de carpetas, selecciona **O pegar JSON directamente**, pega el JSON que devolvió Gemini y haz clic en **Importar**.
Import Menu
Paste JSON Import
- **Fusión incremental**: Usa la estrategia de "Fusionar" por defecto — solo agrega nuevas carpetas y asignaciones, nunca destruye tu organización existente. - **Multilingüe**: El prompt usa automáticamente tu idioma configurado, y los nombres de carpetas también se generan en ese idioma. ### Exclusivo de AI Studio - **Ajuste de barra lateral**: Arrastra para cambiar el ancho de la barra lateral. - **Integración con Library**: Arrastra directamente desde tu Library a las carpetas. ================================================ FILE: docs/es/guide/fork.md ================================================ # Bifurcación de Conversación (Experimental) El pensamiento no debe ser un camino de un solo sentido. En exploraciones complejas, a menudo necesitamos volver a un nodo crucial y probar diferentes posibilidades. Con la función de **Bifurcación de Conversación**, Voyager te permite expandir tus ideas y explorar universos paralelos de tu chat. ## Cómo funciona > **⚠️ Nota**: Esta es una función experimental. Primero debes habilitarla haciendo clic en el icono de la extensión en la barra de herramientas de tu navegador para abrir la ventana emergente de configuración, y activando la opción **"Habilitar bifurcación de conversación"**. Cada vez que desees tomar un camino diferente, simplemente pasa el cursor sobre tu pregunta y haz clic en el botón de **Bifurcación**: ![Bifurcación](/assets/branching.png) Voyager capturará instantáneamente todo el contexto desde el principio hasta ese punto e **iniciará una conversación completamente nueva** para ti. En esta nueva rama, puedes modificar libremente tu pregunta y explorar diferentes direcciones sin preocuparte por dañar tu historial de chat original. ¡Libera tu creatividad y curiosidad! ================================================ FILE: docs/es/guide/formula-copy.md ================================================ # Copia de Fórmulas Voyager facilita enormemente la reutilización de fórmulas matemáticas y símbolos científicos. Admite la copia en un clic del código fuente LaTeX y del formato MathML compatible con Microsoft Word. ## Introducción Cuando le pides a Gemini que derive fórmulas o escriba expresiones matemáticas, normalmente las representa usando LaTeX. Aunque es visualmente atractivo, extraer el código fuente para usarlo en tus propios artículos, documentos o editores a menudo requiere un esfuerzo manual. Voyager proporciona un soporte fluido para esto: 1. **Detección Automática**: Voyager identifica automáticamente las fórmulas LaTeX representadas en la página. 2. **Botón de Copia**: Al pasar el cursor sobre una fórmula, aparece un icono de copia en su lado derecho. 3. **Opciones de Formato**: Haz clic en el icono para elegir: - **Copy LaTeX**: Copia el código fuente LaTeX estándar, ideal para Overleaf, editores de Markdown, etc. - **Copy MathML**: Copia el código fuente MathML, el mejor formato para pegar directamente en **Microsoft Word**. ![Copia de Fórmulas](/assets/gemini-math-copy.png) ## Características - **Compatibilidad con Word**: Con el soporte de MathML, puedes pegar fórmulas complejas generadas por IA directamente en documentos de Word manteniendo un formato editable perfecto. - **Preservación del Contexto**: No solo copia la fórmula en sí, sino que también preserva su contexto matemático. - **Respuesta Instantánea**: Procesado completamente de forma local para obtener resultados inmediatos. ## Consejos de Uso - **Escritura Académica**: Al escribir artículos en Word, haz que Gemini derive fórmulas y luego usa copiar y pegar en MathML para evitar la molestia de la entrada manual en el Editor de ecuaciones de Word. - **Toma de Notas**: Al tomar notas en Obsidian o Notion, simplemente copia la fuente LaTeX directamente. ================================================ FILE: docs/es/guide/getting-started.md ================================================ # Bienvenido a Bordo Felicidades. Tu flujo de trabajo acaba de subir de categoría. Voyager no es solo una herramienta, es un hábito. Dame 5 minutos para enseñarte. ## 1. Preparación ¿Aún no lo has instalado? Ve a la [Guía de Instalación](/es/guide/installation). ¿Instalado? Recarga la página de Gemini. El cambio es inmediato. ## 2. Navegación Ten una charla larga. Por ejemplo, sobre la historia de los caracteres chinos o la mecánica cuántica. Mira a la derecha. **Esa serie de puntos es tu mapa de navegación.** - **Señalar**: Echa un vistazo a lo que se dijo en ese momento. - **Clic**: Viaja instantáneamente de regreso. - **Presionar**: Mantén presionado para destacar, marca los momentos clave. No más scroll hasta que te duela el dedo. Tan rápido como tu pensamiento. ## 3. Archivo Mira la lista de chats a la izquierda. **Aquí están las carpetas.** Toma un chat, arrástralo y suéltalo. Suave como la seda. Anida, renombra, como desees. Despeja el desorden de tu mente, quédate solo con la claridad. ## 4. Tesoros ¿Escribiste un prompt genial? No dejes que se pierda. Haz clic en el **icono ✨** en el cuadro de entrada. Guárdalo, ponle una etiqueta. ¿Lo necesitas la próxima vez? Haz clic en el icono, busca, inserta. Esto no es solo chatear, es acumular tus activos digitales. --- **Despegue.** Profundiza en cada función: - [Domina la Línea de Tiempo](/es/guide/timeline) - [Maestro de Carpetas](/es/guide/folders) - [Gestiona Prompts](/es/guide/prompts) - [Domina tus Datos](/es/guide/export) ================================================ FILE: docs/es/guide/input-collapse.md ================================================ # Colapso del Cuadro de Entrada Colapsa automáticamente el cuadro de entrada cuando está vacío para ganar más espacio de lectura. Haz clic en el botón colapsado para expandir y escribir.
Colapso del cuadro de entrada
## Cómo Usar 1. Cuando el cuadro de entrada está vacío y pierde el foco, se colapsa automáticamente en un botón tipo cápsula compacto. 2. Haz clic en el botón cápsula para expandir el cuadro de entrada y comenzar a escribir. 3. También puedes presionar Ctrl/+I para expandir rápidamente el cuadro de entrada. 4. Puedes activar o desactivar esta función en el panel de configuración (desactivado por defecto). ================================================ FILE: docs/es/guide/installation.md ================================================ # Instalación ::: info Noticias 🍎 **¡La extensión nativa de Safari ya está disponible!** Es completamente gratuita y se puede instalar con un solo clic. ::: Elige tu camino. > ⚠️ El Gestor de Prompts es la única función compatible con Gemini™ para Empresas. ## 1. Tiendas Oficiales (Recomendado) La forma más sencilla de empezar. Las actualizaciones son automáticas. **Chrome / Brave / Opera / Vivaldi:** [Instalar desde Chrome Web Store](https://chromewebstore.google.com/detail/kjdpnimcnfinmilocccippmododhceol?utm_source=github&utm_medium=docs&utm_campaign=organic_growth&utm_content=es) ::: warning ⚠️ Chrome Web Store temporalmente no disponible La extensión ha sido oficialmente renombrada a **Voyager** por problemas de marcas. La actualización del nombre en Chrome Web Store está pendiente de revisión. Consulta [esta publicación](https://x.com/Nag1ovo/status/2031561180213313944) para más detalles. Usa **Edge / Firefox** o la **instalación manual** mientras tanto. ::: **Microsoft Edge:** [Instalar desde Microsoft Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/gemini-voyager/gibmkggjijalcjinbdhcpklodjkhhlne) **Firefox:** [Instalar desde Firefox Add-ons](https://addons.mozilla.org/firefox/addon/gemini-voyager/) ## 2. Manual (Versión más reciente) Las revisiones de la tienda son lentas. Si quieres las últimas funciones, toma este camino. **Chrome / Edge / Brave / Opera:** 1. Ve a [GitHub Releases](https://github.com/Nagi-ovo/gemini-voyager/releases) y descarga el último `gemini-voyager-chrome-vX.Y.Z.zip`. 2. Descomprímelo. 3. Abre la página de extensiones (`chrome://extensions`). 4. Activa el **Modo de desarrollador** (arriba a la derecha). 5. Haz clic en **Cargar descomprimida** y selecciona la carpeta que acabas de descomprimir. **Firefox:** 1. Ve a [Releases](https://github.com/Nagi-ovo/gemini-voyager/releases) y descarga el último `gemini-voyager-firefox-vX.Y.Z.xpi`. 2. Abre la gestión de complementos (`about:addons`). 3. Arrastra el archivo `.xpi` descargado allí para instalarlo (o haz clic en el engranaje ⚙️ arriba a la derecha -> **Instalar complemento desde archivo**). > 💡 El archivo XPI está firmado oficialmente por Mozilla y se puede instalar permanentemente en todas las versiones de Firefox. ## 3. Safari (macOS) ¡Safari ahora soporta distribución directa! Descarga la aplicación pre-firmada: 1. Descarga la última versión de Safari (.dmg). 2. Abre el archivo y sigue las instrucciones para instalarlo. 3. Haz doble clic para iniciar la aplicación. 4. Activa la extensión en **Preferencias de Safari > Extensiones**. > 💡 La versión de Safari ahora está firmada directamente para distribución — ¡no necesitas conversión con Xcode! > > ⚠️ **Limitaciones**: Debido a la naturaleza de Safari, (a) la eliminación de marcas de agua (b) la exportación de imágenes (se recomienda PDF) no son compatibles. --- _¿Quieres contribuir con código? Desarrolladores, por favor consulten la [Guía de Contribución](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/CONTRIBUTING.md)._ ================================================ FILE: docs/es/guide/markdown-fix.md ================================================ # Corrección de Renderizado Markdown La interfaz web de Gemini™ a veces inserta elementos HTML (como fuentes de citas o marcadores de resaltado) dentro del texto, lo que puede romper la sintaxis de negrita de Markdown (`**texto**`), haciendo que el texto no se muestre correctamente en negrita. Voyager incluye una función de corrección automática que identifica y repara de forma inteligente estas etiquetas de negrita rotas, asegurando que sus documentos se rendericen de manera limpia y precisa. > [!INFO] > Esta función se activa automáticamente y no requiere configuración adicional. ================================================ FILE: docs/es/guide/mermaid.md ================================================ # Renderizado de Gráficos Mermaid Renderiza automáticamente código Mermaid en gráficos visuales. ## Introducción Cuando Gemini™ genera un bloque de código Mermaid (como diagramas de flujo, diagramas de secuencia, diagramas de Gantt, etc.), Voyager lo detectará y renderizará automáticamente como un gráfico interactivo. ### Características Principales - **Detección Automática**: Soporta todos los tipos principales de gráficos Mermaid como `graph`, `flowchart`, `sequenceDiagram`, `gantt`, `pie`, `classDiagram`, etc. - **Cambio en un Clic**: Cambia libremente entre el gráfico renderizado y el código fuente con un botón. - **Vista en Pantalla Completa**: Haz clic en el gráfico para entrar en el modo de pantalla completa, con soporte para zoom con la rueda y arrastre para desplazar. - **Modo Oscuro**: Se adapta automáticamente al tema de la página. ## Cómo Usar 1. Pídele a Gemini que genere cualquier código de gráfico Mermaid. 2. El bloque de código será reemplazado automáticamente por el gráfico renderizado. 3. Haz clic en el botón ** Code** para ver el código original. 4. Haz clic en el botón **📊 Diagram** para volver a la vista de gráfico. 5. Haz clic en el área del gráfico para ver en pantalla completa. ## Controles en Modo Pantalla Completa - **Rueda**: Zoom en el gráfico. - **Arrastrar**: Mover la posición del gráfico. - **+/-**: Botones de zoom en la barra de herramientas. - **⊙**: Restablecer vista. - **✕ / ESC**: Cerrar pantalla completa. ## Compatibilidad y Solución de Problemas ::: warning Nota - **Limitación de Firefox**: Debido a restricciones del entorno, Firefox usa la versión 9.2.2 y no admite funciones nuevas como **Timeline** o **Sankey**. - **Errores de sintaxis**: Los fallos de renderizado suelen deberse a errores de sintaxis en la salida de Gemini. Estamos recopilando "bad cases" para implementar parches automáticos en futuras actualizaciones. :::
Renderizado de Gráficos Mermaid
================================================ FILE: docs/es/guide/nanobanana.md ================================================ # Opción NanoBanana ::: warning Compatibilidad de navegadores Actualmente, la función **NanoBanana** **no es compatible con Safari** debido a las limitaciones de la API del navegador. Recomendamos usar **Chrome** o **Firefox** si necesita usar esta función. Los usuarios de Safari pueden cargar manualmente sus imágenes descargadas en sitios de herramientas como [banana.ovo.re](https://banana.ovo.re/) para su procesamiento (aunque no se garantiza el éxito para todas las imágenes debido a las diferentes resoluciones). ::: **Imágenes de IA, como deben ser: puras.** Las imágenes generadas por Gemini™ vienen con una marca de agua visible por defecto. Aunque esto es por razones de seguridad, en ciertos escenarios creativos, puedes necesitar un borrador completamente limpio. ## Restauración Sin Pérdidas NanoBanana utiliza un **Algoritmo de Mezcla Alfa Inversa (Reverse Alpha Blending)**. - **Sin Repintado AI**: La eliminación de marcas de agua tradicional a menudo utiliza IA para difuminar, lo que puede destruir los detalles de la imagen. - **Precisión a Nivel de Píxel**: A través del cálculo matemático, eliminamos con precisión la capa transparente de la marca de agua superpuesta en los píxeles, restaurando el 100% de los puntos de píxel originales. - **Cero Pérdida de Calidad**: La imagen antes y después del procesamiento es completamente idéntica en las áreas sin marca de agua. ## Cómo Usar 1. **Habilitar Función**: Encuentra la "Opción NanoBanana" al final del panel de configuración de Voyager y activa "Eliminar marca de agua NanoBanana". 2. **Disparo Automático**: A partir de entonces, para cada imagen que generes, completaremos automáticamente el procesamiento de eliminación de marca de agua en segundo plano. 3. **Descarga Directa**: - Pasa el ratón sobre la imagen procesada y verás un botón 🍌. - **El botón 🍌 ha reemplazado completamente** al botón de descarga nativo, haz clic para descargar directamente la imagen 100% libre de marca de agua.
Ejemplo NanoBanana
## Agradecimientos Especiales Esta función se basa en el proyecto [gemini-watermark-remover](https://github.com/journey-ad/gemini-watermark-remover) desarrollado por [journey-ad (Jad)](https://github.com/journey-ad). Este proyecto es una adaptación en JavaScript de la [versión C++ de GeminiWatermarkTool](https://github.com/allenk/GeminiWatermarkTool) desarrollada por [allenk](https://github.com/allenk). Gracias a los autores originales por su contribución a la comunidad de código abierto. 🧡 ## Privacidad y Seguridad Todo el procesamiento de eliminación de marcas de agua se realiza **localmente en tu navegador**. Las imágenes no se suben a ningún servidor de terceros, protegiendo tu privacidad y seguridad creativa. ================================================ FILE: docs/es/guide/prevent-auto-scroll.md ================================================ # Evitar desplazamiento automático Cuando estás leyendo conversaciones anteriores, si envías un nuevo mensaje, Gemini™ forzará el desplazamiento de la página hasta el fondo para mostrar la nueva respuesta. Esto puede interrumpir tu lectura. La función **Evitar desplazamiento automático** intercepta este comportamiento de salto no deseado: - Cuando te has desplazado hacia arriba para leer el historial, el sistema bloquea el salto de la página hacia abajo. - Esta característica está **deshabilitada** por defecto. Puedes activarla manualmente en la ventana emergente de la extensión bajo la sección "Timeline Options". ## Cómo habilitarlo 1. Haz clic en el icono de la extensión Voyager en tu navegador para abrir las opciones. 2. Ubica la sección "Timeline Options" (Opciones de la Línea de Tiempo). 3. Activa el interruptor "Prevent auto-scroll to bottom" (Evitar desplazamiento automático). ================================================ FILE: docs/es/guide/prompts.md ================================================ # Tus Activos Digitales: Biblioteca de Prompts Pasaste mucho tiempo escribiendo un Prompt de nivel divino, fue de gran ayuda. ¿Usar y tirar? No, guárdalo. ## Bóveda de Inspiración Esta es tu bóveda. ### 1. Capturar ¿Escribiste algo bueno? Haz clic en el **icono flotante** junto al cuadro de entrada. Guárdalo en la bóveda, seguro en tu bolsillo. ### 2. Clasificar Etiquétalo como `#código`, `#email`, `#académico`. Las herramientas deben ser prácticas y estar ordenadas. ### 3. Desplegar La próxima vez que lo necesites, no lo vuelvas a escribir. Abre la bóveda, busca la etiqueta, haz clic para insertar. Llamada con un clic, duplica la eficiencia. ![Gestor de Prompts](/assets/gemini-prompt-manager.png) ## Disponible en Cualquier Lugar El Gestor de Prompts ahora se puede utilizar en cualquier sitio web que elijas, no solo en Gemini™ y AI Studio. ### Cómo Habilitarlo 1. Haz clic en el icono de Voyager en la barra de herramientas de tu navegador. 2. Desplázate hasta la sección **Gestor de Prompts**. 3. Ingresa la URL del sitio web (por ejemplo: `chatgpt.com` o `claude.ai`). 4. Haz clic en **Añadir sitio web** y concede el permiso. 5. **Recarga la página de destino** para ver el botón flotante. ### Sitios Web de IA Populares - `chatgpt.com` - ChatGPT - `claude.ai` - Claude - `copilot.microsoft.com` - Microsoft Copilot - `poe.com` - Poe ::: tip En sitios web personalizados, **solo** se activa la función del Gestor de Prompts. Otras funciones como la Línea de tiempo y las Carpetas están diseñadas específicamente para Gemini y no se cargarán. ::: ================================================ FILE: docs/es/guide/quote-reply.md ================================================ # Respuesta con Cita Voyager ofrece una conveniente función de "Respuesta con Cita", haciendo que responder a contenido específico sea más preciso y eficiente. ## Introducción En las conversaciones diarias, a menudo necesitamos hacer preguntas de seguimiento o refutar una parte específica de la salida de la IA. El método tradicional es copiar ese texto y luego escribir manualmente el símbolo `> ` en el cuadro de entrada, lo cual es muy tedioso. Voyager simplifica este proceso: 1. **Selecciona y Cita**: En la página de conversación (ya sea tu pregunta o la respuesta de Gemini), selecciona cualquier texto con el ratón. 2. **Botón Flotante**: Aparecerá automáticamente un botón de "Respuesta con Cita" cerca del texto seleccionado. 3. **Inserción en un Clic**: Haz clic en el botón, y el texto seleccionado se insertará automáticamente en tu cuadro de entrada con el formato de cita estándar de Markdown (`> contenido`). ![Respuesta con Cita](/assets/quote-reply.png) ## Características - **Conciencia de Contexto**: Identifica inteligentemente el contenido de la conversación, evitando disparadores falsos en áreas irrelevantes (como el propio cuadro de entrada). - **Formato Estándar**: Utiliza la sintaxis universal de Markdown, que Gemini entiende perfectamente, permitiendo respuestas más precisas. - **Soporte Multilínea**: Si seleccionas varias líneas de texto, Voyager agregará automáticamente símbolos de cita a cada línea, manteniendo el formato limpio. ## Consejos de Uso - **Preguntar Detalles**: Selecciona un concepto poco claro en la respuesta de Gemini, haz clic en citar y luego escribe "Por favor, explica este concepto en detalle". - **Corregir Errores**: Selecciona código o hechos incorrectos en la respuesta, cita y señala "Esto es incorrecto, debería ser...". ================================================ FILE: docs/es/guide/recents-hider.md ================================================ # Ocultar elementos recientes y Gems ::: info **Nota**: Esta función es compatible con la versión 1.1.9 y posteriores. ::: Agrega un elegante interruptor para ocultar la sección "Guardado recientemente" en la página de inicio de Gemini™ para una interfaz más limpia. ¡Ahora también permite ocultar la lista de **Gems** en la barra lateral!

Ocultar guardados recientemente

Ocultar lista de Gems

## Características - **Interruptor Contextual**: Un discreto botón de ocultar aparece solo cuando pasas el ratón sobre la sección de elementos recientes. - **Estado Minimalista**: Cuando está oculto, es reemplazado por una discreta "barra de vistazo" en la parte inferior. - **Restauración con un clic**: Simplemente pasa el ratón sobre la barra de vistazo y haz clic para recuperar tus elementos recientes al instante. - **Protección de Privacidad**: Evita que otras personas cercanas vean tus actividades recientes, ideal para espacios públicos. - **Persistencia**: Tu preferencia se guarda y se aplica automáticamente en tu próxima visita. ## Cómo usarlo 1. Pasa el ratón sobre la sección "Recientes" en la página de inicio de Gemini. 2. Haz clic en el icono de ojo tachado que aparece en la esquina superior derecha para ocultar la sección. 3. Para restaurar, pasa el ratón sobre la delgada línea que permanece en la parte inferior del área y haz clic. ================================================ FILE: docs/es/guide/settings.md ================================================ # A Tu Gusto Lo predeterminado ya es bueno. Pero queremos la perfección. Tu territorio, tus reglas. ## Modo Cine ¿Por qué mirar el mundo a través de una rendija? Haz el cuadro de chat más grande. - **Pantalla Ancha**: 1400px. Escribir código, ver tablas grandes, visión completa. - **Enfoque**: 800px. Lectura inmersiva, sin distracciones. - **Libre**: Arrastra el control deslizante, tan ancho como te sientas cómodo. ## Control Haz clic en el icono de la extensión, entra en la consola. - **Desplazamiento**: ¿Natural y suave, o sensación clásica? - **Posición**: Coloca la línea de tiempo donde te resulte más cómodo. - **Efectos Visuales**: Elige `Nieve`, `Sakura` o `Lluvia` para una atmósfera estacional. ## Orden personalizado ¿Demasiadas secciones en el popup y las que más usas están enterradas al fondo? Pasa el ratón sobre cualquier tarjeta de configuración y aparecerán los botones ▲/▼ en la esquina superior derecha. Haz clic para mover una tarjeta arriba o abajo. Tu disposición se guarda automáticamente. ## Atmósfera Voyager no se limita a mejoras de utilidad. También puedes cambiar el ambiente de la página. - **Nieve**: Copos suaves a la deriva para una sensación invernal tranquila. - **Sakura**: Pétalos de flor de cerezo flotantes para un toque primaveral más ligero. - **Lluvia**: Una capa de lluvia cinematográfica con líneas inclinadas y sutiles salpicaduras. - **Cambio suave**: Al desactivar un efecto o cambiar a otro, las partículas se desvanecen naturalmente.

Abrir Configuración

Guía para abrir configuración

Ajustar Vista

Ajuste de ancho de chat
================================================ FILE: docs/es/guide/sidebar-auto-hide.md ================================================ # Ocultar barra lateral automáticamente ¿Quieres una experiencia de chat más inmersiva? Ofrecemos la función de **Ocultar barra lateral automáticamente**. Cuando está activada, la barra lateral se contrae automáticamente cuando el ratón sale del área y se expande automáticamente cuando vuelves a mover el ratón hacia ella. ### Demostración
### Cómo activar 1. Abre el panel de configuración de Voyager. 2. Busca la opción **Ocultar barra lateral auto** en **Configuración general**. 3. Activa el interruptor. _Nota: Esta función actualmente solo es compatible con Google Gemini._ ================================================ FILE: docs/es/guide/sidebar.md ================================================ # Ancho de la barra lateral ¿Los nombres de las carpetas son demasiado largos? ¿O la barra lateral ocupa demasiado espacio? Ahora puedes ajustar libremente el ancho de la barra lateral. ## Cómo ajustar 1. Abre el panel de configuración de Voyager (haz clic en el icono de la extensión en la parte superior derecha). Cómo abrir el panel de configuración 2. Busca la opción **Ancho de la barra lateral**. 3. Arrastra el control deslizante para elegir el ancho que prefieras. - **Estrecho**: Ahorra espacio y concéntrate en la conversación. - **Ancho**: Ve los nombres completos de las carpetas de un vistazo. ## Plataformas compatibles Esta función es compatible con: - **Google Gemini** - **Google AI Studio** Tus ajustes se guardan automáticamente. ================================================ FILE: docs/es/guide/sponsor.md ================================================ # Patrocinar > [!NOTE] > Si Voyager te resulta útil, compártelo en X, Reddit, YouTube, etc. Cada difusión ayuda a que más personas descubran el proyecto y mejoren la experiencia con Gemini. Gracias. El mantenimiento de proyectos de código abierto se alimenta principalmente de pasión (y café) ☕ **[Voyager](https://github.com/Nagi-ovo/gemini-voyager)** es una extensión de navegador completamente gratuita y de código abierto diseñada para mejorar tu experiencia con Gemini. Si esta extensión te ayuda a usar Gemini de manera más eficiente, te agradezco tu apoyo para seguir desarrollando y manteniendo este proyecto a través de los siguientes métodos. --- ## Plataformas en Línea Afdian ### 🎙️ Herramienta Recomendada: Typeless Recomiendo encarecidamente **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**, una herramienta de voz a texto con IA. La integré en mi flujo de trabajo diario durante el desarrollo de Voyager, lo que me ahorró una enorme cantidad de tiempo y aumentó significativamente mi productividad. > 🎁 **[Únete a través de mi enlace de referencia](https://www.typeless.com/?via=gemini-voyager)** (Código: _`gemini-voyager`_) para obtener **$5 en créditos gratis**. ¡Esto también me da créditos para seguir manteniendo este proyecto, una forma gratuita de apoyar mi trabajo! ❤️ --- ## Donar via QR 🍵
WeChat Pay WeChat Pay
Alipay Alipay
--- ¡Gracias por tu apoyo! Cada contribución es el mayor estímulo para mí ❤️ ================================================ FILE: docs/es/guide/tab-title.md ================================================ # Sincronización de Título de Pestaña Sincroniza automáticamente el título de la pestaña del navegador con el título de la conversación actual de Gemini™. ## Introducción - **Sincronización en Tiempo Real**: Cuando el título de la conversación cambia (por ejemplo, la IA genera un nuevo título o lo renombras manualmente), el título de la pestaña del navegador no será solo "Gemini", sino que se actualizará inmediatamente al contenido específico de la conversación. - **Soporte Multipágina**: Soporta perfectamente páginas de conversación ordinarias, conversaciones de Gem y entornos de múltiples cuentas. - **Control de Interruptor**: Si no te gusta esta función, puedes desactivarla en cualquier momento en la sección "Opciones Generales" del panel de configuración.
Sincronización de Título de Pestaña
## Cómo Usar 1. Después de instalar la extensión, esta función está activada por defecto. 2. Abre cualquier conversación de Gemini, observa el título de la pestaña del navegador, cambiará automáticamente al título de la conversación actual. 3. Para desactivar: - Haz clic en el icono de la extensión para abrir el panel de configuración. - Busca "Opciones Generales" (General Options). - Desactiva el interruptor "Sincronizar título de pestaña con conversación" (Update Tab Title). ================================================ FILE: docs/es/guide/timeline.md ================================================ # Viaje en el Tiempo Las conversaciones largas son un desastre. Arriba y abajo, perdido. Voyager convierte la conversación en una línea. ## Ver el Ritmo Mira el lado derecho de la pantalla. Cada punto es una frase. Ese es el pulso de tu conversación. ## Navegación, Paso a Paso - **Teletransporte**: Haz clic y ve, sin demoras. - **Vistazo**: Pasa el ratón por encima, ve el contenido sin saltar. - **Marcador**: Mantén presionado un nodo para **destacar**. Pon un marcador para tu cerebro. - **Niveles (Experimental)**: Clic derecho en un nodo para establecer niveles (1-3) o contraer hijos. Haz que las conversaciones ramificadas sean claras. - **Atajos**: Vuela con el teclado. Por defecto `j`/`k` para saltar arriba/abajo, cámbialo si quieres. ![Navegación de Línea de Tiempo](/assets/teaser.png) ## Teclado, Más Rápido ¿No quieres usar el ratón? Usa el teclado. **Es como activar el Modo Vim en Gemini.** ### Atajos Predeterminados - `k` - Saltar al nodo anterior - `j` - Saltar al nodo siguiente ### Personalizar Abre la configuración de la extensión, haz clic en el cuadro de atajos y presiona la tecla que quieras usar. Cualquier tecla, cualquier combinación. ¿`n`/`p`? ¿`,`/`.`? Tú decides. En **Modo Flujo**, presionar repetidamente pondrá en cola la animación. En **Modo Salto**, respuesta inmediata, velocidad máxima. ================================================ FILE: docs/es/index.md ================================================ --- layout: home hero: name: 'Voyager' text: 'Finalmente, está completo.' tagline: 'Pensamiento tangible, todo en su lugar.' image: src: /logo.png alt: Logo de Voyager actions: - theme: brand text: Descargar e Instalar link: ./guide/installation - theme: alt text: Comenzar el viaje link: ./guide/getting-started teaser: title: 'Redefiniendo la interacción.' description: 'No construimos extensiones, remodelamos el pensamiento.
Con Voyager, no es el humano adaptándose a la interfaz, sino la interfaz fluyendo con tu mente.' image: '/assets/teaser.png' features: - title: 'Línea de Tiempo' details: 'Ve el pulso de la conversación.
Haz que el tiempo lineal se convierta en espacio tangible.' - title: 'Carpetas' details: 'Dale un hogar a tus ideas.
Incluso un pensamiento fugaz merece ser tratado con seriedad.' - title: 'Control' details: 'Tus datos son yours.
Rompe los muros de la nube, haz que el conocimiento te pertenezca.' features: - icon: 🧭 title: Línea de Tiempo details: No hagas scroll, vuela. Llega instantáneamente a cualquier punto de tu pensamiento. - icon: 🗂️ title: Carpetas details: Adiós al caos. Sensación nativa, operación intuitiva, todo organizado. - icon: ✨ title: Bóveda de Prompts details: Captura la inspiración. Atesora cada uno de tus momentos brillantes. - icon: 💬 title: Respuesta con Cita details: Selecciona para citar. Respuestas contextualizadas para una comunicación eficiente. - icon: ↔️ title: Ancho del chat details: Amplía tu visión. Ajusta libremente el ancho del chat para una mejor experiencia de visualización. - icon: 💾 title: Exportación de Chat details: Tus datos son tuyos. Múltiples formatos para archivar en un clic, el conocimiento no se pierde. - icon: 🌦️ title: Efectos Visuales details: Crea el ambiente. Cambia entre nieve, lluvia y pétalos de sakura desde la ventana emergente. - icon: 🍌 title: Eliminación de Marca de Agua NanoBanana details: Eliminación sin pérdidas. Deja que los momentos generados por IA vuelvan a ser puros. - icon: 📐 title: Copie de Fórmulas details: Copia en un clic los códigos fuente LaTeX y MathML (Word). - icon: 🧜‍♀️ title: Gráficos Mermaid details: De código a visuales. Diagramas de flujo, de secuencia y de Gantt renderizados al instante. - icon: 🏷️ title: Sincronización de Título de Pestaña details: De un vistazo. Sincroniza automáticamente el título de la pestaña con el título de la conversación. - icon: 🔀 title: Bifurcación de Conversación (Experimental) details: Pensamiento divergente. Bifurca la conversación en cualquier nodo para explorar diferentes posibilidades. - icon: 🗑️ title: Eliminación por Lote details: Limpieza en un clic. Selecciona múltiples conversaciones, elimina por lote, adiós a lo tedioso. - icon: ☁️ title: Sincronización en la Nube details: Siempre sincronizado. Respalda carpetas y prompts en Google Drive entre dispositivos. - icon: ⚡️ title: Modelo predeterminado details: Deja de repetirte. Cambia automáticamente a tu modelo preferido en nuevos chats. - icon: 🔬 title: Deep Research details: Abre la caja negra. Extrae procesos de pensamiento y enlaces de las sesiones de Deep Research. ---
⚠️ Aviso de cambio de nombre: Debido a problemas de marcas y derechos de autor, esta extensión ha sido renombrada oficialmente a Voyager. Sin embargo, debido a la lentitud del proceso de revisión de Chrome Web Store, el cambio de nombre no fue aprobado en 7 días — está temporalmente no disponible en Chrome Web Store.

Cada descarga es una medida de confianza

Datos en tiempo real de Chrome Web Store y GitHub. Un tributo a cada Voyager que viaja con nosotros.

Estrellas en GitHub Forks en GitHub Última versión Descargas en GitHub Usuarios Chrome Web Store Calificación Chrome Web Store Edge Add-ons Usuarios Firefox Add-ons Calificación Firefox Add-ons
Nagi-ovo%2Fgemini-voyager | Trendshift

Agradecimientos Especiales

✨ ¡Estamos en vivo en Product Hunt! Bienvenidos a compartir sus ideas y comentarios. ❤️

Voyager en Product Hunt

“No es solo una herramienta, es un compañero para el viaje de tu mente.”

Explora más →

================================================ FILE: docs/es/privacy.md ================================================ # Política de Privacidad Última actualización: 16 de marzo de 2026 ## Introducción Voyager (en adelante "nosotros") se compromete a proteger su privacidad. Esta política de privacidad explica cómo nuestra extensión de navegador recopila, utiliza y protege su información. ## Recopilación y Uso de Datos **No recopilamos ninguna información personal.** Voyager se ejecuta completamente en local en su navegador. Todos los datos generados o gestionados por la extensión (como carpetas, plantillas de prompts, mensajes favoritos y configuraciones) se almacenan en: 1. Su dispositivo local (`chrome.storage.local`) 2. El almacenamiento sincronizado de su navegador (`chrome.storage.sync`, si está disponible), para sincronizar configuraciones entre sus dispositivos. No tenemos acceso a sus datos personales, historial de chat ni ninguna otra información privada. Tampoco rastreamos su historial de navegación. ## Sincronización con Google Drive (Opcional) Si activa explícitamente la función de sincronización con Google Drive, la extensión utiliza la API Chrome Identity para obtener un token OAuth2 (solo con el scope `drive.file`) para realizar copias de seguridad de sus carpetas y prompts en **su propio Google Drive**. Esta transferencia ocurre directamente entre su navegador y los servidores de Google. No tenemos acceso a estos datos y nunca se envían a ningún servidor que operemos. ## Permisos Esta extensión solo solicita los permisos mínimos necesarios para funcionar: - **Storage (Almacenamiento)**: Para guardar sus preferencias, carpetas, prompts, mensajes favoritos y opciones de personalización de la interfaz localmente y entre dispositivos. - **Identity (Identidad)**: Para la autenticación de Google de la función opcional de sincronización con Google Drive. Solo se usa cuando activa explícitamente la sincronización en la nube. - **Scripting (Scripts)**: Para inyectar dinámicamente scripts de contenido en las páginas de Gemini y en sitios web personalizados especificados por el usuario para la función Gestor de Prompts. Solo se inyectan scripts incluidos en la propia extensión — no se descarga ni ejecuta código remoto. - **Host Permissions (Permisos de host)** (gemini.google.com, aistudio.google.com, etc.): Para inyectar scripts de contenido que mejoran la interfaz de Gemini con funciones como carpetas, exportación, línea de tiempo y cita de respuesta. Los dominios adicionales de Google (googleapis.com, accounts.google.com) son necesarios para la autenticación de la sincronización con Google Drive. - **Optional Host Permissions (Permisos de host opcionales)** (todas las URL): Solo se solicitan en tiempo de ejecución cuando usted añade explícitamente sitios web personalizados para el Gestor de Prompts. Nunca se activan sin su acción. ## Servicios de Terceros Voyager no comparte datos con ningún servicio de terceros, anunciantes o proveedores de análisis. ## Cambios en la Política Podemos actualizar nuestra política de privacidad de vez en cuando. Le notificaremos cualquier cambio publicando la nueva política de privacidad en esta página. ## Contáctenos Si tiene alguna pregunta sobre esta política de privacidad, contáctenos a través de nuestro [repositorio de GitHub](https://github.com/Nagi-ovo/gemini-voyager). ================================================ FILE: docs/fr/guide/batch-delete.md ================================================ # Suppression par Lot Supprimez plusieurs conversations à la fois, fini la suppression une par une. ## Fonctionnalités - **Mode Multi-sélection** : Appui long sur n'importe quelle conversation pour entrer en mode multi-sélection et cocher plusieurs conversations à supprimer. - **Nettoyage en un clic** : Une fois sélectionnées, cliquez sur le bouton supprimer pour retirer toutes les conversations choisies en une seule fois. - **Retour sur la progression** : La progression en temps réel est affichée pendant la suppression pour que vous connaissiez le statut actuel. - **Confirmation Sécurisée** : Une boîte de dialogue de confirmation apparaît avant la suppression pour éviter les opérations accidentelles.
Suppression par Lot
## Comment Utiliser 1. Dans la liste des conversations de la barre latérale, faites un **appui long** sur n'importe quel élément de conversation. 2. Après être entré en mode multi-sélection, des cases à cocher apparaîtront sur le côté gauche de chaque conversation. 3. Cochez les conversations que vous souhaitez supprimer (jusqu'à 50 à la fois). 4. Cliquez sur le **Bouton Supprimer** qui apparaît. 5. Cliquez sur "Confirmer" dans la zone de confirmation rouge qui apparaît **au-dessus de la liste des dossiers** pour lancer la suppression. ::: tip Note Le panneau de confirmation se superpose à la zone des dossiers pour éviter de bloquer la liste des conversations. Les opérations de suppression par lot ne peuvent pas être annulées, veuillez donc procéder avec prudence. ::: ================================================ FILE: docs/fr/guide/cloud-sync.md ================================================ # Synchronisation Cloud Synchronisez vos dossiers, votre bibliothèque de prompts et d'autres données sur Google Drive pour garder votre expérience cohérente sur tous vos appareils. ## Fonctionnalités - **Synchronisation multi-appareils** : Gardez vos configurations synchronisées sur plusieurs ordinateurs grâce à Google Drive. - **Confidentialité des données** : Les données sont stockées directement dans votre propre espace Google Drive, garantissant la confidentialité sans serveurs tiers. - **Synchronisation flexible** : Prise en charge du téléchargement manuel et de la fusion des données. ::: info **Bientôt disponible** : La prochaine version prendra en charge la synchronisation des conversations favorites. ::: ## Comment utiliser 1. Cliquez sur l'icône de l'extension dans le coin inférieur droit de la page Gemini™ pour ouvrir le panneau des paramètres. 2. Localisez la section **Synchronisation Cloud**. 3. Cliquez sur **Se connecter avec Google** et complétez l'autorisation. 4. Une fois autorisé, cliquez sur **Télécharger vers le Cloud** pour synchroniser vos données locales vers le cloud, ou sur **Télécharger et fusionner** pour ramener les données du cloud vers votre machine locale. ### 💡 Synchronisation rapide La façon la plus simple est de cliquer sur les boutons **"Télécharger vers le Cloud"** ou **"Télécharger et fusionner"** en haut de la zone des dossiers dans la barre latérale gauche. Boutons de synchronisation rapide Cloud ::: warning **Recommandation de sécurité : Double protection** Bien que la synchronisation Cloud offre une grande commodité, nous vous recommandons vivement de sauvegarder également périodiquement vos données de base à l'aide de **fichiers locaux**. 1. **Exportation complète** : Exportez un package complet contenant tous les paramètres, dossiers et prompts depuis « Sauvegarde et restauration » en bas du panneau de configuration. Exportation complète 2. **Exporter tous les dossiers** : Cliquez sur « Exporter » dans la section « Dossiers » du panneau de configuration pour sauvegarder tous vos dossiers et conversations, sans inclure les prompts. Exporter tous les dossiers ::: ================================================ FILE: docs/fr/guide/community.md ================================================ # Communauté & Feedback Nous apprécions la voix de chaque utilisateur. Que vous ayez trouvé un bug, une suggestion de fonctionnalité, ou que vous souhaitiez partager votre coffre-fort de prompts, il existe plusieurs façons de nous contacter. ## 📢 Suivre les Mises à Jour Suivez-nous sur X (Twitter) pour obtenir les dernières mises à jour de développement. - **Nouvelles Versions** : Soyez le premier informé des mises à jour. - **Aperçus de Fonctionnalités** : Obtenez un avant-goût des fonctionnalités à venir. ## 💬 Communauté Discord Rejoignez notre serveur Discord pour discuter avec d'autres Voyageurs ! - **Chat en Temps Réel** : Discutez directement avec d'autres utilisateurs et les développeurs. - **Partage de Prompts** : Voyez comment les autres utilisent Gemini™ et partagez vos meilleurs prompts. - **Mises à Jour de Développement** : Recevez les dernières nouvelles sur les fonctionnalités et versions à venir. ## 🐙 GitHub Issues Si vous avez trouvé un bug ou avez une demande de fonctionnalité spécifique, veuillez ouvrir une issue sur GitHub : - [Signaler un Bug](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=bug_report.yml) - [Suggérer une Fonctionnalité](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=feature_request.yml) Merci de soutenir Voyager ! ❤️ ================================================ FILE: docs/fr/guide/context-sync.md ================================================ # Transport de mémoire : Synchronisation du contexte (Expérimental) **Différentes dimensions, partage fluide** Élaborez la logique sur le web et implémentez le code dans l'IDE. Voyager brise les barrières dimensionnelles, dotant instantanément votre IDE du « processus de réflexion » du web. ## Fini les sauts d'onglets incessants Le plus grand calvaire des développeurs : après avoir discuté longuement d'une solution sur le web, vous retournez sur VS Code/Trae/Cursor et devez réexpliquer les besoins comme à un étranger. En raison des quotas et de la vitesse de réponse, le web est le « cerveau » et l'IDE les « mains ». Voyager leur permet de partager une même âme. ## Trois étapes simples pour synchroniser 1. **Installer et activer CoBridge** : Installez l'extension **CoBridge** dans VS Code. C'est le pont central qui relie l'interface web à votre IDE local. - **[Installer via le VS Code Marketplace](https://open-vsx.org/extension/windfall/co-bridge)** ![Extension CoBridge](/assets/CoBridge-extension.png) Après l'installation, **ouvrez n'importe quel répertoire de travail**, cliquez sur l'icône à droite et lancez le serveur. ![Serveur CoBridge activé](/assets/CoBridge-on.png) 2. **Connexion et poignée de main** : - Activez la « Synchronisation du contexte » dans les paramètres de Voyager. - Alignez les numéros de port. Lorsque vous voyez « IDE en ligne », ils sont connectés. ![Console de synchronisation du contexte](/assets/context-sync-console.png) 3. **Synchronisation en un clic** : Cliquez sur **« Synchroniser vers l'IDE »**. Qu'il s'agisse de **tableaux de données** complexes ou d'**images de référence** intuitives, tout peut être synchronisé instantanément avec votre IDE. ![Synchronisation terminée](/assets/sync-done.png) ## Enracinement dans l'IDE Une fois la synchronisation terminée, un fichier `.cobridge/AI_CONTEXT.md` apparaîtra dans le répertoire de travail de votre IDE. Que ce soit Trae, Cursor ou Copilot, ils liront automatiquement cette « mémoire » via leurs fichiers Rule respectifs. ``` your-project/ ├── .cobridge/ │ ├── images/ │ │ ├── context_img_1_1.png │ │ └── context_img_1_2.png │ └── AI_CONTEXT.md ├── .github/ │ └── copilot-instructions.md ├── .gitignore ├── .traerules └── .cursorrules ``` ## Principes - **Zéro pollution** : CoBridge gère automatiquement le fichier `.gitignore`, garantissant que vos conversations privées ne sont jamais poussées vers les dépôts Git. - **Adapté à l'IA** : Format Markdown complet, rendant la lecture par l'IA de votre IDE aussi fluide que celle d'un manuel d'instructions. - **Conseil** : Si la conversation date d'un certain temps, remontez d'abord avec la [Timeline] pour permettre au web de se « remémorer » le contexte afin d'obtenir de meilleurs résultats de synchronisation. --- ## Prêt pour le Décollage **La réflexion est prête dans le cloud, laissez-la maintenant s'enraciner localement.** - **[Installer l'extension CoBridge](https://open-vsx.org/extension/windfall/co-bridge)** : Trouvez votre portail dimensionnel et activez la « respiration synchronisée » en un clic. - **[Visiter le dépôt GitHub](https://github.com/Winddfall/CoBridge)** : Plongez dans la logique profonde de CoBridge ou donnez une Star à ce projet de « synchronisation d'âme ». > **Les grands modèles ne perdent plus la mémoire ; prêts pour l'action immédiate.** ================================================ FILE: docs/fr/guide/deep-research.md ================================================ # Export Deep Research Exportez le rapport final généré par Deep Research ou enregistrez son processus de "réflexion" complet sous forme de fichier Markdown. ## 1. Exportation de rapport (PDF / Image) Les rapports générés par Deep Research peuvent être exportés sous forme de fichiers PDF magnifiquement mis en forme ou d'images uniques pour un partage facile (les formats Markdown et JSON sont également pris en charge). ![Exportation de rapport](/assets/deep-research-report-export.png) ## 2. Exportation du processus de réflexion (Markdown) En plus du rapport final, vous pouvez également exporter le contenu complet de "réflexion" des conversations Deep Research. ### Fonctionnalités - **Export en un clic** : Le bouton de téléchargement apparaît dans le menu de conversation (⋮). - **Format structuré** : Préserve les phases de réflexion, les éléments de pensée et les sites web recherchés dans leur ordre original. - **En-têtes bilingues** : Les fichiers Markdown incluent des en-têtes de section en anglais et dans votre langue actuelle. - **Nommage automatique** : Les fichiers sont horodatés pour une organisation facile (ex : `deep-research-thinking-20240128-153045.md`). ### Comment Utiliser 1. Ouvrez une conversation Deep Research sur Gemini™. 2. Cliquez sur le bouton **Partager et exporter** dans la conversation. 3. Sélectionnez "Télécharger le contenu de réflexion" (Download thinking content). 4. Le fichier Markdown sera automatiquement téléchargé. ![Exportation de réflexion Deep Research](/assets/deepresearch_download_thinking.png) ### Format du Fichier Exporté Le fichier Markdown exporté inclut : - **Titre** : Le titre de la conversation. - **Métadonnées** : Horodatage de l'export et nombre total de phases de réflexion. - **Phases de Réflexion** : Chaque phase contient : - Éléments de pensée (avec en-têtes et contenu). - Sites web recherchés (avec liens et titres). #### Exemple de Structure ```markdown # Titre de la Conversation Deep Research **导出时间 / Exported At:** 2025-12-28 17:25:35 **总思考阶段 / Total Phases:** 3 --- ## 思考阶段 1 / Thinking Phase 1 ### Titre de la Pensée 1 Contenu de la pensée... ### Titre de la Pensée 2 Contenu de la pensée... #### 研究网站 / Researched Websites - [domain.com](https://example.com) - Titre de la Page - [another.com](https://another.com) - Autre Titre --- ## 思考阶段 2 / Thinking Phase 2 ... ``` ## Confidentialité Toute l'extraction et le formatage se font à 100% localement dans votre navigateur. Aucune donnée n'est envoyée à des serveurs externes. ================================================ FILE: docs/fr/guide/default-model.md ================================================ # Modèle par Défaut ::: info **Note** : Cette fonctionnalité est prise en charge dans la version 1.1.9 et ultérieure. ::: Définissez un modèle Gemini™ préféré par défaut pour éviter de changer manuellement à chaque nouvelle conversation.
## Fonctionnalités - **Configuration Interactive** : Ajoute un bouton "Étoile" directement dans le menu natif de sélection de modèle de Gemini. - **Commutation Automatique** : Bascule automatiquement vers votre modèle préféré chaque fois que vous commencez une nouvelle conversation. - **Préférence Persistante** : Votre choix est enregistré et synchronisé sur vos appareils. - **Optimisé pour SPA** : Se déclenche avec précision lors d'un clic sur le bouton "Nouveau chat", l'utilisation de raccourcis ou le retour à la page d'accueil. ## Comment l'utiliser 1. Cliquez sur le **Sélecteur de modèle** au-dessus de la zone de saisie Gemini. 2. Survolez votre modèle préféré et cliquez sur l'**icône Étoile**. 3. Une fois que l'étoile est **pleine**, ce modèle est défini par défaut. 4. L'extension sélectionnera désormais automatiquement ce modèle pour tous les nouveaux chats. 5. Pour annuler, cliquez simplement à nouveau sur l'icône de l'étoile pleine. ================================================ FILE: docs/fr/guide/export.md ================================================ # Liberté Totale Le verrouillage des données est l'ennemi. Nous croyons que si vous le créez, vous le possédez. ## Tout Exporter Voyager vous permet de retirer vos données du cloud pour les mettre entre vos mains. ### Les Formats - **Markdown** : Pour votre coffre Obsidian ou Notion. Texte propre et formaté. (Utilisateurs de Safari : les images ne peuvent pas être extraites en raison des limitations du navigateur, utilisez l'export PDF) - **PDF** : Pour partager ou imprimer. Mise en page magnifique, images incluses. - **JSON** : Données brutes. Pour les développeurs qui veulent construire par-dessus leur historique. ### Comment Exporter 1. Survolez le logo Gemini pour voir l'**Icône d'Export**. 2. Choisissez votre format. 3. C'est fait. Ce sont vos données. Faites-en ce que vous voulez.

Étape 1 : Survoler le Logo

Guide export étape 1

Étape 2 : Le Choix

Guide export étape 2
### Remarque concernant l'exportation PDF sur Safari L'exportation en PDF sur Safari nécessite une procédure légèrement différente (impression manuelle) : 1. Cliquez sur le bouton **Exporter** et sélectionnez le format PDF. 2. **Attendez environ une seconde** (pour permettre à la page de préparer les styles d'impression). 3. Appuyez sur `Command + P` pour ouvrir la boîte de dialogue d'impression. 4. Sélectionnez **"Enregistrer au format PDF"** (Save to PDF) dans la boîte de dialogue d'impression. Safari Export PDF ================================================ FILE: docs/fr/guide/folders.md ================================================ # Les dossiers, comme ils devraient l'être Pourquoi organiser les chats AI est-il si difficile ? Nous avons réglé ça. Nous avons construit un système de fichiers pour vos pensées.

Gemini™

Dossiers Gemini

AI Studio

Dossiers AI Studio
## La physique de l'organisation C'est tout simplement naturel. - **Glisser-Déposer** : Prenez un chat. Déposez-le dans un dossier. C'est tactile. - **Hiérarchie imbriquée** : Les projets ont des sous-projets. Créez des dossiers dans des dossiers. Structurez à _votre_ façon. - **Espacement des dossiers** : Ajustez la densité de la barre latérale, de compact à spacieux. > _Note : Sur Mac Safari, les ajustements peuvent ne pas être en temps réel ; actualisez la page pour voir l'effet._ - **Synchronisation Instantanée** : Organisez sur votre bureau. Retrouvez-le sur votre ordinateur portable. ## Astuces de Pro - **Multi-Sélection** : Appui long sur une conversation pour entrer en mode multi-sélection, puis sélectionnez plusieurs chats et déplacez-les tous en une fois. - **Renommer** : Double-cliquez sur n'importe quel dossier pour le renommer. - **Icônes** : Nous détectons automatiquement le type de Gem (Codage, Créatif, etc.) et attribuons la bonne icône. Vous n'avez rien à faire. ## Différences de fonctionnalités par plateforme ### Fonctionnalités communes - **Gestion de base** : Glisser-déposer, renommer, multi-sélection. - **Reconnaissance intelligente** : Détecte automatiquement les types de chat et assigne des icônes. - **Hiérarchie imbriquée** : Support pour l'imbrication des dossiers. - **Adaptation AI Studio** : Les fonctionnalités avancées seront bientôt disponibles sur AI Studio. - **Sync Google Drive** : Synchronise la structure des dossiers avec Google Drive. ### Exclusivité Gemini #### Couleurs personnalisées Cliquez sur l'icône du dossier pour personnaliser sa couleur. Choisissez parmi 7 couleurs par défaut ou utilisez le sélecteur de couleurs pour choisir n'importe quelle couleur. Couleurs des dossiers #### Isolation de compte Cliquez sur l'icône « personne » dans l'en-tête pour filtrer instantanément les chats des autres comptes Google. Gardez votre espace de travail propre lorsque vous utilisez plusieurs comptes. Isolation de compte #### Organisation automatique par IA Trop de chats, la flemme de trier ? Laissez Gemini réfléchir à votre place. Un clic copie votre structure de conversations actuelle, collez-la dans Gemini, et il génère un plan de dossiers prêt à importer — organisation instantanée. **Étape 1 : Copiez votre structure de conversations** En bas de la section dossiers dans le popup de l'extension, cliquez sur le bouton **AI Organize**. Il collecte automatiquement toutes vos conversations non classées et la structure de dossiers existante, génère un prompt et le copie dans votre presse-papiers. AI Organize Button **Étape 2 : Laissez Gemini trier** Collez le contenu du presse-papiers dans une conversation Gemini. Il analysera vos titres de chat et produira un plan de dossiers en JSON. **Étape 3 : Importez les résultats** Cliquez sur **Importer des dossiers** depuis le menu du panneau de dossiers, sélectionnez **Ou collez du JSON directement**, collez le JSON renvoyé par Gemini, puis cliquez sur **Importer**.
Import Menu
Paste JSON Import
- **Fusion incrémentale** : Utilise la stratégie « Fusionner » par défaut — ajoute uniquement les nouveaux dossiers et assignations, sans jamais détruire votre organisation existante. - **Multilingue** : Le prompt utilise automatiquement votre langue configurée, et les noms de dossiers sont générés dans cette langue également. ### Exclusivité AI Studio - **Ajustement de la barre latérale** : Faites glisser pour redimensionner la largeur de la barre latérale. - **Intégration Library** : Glissez directement depuis votre Library vers les dossiers. ================================================ FILE: docs/fr/guide/fork.md ================================================ # Bifurcation de Conversation (Expérimental) La pensée ne devrait pas être à sens unique. Dans les explorations complexes, nous avons souvent besoin de revenir à un nœud crucial et d'essayer d'autres possibilités. Avec la fonctionnalité de **Bifurcation**, Voyager vous permet de développer vos idées et d'explorer des univers parallèles de votre discussion. ## Comment ça marche > **⚠️ Remarque** : Il s'agit d'une fonctionnalité expérimentale. Vous devez d'abord l'activer en cliquant sur l'icône de l'extension dans votre barre d'outils pour ouvrir la fenêtre contextuelle des paramètres, et en activant le commutateur **"Activer la bifurcation de conversation"**. Chaque fois que vous souhaitez emprunter un chemin différent, survolez simplement votre question et cliquez sur le bouton **Bifurquer** : ![Bifurcation](/assets/branching.png) Voyager capturera instantanément tout le contexte depuis le début jusqu'à ce point et **créera une toute nouvelle conversation** pour vous. Dans cette nouvelle branche, vous pouvez modifier librement votre question et explorer différentes directions sans craindre de détruire votre historique de conversation d'origine. Libérez votre créativité et votre curiosité ! ================================================ FILE: docs/fr/guide/formula-copy.md ================================================ # Copie de Formules Voyager facilite grandement la réutilisation de formules mathématiques et de symboles scientifiques. Il prend en charge la copie en un clic du code source LaTeX et du format MathML compatible avec Microsoft Word. ## Présentation Lorsque vous demandez à Gemini de dériver des formules ou d'écrire des expressions mathématiques, il les affiche généralement en utilisant LaTeX. Bien que le rendu soit esthétique, l'extraction du code source pour l'utiliser dans vos propres articles, documents ou éditeurs nécessite souvent un effort manuel. Voyager offre un support transparent pour cela : 1. **Détection Automatique** : Voyager identifie automatiquement les formules LaTeX affichées sur la page. 2. **Bouton de Copie** : Lorsque vous survolez une formule, une icône de copie apparaît sur son côté droit. 3. **Options de Format** : Cliquez sur l'icône pour choisir : - **Copy LaTeX** : Copie le code source LaTeX standard, idéal pour Overleaf, les éditeurs Markdown, etc. - **Copy MathML** : Copie le code source MathML, le meilleur format pour coller directement dans **Microsoft Word**. ![Copie de Formules](/assets/gemini-math-copy.png) ## Caractéristiques - **Compatibilité Word** : Grâce au support MathML, vous pouvez coller des formules complexes générées par l'IA directement dans des documents Word tout en conservant un format éditable parfait. - **Préservation du Contexte** : Ne copie pas seulement la formule, mais préserve également son contexte mathématique. - **Réponse Instantanée** : Traitement entièrement local pour des résultats immédiats. ## Conseils d'utilisation - **Rédaction Académique** : Lors de la rédaction d'articles dans Word, demandez à Gemini de dériver des formules, puis utilisez le copier-coller MathML pour éviter la saisie manuelle dans l'éditeur d'équations de Word. - **Prise de Notes** : Lorsque vous prenez des notes dans Obsidian ou Notion, copiez simplement la source LaTeX directement. ================================================ FILE: docs/fr/guide/getting-started.md ================================================ # Bienvenue à Bord Félicitations. Vous venez de mettre à niveau votre intellect. Voyager n'est pas juste un utilitaire ; c'est un flux de travail. Voici comment en tirer le meilleur parti en 5 minutes. ## 1. La Configuration Si vous ne l'avez pas encore installé, rendez-vous sur le [Guide d'Installation](/fr/guide/installation). Une fois installé, rafraîchissez votre onglet Gemini. Vous verrez la différence immédiatement. ## 2. La Chronologie Lancez une conversation. Une longue. Posez des questions sur l'histoire de la typographie ou la physique des trous noirs. Regardez sur la droite. **Cette bande de points ? C'est votre carte.** - **Survolez** pour jeter un coup d'œil à ce que vous avez dit. - **Cliquez** pour vous téléporter à cet endroit. - **Appui long** pour mettre une étoile sur un moment que vous voulez garder. Fini le défilement sans fin. Vous naviguez désormais à la vitesse de la pensée. ## 3. L'Organisation Regardez votre liste de chats sur la gauche. Remarquez quelque chose de nouveau ? **Les Dossiers.** Prenez un chat. Glissez-le. Déposez-le dans un dossier. Cela semble naturel, n'est-ce pas ? C'est parce que ça l'est. Vous pouvez les imbriquer, les renommer, et enfin vider votre esprit de tout désordre. ## 4. Le Coffre-fort Vous ne faites plus que discuter. Vous construisez un coffre-fort de votre propre génie. --- **Vous êtes prêt.** Explorez les guides spécifiques pour approfondir : - [Maîtrise de la Chronologie](/fr/guide/timeline) - [Gestion des Dossiers](/fr/guide/folders) - [Ingénierie de Prompt](/fr/guide/prompts) - [Export de Données](/fr/guide/export) ================================================ FILE: docs/fr/guide/input-collapse.md ================================================ # Réduction de l'Entrée Réduisez la zone de saisie lorsqu'elle est vide pour gagner plus d'espace de lecture. Cliquez sur la barre réduite pour l'étendre et commencer à taper.
Réduction entrée
## Comment Utiliser 1. Lorsque la zone de saisie est vide et perd le focus, elle se réduit automatiquement en un bouton compact. 2. Cliquez sur le bouton pour étendre la zone de saisie et commencer à taper. 3. Vous pouvez aussi appuyer sur Ctrl/+I pour agrandir rapidement la zone de saisie. 4. Vous pouvez activer ou désactiver cette fonctionnalité dans le panneau de paramètres (désactivé par défaut). ================================================ FILE: docs/fr/guide/installation.md ================================================ # Installation ::: info Nouvelles 🍎 **L'extension native Safari est disponible !** Elle est entièrement gratuite et s'installe en un clic. ::: Choisissez votre méthode. > ⚠️ Note : Le Gestionnaire de Prompts est la seule fonctionnalité compatible avec Gemini™ pour Entreprise. ## 1. Stores d'Extensions (Recommandé) La façon la plus simple de commencer. Les mises à jour sont automatiques. **Chrome / Brave / Opera / Vivaldi :** [Installer depuis le Chrome Web Store](https://chromewebstore.google.com/detail/kjdpnimcnfinmilocccippmododhceol?utm_source=github&utm_medium=docs&utm_campaign=organic_growth&utm_content=fr) ::: warning ⚠️ Chrome Web Store temporairement indisponible L'extension a été officiellement renommée **Voyager** en raison de problèmes de marque. La mise à jour du nom sur le Chrome Web Store est en attente de validation. Voir [ce post](https://x.com/Nag1ovo/status/2031561180213313944) pour les détails. Utilisez **Edge / Firefox** ou l'**installation manuelle** en attendant. ::: **Microsoft Edge :** [Installer depuis les modules complémentaires Microsoft Edge](https://microsoftedge.microsoft.com/addons/detail/gemini-voyager/gibmkggjijalcjinbdhcpklodjkhhlne) **Firefox :** [Installer depuis Firefox Add-ons](https://addons.mozilla.org/firefox/addon/gemini-voyager/) ## 2. La Méthode Manuelle (Dernières Fonctionnalités) Le processus de validation des stores peut être lent. Si vous voulez la version à la pointe de la technologie immédiatement, installez-la manuellement. **Pour Chrome / Edge / Brave / Opera :** 1. Téléchargez la dernière version de `gemini-voyager-chrome-vX.Y.Z.zip` depuis les [Releases GitHub](https://github.com/Nagi-ovo/gemini-voyager/releases). 2. Décompressez le fichier. 3. Ouvrez la page des Extensions de votre navigateur (`chrome://extensions`). 4. Activez le **Mode développeur** (en haut à droite). 5. Cliquez sur **Charger l'extension non empaquetée** et sélectionnez le dossier que vous venez de décompresser. **Pour Firefox :** 1. Téléchargez la dernière version de `gemini-voyager-firefox-vX.Y.Z.xpi` depuis les [Releases](https://github.com/Nagi-ovo/gemini-voyager/releases). 2. Ouvrez le Gestionnaire de modules complémentaires (`about:addons`). 3. Glissez-déposez le fichier `.xpi` pour l'installer (ou cliquez sur l'icône d'engrenage ⚙️ -> **Installer un module depuis un fichier**). > 💡 Le fichier XPI est officiellement signé par Mozilla et peut être installé de manière permanente sur toutes les versions de Firefox. ## 3. Safari (macOS) Safari prend désormais en charge la distribution directe ! Téléchargez l'application pré-signée : 1. Téléchargez la dernière version Safari (.dmg). 2. Ouvrez le fichier et suivez les instructions pour l'installer. 3. Double-cliquez pour lancer l'application. 4. Activez l'extension dans **Réglages Safari > Extensions**. > 💡 La version Safari est désormais directement signée pour la distribution — pas besoin de conversion Xcode ! > > ⚠️ **Limitations** : En raison de la nature de Safari, (a) la suppression du filigrane (b) l'exportation d'images (PDF recommandé) ne sont pas prises en charge. --- _Configuration de développement ? Si vous êtes un développeur souhaitant contribuer, consultez notre [Guide de Contribution](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/CONTRIBUTING.md)._ ================================================ FILE: docs/fr/guide/markdown-fix.md ================================================ # Correction du Rendu Markdown L'interface web de Gemini™ insère parfois des éléments HTML (tels que des sources de citation ou des marqueurs de mise en évidence) dans le texte, ce qui peut briser la syntaxe Markdown pour le gras (`**texte**`), empêchant le texte de s'afficher correctement en gras. Voyager dispose d'une fonction de correction automatique intégrée qui identifie et répare intelligemment ces balises de gras corrompues, garantissant ainsi un rendu propre et précis de vos documents. > [!INFO] > Cette fonctionnalité est activée automatiquement et ne nécessite aucune configuration supplémentaire. ================================================ FILE: docs/fr/guide/mermaid.md ================================================ # Rendu de Diagrammes Mermaid Rendez automatiquement le code Mermaid sous forme de diagrammes visuels. ## Aperçu Lorsque Gemini™ produit des blocs de code Mermaid (organigrammes, diagrammes de séquence, diagrammes de Gantt, etc.), Voyager les détecte et les rend automatiquement sous forme de diagrammes interactifs. ### Fonctionnalités Clés - **Auto-détection** : Supporte `graph`, `flowchart`, `sequenceDiagram`, `gantt`, `pie`, `classDiagram`, et tous les types majeurs de diagrammes Mermaid. - **Basculer la vue** : Passez du diagramme rendu au code source en un clic. - **Mode plein écran** : Cliquez sur le diagramme pour entrer en plein écran avec support du zoom et du panoramique. - **Mode sombre** : S'adapte automatiquement au thème de la page. ## Comment Utiliser 1. Demandez à Gemini de générer n'importe quel code de diagramme Mermaid. 2. Le bloc de code est automatiquement remplacé par le diagramme rendu. 3. Cliquez sur le bouton ** Code** pour voir le code source. 4. Cliquez sur le bouton **📊 Diagramme** pour revenir à la vue diagramme. 5. Cliquez sur la zone du diagramme pour passer en plein écran. ## Contrôles Plein Écran - **Molette souris** : Zoom avant/arrière - **Glisser** : Panoramique du diagramme - **+/-** : Boutons de zoom de la barre d'outils - **⊙** : Réinitialiser la vue - **✕ / ESC** : Fermer le plein écran ## Compatibilité et Dépannage ::: warning Note - **Limitation Firefox** : En raison de restrictions environnementales, Firefox utilise la version 9.2.2 et ne prend pas en charge les nouvelles fonctionnalités comme **Timeline** ou **Sankey**. - **Erreurs de syntaxe** : Les échecs de rendu sont souvent dus à des erreurs de syntaxe dans la sortie de Gemini. Nous collectons les "bad cases" pour implémenter des correctifs automatiques dans les futures mises à jour. :::
Rendu diagramme Mermaid
================================================ FILE: docs/fr/guide/nanobanana.md ================================================ # Option NanoBanana ::: warning Compatibilité du navigateur Actuellement, la fonction **NanoBanana** n'est **pas prise en charge sur Safari** en raison des limitations de l'API du navigateur. Nous vous recommandons d'utiliser **Chrome** ou **Firefox** si vous avez besoin d'utiliser cette fonction. Les utilisateurs de Safari peuvent télécharger manuellement leurs images sur des sites d'outils comme [banana.ovo.re](https://banana.ovo.re/) pour le traitement (bien que le succès ne soit pas garanti pour toutes les images en raison des différentes résolutions). ::: **Images IA, gardées pures.** Les images générées par Gemini™ comportent un filigrane visible par défaut. Bien que ce soit pour des raisons de sécurité, il existe des scénarios créatifs où vous avez besoin d'une image parfaitement vierge. ## Reconstruction Sans Perte NanoBanana utilise un algorithme de **Mélange Alpha Inversé**. - **Pas d'Inpainting IA** : La suppression de filigrane traditionnelle utilise souvent l'IA pour "barbouiller" la zone, ce qui détruit les détails des pixels. - **Perfection au Pixel** : Nous utilisons des calculs mathématiques pour retirer précisément la couche de filigrane transparente, restaurant 100% des pixels originaux. - **Zéro Perte de Qualité** : L'image traitée reste identique à l'originale dans toutes les zones sans filigrane. ## Comment Utiliser 1. **Activez-le** : Trouvez "Option NanoBanana" à la fin du panneau de paramètres de Voyager et activez-le. 2. **Auto-traitement** : Chaque image que vous générez sera maintenant traitée automatiquement en arrière-plan. 3. **Télécharger directement** : - Survolez une image traitée et vous verrez un bouton 🍌. - **Le bouton 🍌 remplace complètement** le bouton de téléchargement natif pour garantir que vous obtenez toujours directement l'image 100% sans filigrane.
Démo NanoBanana
## Remerciements Cette fonctionnalité est basée sur le projet [gemini-watermark-remover](https://github.com/journey-ad/gemini-watermark-remover) de [journey-ad (Jad)](https://github.com/journey-ad), qui est un portage JavaScript de [l'implémentation C++ originale](https://github.com/allenk/GeminiWatermarkTool) de [allenk](https://github.com/allenk). Nous sommes reconnaissants pour leurs contributions à la communauté. 🧡 ## Confidentialité & Sécurité Tout le traitement se fait **localement dans votre navigateur**. Vos images ne sont jamais téléchargées sur des serveurs tiers, garantissant votre confidentialité et sécurité créative. ================================================ FILE: docs/fr/guide/prevent-auto-scroll.md ================================================ # Empêcher le défilement auto Lorsque vous lisez vos conversations passées, si vous appuyez sur Entrée pour envoyer un nouveau prompt, Gemini™ a pour habitude de faire défiler automatiquement la page tout en bas afin de suivre la réponse générée. Cela peut perturber votre lecture. La fonctionnalité **Empêcher le défilement auto** intercepte ce comportement indésirable : - Lorsque vous avez fait défiler la page vers le haut, le système empêche le saut incontrôlé vers le bas de la page. - Cette fonctionnalité est **désactivée** par défaut. Vous pouvez l'activer manuellement dans les paramètres de l'extension ("Timeline Options"). ## Comment l'activer 1. Cliquez sur l'icône de l'extension Voyager pour ouvrir la popup. 2. Repérez la section "Timeline Options" (Options de la Timeline). 3. Activez l'option "Prevent auto-scroll to bottom" (Empêcher le défilement auto). ================================================ FILE: docs/fr/guide/prompts.md ================================================ # Vos Actifs Intellectuels : Bibliothèque de Prompts Vous rédigez un prompt parfait. Il résout un problème de code complexe ou écrit un e-mail magnifique. Le jetez-vous ? Non. Vous le sauvegardez. ## Le Coffre-fort de Prompts C'est votre dépôt personnel de génie. ### 1. Capturer Quand vous écrivez quelque chose de génial, cliquez sur l'icône du **Gestionnaire de Prompts** (flottant près de la zone de saisie). Cela fait maintenant partie de votre coffre-fort. ### 2. Catégoriser Ajoutez des étiquettes comme `#code`, `#email`, ou `#recherche`. Gardez vos outils affûtés et triés. ### 3. Déployer La prochaine fois que vous en aurez besoin, ne le retapez pas. Ouvrez le gestionnaire, cherchez par tag ou mot-clé, et cliquez pour insérer. Un clic. Effet de levier infini. ![Gestionnaire de Prompts](/assets/gemini-prompt-manager.png) ## Disponible Partout Le Gestionnaire de Prompts peut désormais être utilisé sur n'importe quel site web de votre choix, pas seulement Gemini™ et AI Studio. ### Comment l'Activer 1. Cliquez sur l'icône Voyager dans la barre d'outils de votre navigateur. 2. Faites défiler jusqu'à la section **Gestionnaire de Prompts**. 3. Entrez l'URL du site web (ex : `chatgpt.com` ou `claude.ai`). 4. Cliquez sur **Ajouter un site web** et accordez la permission. 5. **Rechargez la page cible** pour voir le bouton flottant. ### Sites IA Populaires - `chatgpt.com` - ChatGPT - `claude.ai` - Claude - `copilot.microsoft.com` - Microsoft Copilot - `poe.com` - Poe ::: tip Sur les sites web personnalisés, **seule** la fonctionnalité Gestionnaire de Prompts est activée. Les autres fonctionnalités comme la Chronologie et les Dossiers sont conçues spécifiquement pour Gemini et ne seront pas chargées. ::: ================================================ FILE: docs/fr/guide/quote-reply.md ================================================ # Réponse avec Citation Voyager offre une fonctionnalité pratique de "Réponse avec Citation", rendant les réponses à un contenu spécifique plus précises et efficaces. ## Introduction Dans les conversations quotidiennes, nous avons souvent besoin de rebondir sur une partie spécifique de la sortie de l'IA ou de la réfuter. La méthode traditionnelle implique de copier ce texte et de taper manuellement le symbole `> ` dans la zone de saisie, ce qui est fastidieux. Voyager simplifie ce processus : 1. **Sélectionner pour Citer** : Utilisez votre souris pour sélectionner n'importe quel texte dans la page de conversation (que ce soit votre question ou la réponse de Gemini). 2. **Bouton Flottant** : Un bouton "Réponse avec Citation" apparaîtra automatiquement près du texte sélectionné. 3. **Insertion en Un Clic** : Cliquez sur le bouton, et le texte sélectionné sera automatiquement inséré dans votre zone de saisie au format de citation Markdown standard (`> contenu`). ![Réponse avec Citation](/assets/quote-reply.png) ## Fonctionnalités - **Conscient du Contexte** : Identifie intelligemment le contenu de la conversation pour éviter les déclenchements accidentels dans des zones non liées (comme la zone de saisie elle-même). - **Format Standard** : Utilise la syntaxe Markdown universelle, que Gemini comprend parfaitement, menant à des réponses plus précises. - **Support Multi-lignes** : Si plusieurs lignes de texte sont sélectionnées, Voyager ajoute automatiquement des symboles de citation à chaque ligne pour garder le format propre. ## Astuces - **Approfondir les détails** : Sélectionnez un concept confus dans la réponse de Gemini, cliquez sur citer, puis tapez "Veuillez expliquer ce concept en détail." - **Corriger les erreurs** : Sélectionnez du code ou des faits incorrects dans la réponse, citez-les, et signalez "Ceci est incorrect, cela devrait être..." ================================================ FILE: docs/fr/guide/recents-hider.md ================================================ # Masquer les éléments récents et les Gems ::: info **Note**: Cette fonctionnalité est supportée dans la version 1.1.9 et ultérieure. ::: Ajoutez une bascule élégante pour masquer la section « Enregistrements récents » sur la page d'accueil de Gemini™ pour une interface plus propre. Prend désormais également en charge le masquage de la liste **Gems** dans la barre latérale !

Masquer les enregistrements récents

Masquer la liste des Gems

## Caractéristiques - **Bouton Contextuel** : Un bouton discret apparaît uniquement lorsque vous passez la souris sur la section des éléments récents. - **État Minimaliste** : Une fois masqué, il est remplacé par une fine "barre de survol" en bas. - **Restauration en un clic** : Passez simplement la souris sur la barre de survol et cliquez pour restaurer instantanément la section. - **Protection de la vie privée** : Empêche les personnes à proximité de voir vos activités récentes, idéal pour les espaces publics. - **Persistance** : Votre préférence est enregistrée et appliquée automatiquement lors de votre prochaine visite. ## Comment l'utiliser 1. Passez la souris sur la section "Récent" de la page d'accueil de Gemini. 2. Cliquez sur l'icône d'œil barré qui apparaît dans le coin supérieur droit pour masquer la section. 3. Pour restaurer, passez la souris sur la fine ligne restante en bas de la zone et cliquez. ================================================ FILE: docs/fr/guide/settings.md ================================================ # Appropriez-le-vous L'expérience par défaut est géniale. Mais vous pourriez la vouloir parfaite. Personnalisez chaque pixel. ## Mode Cinéma Pourquoi voir le futur à travers un petit trou de serrure ? Voyager vous permet d'étendre la largeur du chat. - **Large** : 1400px pour le codage et les tableaux complexes. - **Concentré** : 800px pour la lecture. - **Vous décidez** : Utilisez le curseur pour trouver votre point idéal. ## Contrôle Cliquez sur l'icône de l'extension pour accéder au centre de contrôle. - **Mode de Défilement** : Naturel ou classique. - **Position de la Chronologie** : Mettez-la où cela semble juste. - **Effets Visuels** : Choisissez `Neige`, `Sakura` ou `Pluie` pour une atmosphère saisonnière. ## Ordre personnalisé Trop de sections dans le popup et celles que vous utilisez le plus sont tout en bas ? Survol une carte de paramètres pour voir les boutons ▲/▼ en haut à droite. Cliquez pour déplacer une carte vers le haut ou le bas. Votre disposition est sauvegardée automatiquement. ## Atmosphère Voyager ne se limite pas aux améliorations utilitaires. Vous pouvez aussi changer l'ambiance de la page. - **Neige** : Flocons doux dérivant pour une sensation hivernale calme. - **Sakura** : Pétales de fleurs de cerisier flottants pour une ambiance printanière plus légère. - **Pluie** : Une couche de pluie cinématique avec des traînées obliques et de subtiles éclaboussures. - **Transition douce** : En désactivant ou changeant d'effet, les particules s'estompent naturellement.

Ouvrir les Paramètres

Guide ouverture paramètres

Ajuster la Largeur

Ajustement largeur chat
================================================ FILE: docs/fr/guide/sidebar-auto-hide.md ================================================ # Masquer automatiquement la barre latérale Vous voulez une expérience de chat plus immersive ? Nous proposons une fonctionnalité de **Masquage automatique de la barre latérale**. Lorsqu'elle est activée, la barre latérale se réduit automatiquement lorsque votre souris quitte la zone, et se développe automatiquement lorsque vous y revenez. ### Démo
### Comment activer 1. Ouvrez le panneau de configuration de Voyager. 2. Trouvez l'option **Masquer auto barre latérale** dans les **Paramètres généraux**. 3. activez l'interrupteur. _Remarque : Cette fonctionnalité ne prend actuellement en charge que Google Gemini._ ================================================ FILE: docs/fr/guide/sidebar.md ================================================ # Largeur de la barre latérale Les noms de dossiers sont trop longs ? Ou la barre latérale prend-elle trop de place ? Vous pouvez maintenant ajuster librement la largeur de la barre latérale. ## Comment ajuster 1. Ouvrez le panneau de configuration de Voyager (cliquez sur l'icône de l'extension en haut à droite). Comment ouvrir le panneau de configuration 2. Trouvez l'option **Largeur de la barre latérale**. 3. Faites glisser le curseur pour choisir la largeur qui vous convient. - **Étroit** : Économisez de l'espace et concentrez-vous sur la conversation. - **Large** : Voyez les noms de dossiers complets en un coup d'œil. ## Plateformes supportées Cette fonctionnalité supporte : - **Google Gemini** - **Google AI Studio** Vos paramètres sont enregistrés automatiquement. ================================================ FILE: docs/fr/guide/sponsor.md ================================================ # Sponsor > [!NOTE] > Si Voyager vous est utile, partagez-le sur X, Reddit, YouTube, etc. Chaque partage aide plus de personnes à découvrir le projet et à améliorer l'expérience Gemini. Merci. Maintenir des projets open-source est principalement motivé par la passion (et le café) ☕ **[Voyager](https://github.com/Nagi-ovo/gemini-voyager)** est une extension de navigateur entièrement gratuite et open-source conçue pour améliorer votre expérience Gemini. Si cette extension vous aide à utiliser Gemini plus efficacement, envisagez de soutenir le développement continu et la maintenance de ce projet. --- ## Plateformes en Ligne Afdian ### 🎙️ Outil Recommandé : Typeless Je recommande vivement **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**, un outil IA de voix-à-texte que j'ai utilisé intensivement durant le développement de Voyager. L'intégrer dans mon flux quotidien m'a fait gagner un temps énorme et a considérablement boosté ma productivité. > 🎁 **[Rejoignez via mon lien de parrainage](https://www.typeless.com/?via=gemini-voyager)** (Code : _`gemini-voyager`_) pour obtenir **$5 de crédits gratuits**. Cela me donne aussi des crédits pour continuer à maintenir ce projet—une façon gratuite de soutenir mon travail ! ❤️ --- ## Buy Me a Coffee (QR) 🍵
WeChat Pay WeChat Pay
Alipay Alipay
--- Merci pour votre soutien ! Chaque contribution est un grand encouragement pour moi ❤️ ================================================ FILE: docs/fr/guide/tab-title.md ================================================ # Synchro du Titre d'Onglet Synchronise automatiquement le titre de l'onglet du navigateur avec le titre du chat Gemini™ actuel. ## Fonctionnalités - **Synchro en temps réel** : Quand le titre du chat change (ex : l'IA génère un nouveau titre ou vous le renommez manuellement), le titre de l'onglet du navigateur se met à jour instantanément de "Gemini" au sujet spécifique de la conversation. - **Support Universel** : Fonctionne parfaitement avec les pages de chat standard, les conversations Gem, et les environnements multi-comptes. - **Contrôle d'Activation** : Si vous préférez le comportement par défaut, vous pouvez facilement désactiver cette fonctionnalité dans la section "Options Générales" du panneau de paramètres.
Synchro Titre Onglet
## Comment Utiliser 1. Cette fonctionnalité est activée par défaut lors de l'installation. 2. Ouvrez n'importe quelle conversation Gemini et observez le titre de l'onglet du navigateur ; il se mettra automatiquement à jour pour correspondre au titre du chat. 3. Pour désactiver : - Cliquez sur l'icône de l'extension pour ouvrir le panneau de paramètres. - Trouvez "Options Générales". - Désactivez "Mettre à jour le titre de l'onglet". ================================================ FILE: docs/fr/guide/timeline.md ================================================ # Voyage dans le Temps Les longues conversations sont désordonnées. Vous faites défiler vers le haut, vers le bas, vous perdez le fil. Voyager transforme votre conversation en une chronologie. ## Visualisez la Forme de Votre Chat Regardez sur le côté droit de votre écran. Chaque nœud représente un message. La chronologie visualise le rythme de votre dialogue. ## La Navigation, Résolue. - **Téléportation** : Cliquez sur un nœud pour sauter instantanément à ce message. - **Coup d'œil** : Survolez pour voir le contenu sans bouger. - **Signet** : Appui long sur un nœud pour le marquer d'une **Étoile**. C'est comme un marque-page pour votre cerveau. - **Niveaux (Expérimental)** : Clic droit sur un nœud pour définir différents niveaux (1-3) ou réduire les enfants. Parfait pour clarifier les conversations ramifiées. - **Clavier** : Naviguez à la vitesse de la pensée. Par défaut `j`/`k`, personnalisable à volonté. ![Navigation Temporelle](/assets/teaser.png) ## Encore Plus Vite au Clavier Vous ne voulez pas utiliser la souris ? Utilisez votre clavier. **C'est comme activer le mode Vim dans Gemini.** ### Raccourcis par Défaut - `k` - Sauter au nœud précédent - `j` - Sauter au nœud suivant ### Personnalisez-le Ouvrez les paramètres de l'extension, cliquez sur une case de raccourci, appuyez sur n'importe quelle touche. N'importe quelle touche, n'importe quelle combinaison. `n`/`p` ? `,`/`.` ? À vous de décider. **Mode Flux** : Les appuis rapides s'enchaînent de manière fluide. **Mode Saut** : Réponse instantanée, vitesse maximale. ================================================ FILE: docs/fr/index.md ================================================ --- layout: home hero: name: 'Voyager' text: "L'OS manquant pour Gemini." tagline: "Nous aimons Gemini. Nous voulions juste qu'il soit parfait." image: src: /logo.png alt: Logo Voyager actions: - theme: brand text: Télécharger link: ./guide/installation - theme: alt text: Commencer link: ./guide/getting-started teaser: title: 'Ça marche, tout simplement.' description: 'Nous ne voulions pas créer une autre extension. Nous voulions créer une meilleure façon de penser.
Quand vous utilisez Voyager, vous arrêtez de vous battre avec l’interface pour couler avec elle.' image: '/assets/teaser.png' features: - title: 'Chronologie' details: 'Ne scrollez plus. Volez. Sautez à n’importe quel point de votre conversation instantanément.' - title: 'Dossiers' details: 'Enfin un système de fichiers pour votre IA. Natif, intuitif, puissant.' - title: 'Liberté' details: 'Vos données sont à vous. Exportez en JSON, Markdown ou PDF en un clic.' features: - icon: 🧭 title: Chronologie details: Une carte pour votre esprit. Naviguez visuellement dans vos conversations. - icon: 🗂️ title: Dossiers details: De l'ordre dans le chaos. Glissez, déposez, c'est fait. - icon: ✨ title: Coffre-fort details: Votre génie, capturé. Enregistrez et réutilisez vos meilleurs prompts. - icon: 💬 title: Réponse avec Citation details: Sélectionnez pour citer. Réponses contextualisées pour une communication efficace. - icon: ↔️ title: Largeur du chat details: Voyez large. Ajustez librement la largeur du chat pour une meilleure expérience de visualisation. - icon: 💾 title: Export de Chat details: Souveraineté des données. Archivez en plusieurs formats pour ne rien perdre. - icon: 🌦️ title: Effets Visuels details: Créez l'ambiance. Basculez entre neige, pluie et pétales de sakura depuis la fenêtre popup. - icon: 🍌 title: Suppression Filigrane details: Suppression sans perte du filigrane. Gardez les moments IA purs. - icon: 📐 title: Copie de Formules details: Copie en un clic des codes sources LaTeX et MathML (Word). - icon: 🧜‍♀️ title: Diagrammes Mermaid details: Du code aux visuels. Organigrammes, diagrammes de séquence, diagrammes de Gantt rendus instantanément. - icon: 🏷️ title: Synchro Titre Onglet details: Sachez en un coup d'œil. Synchro auto du titre de l'onglet avec votre chat. - icon: 🔀 title: Bifurcation de Conversation (Expérimental) details: Pensée divergente. Séparez la conversation à n'importe quel point pour explorer d'autres possibilités. - icon: 🗑️ title: Suppression par Lot details: Nettoyage en masse. Sélectionnez plusieurs conversations et supprimez-les en une fois. - icon: ☁️ title: Synchronisation Cloud details: Toujours synchronisé. Sauvegardez dossiers et prompts sur Google Drive entre appareils. - icon: ⚡️ title: Modèle par défaut details: Arrêtez de vous répéter. Basculez automatiquement vers votre modèle préféré pour les nouveaux chats. - icon: 🔬 title: Deep Research details: Ouvrez la boîte noire. Extrayez les processus de recherche et liens des sessions Deep Research. ---
⚠️ Avis de changement de nom : En raison de problèmes de marque et de droits d'auteur, cette extension a été officiellement renommée Voyager. Cependant, en raison de la lenteur extrême du processus de révision du Chrome Web Store, le changement de nom n'a pas été approuvé dans les 7 jours — elle est temporairement indisponible sur le Chrome Web Store.

Chaque installation est un vote de confiance

Données en direct du Chrome Web Store et GitHub. Merci de voyager avec nous.

GitHub Stars GitHub Forks Dernière Release GitHub Downloads Chrome Web Store Users Chrome Web Store Rating Edge Add-ons Firefox Add-ons Users Firefox Add-ons Rating
Nagi-ovo%2Fgemini-voyager | Trendshift

Remerciements Spéciaux

✨ Nous sommes sur Product Hunt ! Nous serions ravis d'avoir vos avis et retours. ❤️

Voyager sur Product Hunt

“Ce n'est pas juste un outil. C'est une bicyclette pour l'esprit.”

Voir ce qui est possible →

================================================ FILE: docs/fr/privacy.md ================================================ # Politique de Confidentialité Dernière mise à jour : 16 mars 2026 ## Introduction Voyager ("nous", "notre", ou "nos") s'engage à protéger votre vie privée. Cette Politique de Confidentialité explique comment notre extension de navigateur collecte, utilise et protège vos informations. ## Collecte et Utilisation des Données **Nous ne collectons aucune information personnelle.** Voyager fonctionne entièrement dans votre navigateur. Toutes les données générées ou gérées par l'extension (comme les dossiers, les modèles de prompts, les messages favoris et les paramètres) sont stockées : 1. Localement sur votre appareil (`chrome.storage.local`) 2. Dans le stockage synchronisé de votre navigateur (`chrome.storage.sync`) s'il est disponible, pour synchroniser les paramètres entre vos appareils. Nous n'avons accès à aucune de vos données personnelles, historiques de chat ou autres informations privées. Nous ne suivons pas votre historique de navigation. ## Synchronisation Google Drive (Optionnelle) Si vous activez explicitement la fonction de synchronisation Google Drive, l'extension utilise l'API Chrome Identity pour obtenir un jeton OAuth2 (avec le scope `drive.file` uniquement) afin de sauvegarder vos dossiers et prompts sur **votre propre Google Drive**. Ce transfert s'effectue directement entre votre navigateur et les serveurs de Google. Nous n'avons pas accès à ces données et elles ne sont jamais envoyées à un serveur que nous exploitons. ## Permissions L'extension demande le minimum de permissions nécessaires pour fonctionner : - **Storage (Stockage)** : Pour enregistrer vos préférences, dossiers, prompts, messages favoris et options de personnalisation de l'interface localement et entre vos appareils. - **Identity (Identité)** : Pour l'authentification Google de la fonction optionnelle de synchronisation Google Drive. Utilisé uniquement lorsque vous activez explicitement la synchronisation cloud. - **Scripting (Scripts)** : Pour injecter dynamiquement des scripts de contenu sur les pages Gemini et sur les sites web personnalisés spécifiés par l'utilisateur pour la fonction Gestionnaire de Prompts. Seuls les scripts intégrés à l'extension sont injectés — aucun code distant n'est récupéré ou exécuté. - **Host Permissions (Permissions d'hôte)** (gemini.google.com, aistudio.google.com, etc.) : Pour injecter des scripts de contenu qui améliorent l'interface Gemini avec des fonctionnalités comme les dossiers, l'exportation, la timeline et la citation de réponse. Les domaines Google supplémentaires (googleapis.com, accounts.google.com) sont nécessaires pour l'authentification de la synchronisation Google Drive. - **Optional Host Permissions (Permissions d'hôte optionnelles)** (toutes les URL) : Demandées uniquement au moment de l'exécution lorsque vous ajoutez explicitement des sites web personnalisés pour le Gestionnaire de Prompts. Jamais activées sans votre action. ## Services Tiers Voyager ne partage aucune donnée avec des services tiers, des annonceurs ou des fournisseurs d'analyse. ## Modifications de cette Politique Nous pouvons mettre à jour notre Politique de Confidentialité de temps à autre. Nous vous informerons de tout changement en publiant la nouvelle Politique de Confidentialité sur cette page. ## Nous Contacter Si vous avez des questions concernant cette Politique de Confidentialité, veuillez nous contacter via notre [Dépôt GitHub](https://github.com/Nagi-ovo/gemini-voyager). ================================================ FILE: docs/guide/batch-delete.md ================================================ # 批量删除 一次性删除多个对话,告别逐个删除的繁琐操作。 ## 功能介绍 - **多选模式**:长按任意对话进入多选模式,可勾选多个要删除的对话。 - **一键清理**:选中后点击删除按钮,批量删除所有选中的对话。 - **进度反馈**:删除过程中显示实时进度,让你了解当前状态。 - **安全确认**:删除前会弹出确认对话框,防止误操作。
批量删除
## 如何使用 1. 在侧边栏的对话列表中,**长按**任意一个对话项。 2. 进入多选模式后,对话项左侧会出现复选框。 3. 勾选你想要删除的对话(一次最多可选 50 个)。 4. 点击出现的 **删除按钮**。 5. 在**文件夹列表上方**出现的红色确认区域中点击“确定”,即可开始批量删除。 ::: tip 提示 删除确认面板会直接覆盖在文件夹区域上方,以免遮挡对话列表。批量删除操作无法撤销,请谨慎操作。 ::: ================================================ FILE: docs/guide/cloud-sync.md ================================================ # 云同步 将您的文件夹、灵感库(Prompts)等数据同步到 Google Drive,在不同设备间保持一致。 ## 功能特点 - **多端同步**:利用 Google Drive 云端存储,在多台电脑上同步您的配置。 - **全面覆盖**:支持同步 **文件夹结构**、**提示词库 (Prompts)** 等核心数据。 - **数据安全**:数据存储在您自己的 Google Drive 空间中,不经过第三方服务器,确保隐私安全。 - **灵活同步**:支持手动上传、下载合并数据。 ## 如何使用 1. 在 Gemini™ 页面点击右下角的扩展图标,打开设置面板。 2. 找到 **云同步** 区域。 3. 点击 **使用 Google 登录** 并完成授权。 4. 授权成功后,点击 **上传到云端** 将本地数据同步到云端,或点击 **从云端下载合并** 将云端数据同步到本地。 ### 💡 极速同步 最简单的方法是在左侧侧边栏的**文件夹区域顶部**,直接点击“上传到云端”或“下载并合并”按钮。 云同步快捷按钮 ::: warning **安全建议:双重保护** 虽然云同步提供了极大的便利,但为了您的数据万无一失,我们强烈建议您定期通过**本地文件方式**手动备份核心数据。 1. **导出全量配置**:在设置面板底部的“备份与恢复”中导出包含所有设置、文件夹和提示词的完整备份。 导出全量配置 2. **导出所有文件夹**:在设置面板的“文件夹”区域点击“导出”,仅备份所有文件夹结构及对话,不包含提示词。 导出所有文件夹 ::: ================================================ FILE: docs/guide/community.md ================================================ # 交流与反馈 我们非常重视每一位用户的声音。无论你是遇到了 Bug、有功能建议,还是想分享你构建的指令宝库,都可以通过以下方式与我们联系。 ## 📢 关注动态 关注我们的 X (Twitter) 账号,获取最新开发进展。 - **新版本发布**:第一时间了解更新内容。 - **功能预告**:提前知晓即将到来的功能。 ## 💬 Discord 社区 加入我们的 Discord 服务器,与其他 Voyager 交流心得! - **即时聊天**:与其他用户和开发者直接对话。 - **提示词分享**:看看大家都在用什么样的 Prompts。 - **开发进展**:第一时间获取新功能的开发动态。 ## 🐙 GitHub Issues 如果你发现了程序错误(Bug)或有明确的功能需求(Feature Request),建议在 GitHub 上提交 Issue: - [提交 Bug 报告](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=bug_report.yml) - [提交功能建议](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=feature_request.yml) 感谢你对 Voyager 的支持!❤️ ================================================ FILE: docs/guide/context-sync.md ================================================ # 记忆搬运:上下文同步(实验性) **不同次元,丝滑共享** 在网页端推演逻辑,在 IDE 里落地代码。 Voyager 打通次元壁,让你的 IDE 瞬间拥有网页端的“思维过程”。 ## 告别反复横跳 开发者最烦的事:在网页上聊透了方案,回到 VS Code/Trae/Cursor 却要像面对陌生人一样重新解释需求。 由于额度和响应速度,网页端是“大脑”,IDE 是“手”。 Voyager 让它们共用一个灵魂。 ## 极简三步,同频呼吸 1. **安装并唤醒桥接器**: 安装 **CoBridge** 插件。它是连接网页与本地 IDE 的核心桥梁。 - **[前往插件市场安装](https://open-vsx.org/extension/windfall/co-bridge)** ![CoBridge扩展](/assets/CoBridge-extension.png) 安装完成后,**打开任意工作目录**,点击右侧图标并启动服务器。 ![CoBridge服务器开启](/assets/CoBridge-on.png) 2. **握手对接**: - 在 Voyager 设置中开启“上下文同步”。 - 对齐端口号。看到 “IDE Online”,说明它们已经连上了。 ![上下文同步面板](/assets/context-sync-console.png) 3. **一键同步**:点一下 **"Sync to IDE"**。无论是复杂的**数据表格**,还是直观的**参考图片**,都能瞬间瞬移到你的 IDE 中。 ![同步完成](/assets/sync-done.png) ## 落地生根 同步完成后,你的 IDE 工作目录会多出一个 `.cobridge/AI_CONTEXT.md`。 无论是 Trae、Cursor 还是 Copilot,它们会通过各自的 Rule 文件自动读取这份“记忆”。 ``` your-project/ ├── .cobridge/ │ ├── images/ │ │ ├── context_img_1_1.png │ │ └── context_img_1_2.png │ └── AI_CONTEXT.md ├── .github/ │ └── copilot-instructions.md ├── .gitignore ├── .traerules └── .cursorrules ``` ## 它的原则 - **零污染**:CoBridge 自动操作 `.gitignore`,不会把你这些私密对话推到 Git 仓库里。 - **懂行**:全 Markdown 格式,IDE 里的 AI 读起来就像读说明书一样顺畅。 - **小贴士**:如果对话太久远,先用【时间线】向上划一下,让网页把记忆“想起来”,再同步效果更佳。 --- ## 立刻起航 **思维已在云端就绪,现在,让它在本地落地生根。** - **[安装 CoBridge 插件](https://open-vsx.org/extension/windfall/co-bridge)**:找到你的次元传送门,一键开启“同频呼吸”。 - **[访问 GitHub 仓库](https://github.com/Winddfall/CoBridge)**:深入了解 CoBridge 的底层逻辑,或者为这个“同步灵魂”的项目点个 Star。 > **大模型从此不再失忆,上手即战。** ================================================ FILE: docs/guide/deep-research.md ================================================ # Deep Research 导出 导出 Deep Research 生成的最终报告,或将其完整的“思考”过程保存为 Markdown 文件。 ## 1. 报告导出 (PDF / 图片) Deep Research 生成的报告支持导出为格式精美的 PDF 或方便分享的单张图片(同时也支持导出为 Markdown 和 JSON 格式)。 ![报告导出](/assets/deep-research-report-export.png) ## 2. 思考过程导出 (Markdown) 除了最终报告,您还可以将对话中的完整“思考”内容一键导出。 ### 功能特性 - **一键导出**: 点击分享和导出按钮即可下载 - **结构化格式**: 按原始顺序保留思考阶段、思考条目和研究网站 - **双语标题**: Markdown 文件包含英文和当前语言的双语章节标题 - **自动命名**: 文件使用时间戳命名,便于整理 (例如:`deep-research-thinking-20240128-153045.md`) ### 使用方法 1. 在 Gemini™ 上打开一个 Deep Research 对话 2. 点击对话的**分享和导出**按钮 3. 选择 "下载 Thinking 内容" (Download thinking content) 4. Markdown 文件将自动下载 ![Deep Research 思考内容导出](/assets/deepresearch_download_thinking.png) ### 导出文件格式 导出的 Markdown 文件包含: - **标题**: 对话标题 - **元数据**: 导出时间和思考阶段总数 - **思考阶段**: 每个阶段包含: - 思考条目 (包含标题和内容) - 研究网站 (包含链接和标题) #### 示例结构 ```markdown # Deep Research 对话标题 **导出时间 / Exported At:** 2025-12-28 17:25:35 **总思考阶段 / Total Phases:** 3 --- ## 思考阶段 1 / Thinking Phase 1 ### 思考标题 1 思考内容... ### 思考标题 2 思考内容... #### 研究网站 / Researched Websites - [domain.com](https://example.com) - 页面标题 - [another.com](https://another.com) - 另一个标题 --- ## 思考阶段 2 / Thinking Phase 2 ... ``` ## 隐私保护 所有提取和格式化操作都 100% 在浏览器本地完成。不会向外部服务器发送任何数据。 ================================================ FILE: docs/guide/default-model.md ================================================ # 默认模型 ::: info **注意**:该功能仅在 1.1.9 及后续版本中支持。 ::: 为 Gemini™ 添加设置默认模型的功能,避免每次开启新对话时都需要手动切换。
## 功能特点 - **交互式设置**:在 Gemini 的模型选择菜单中直接注入“星标”按钮。 - **自动切换**:开启新对话时,插件会自动为您切换到预设的默认模型。 - **持久化保存**:您的偏好会被保存,跨设备同步(如果开启了插件同步)。 - **优化体验**:针对单页应用(SPA)优化,无论是点击“新对话”按钮、快捷键还是直接访问 `/app` 路径,均能准确触发。 ## 如何使用 1. 点击 Gemini 输入框上方的**模型选择器**。 2. 鼠标悬停在您想要设为默认的模型上,点击出现的**空心星标**。 3. 星标变为**实心**后,该模型即被设为默认。 4. 下次访问首页或发起新对话时,系统会自动为您选中该模型。 5. 如需取消,再次点击实心星标即可。 ================================================ FILE: docs/guide/export.md ================================================ # 彻底自由 数据被锁死,是最坏的体验。 我们信条很简单:你创造的,就是你的。 ## 带走一切 Voyager 帮你把数据从云端拽回手心。 ### 格式随你选 - **Markdown**:给 Obsidian 或 Notion 用。干净清爽。(Safari 用户注意:由于浏览器限制无法提取图片,建议使用 PDF 导出) - **PDF**:发给别人或打印。排版精美,图文并茂。 - **JSON**:给开发者。原始数据,怎么玩随你。 ### 怎么导 1. 鼠标悬停在 Gemini Logo 上,即可看到出现的 **导出图标**。 2. 选格式。 3. 拿走。 你的数据,听你的。

1. 悬停 Logo

导出指南步骤 1

2. 选格式

导出指南步骤 2
### Safari PDF 导出特别说明 在 Safari 上导出 PDF 步骤略有不同(需手动打印): 1. 点击 **导出** 按钮,选择 PDF 格式。 2. **等待一秒左右**(让页面准备好打印样式)。 3. 按 `Command + P` 调出打印界面。 4. 在打印界面中选择 **"Save to PDF"**(或 "存储为 PDF")。 Safari Export PDF ================================================ FILE: docs/guide/folders.md ================================================ # 文件夹,本该如此 整理 AI 聊天记录,以前怎么那么难? 我们修好了。给你的思绪,装个文件系统。

Gemini™

Gemini 文件夹

AI Studio

AI Studio 文件夹
## 整理的直觉 手感对了,一切都对了。 - **拖拽**:抓起来,扔进去。真实物理反馈。 - **套娃**:大项目套小项目。无限层级,随你定义。 - **间距**:自由调节侧边栏密度,从紧凑到宽松。 > _注:Mac Safari 上的调整可能不是实时的,刷新页面即可生效。_ - **同步**:电脑上理好,笔记本上就能用。 ## 绝招 - **多选**:长按对话项进入多选模式,批量操作,一次搞定。 - **改名**:双击文件夹,直接改。 - **识图**:代码、写作、闲聊... 我们自动识别 Gem 类型,配上图标。你只管用,剩下的交给我们。 ## 平台特性差异 ### 通用功能 - **基础管理**:拖拽排序、重命名、多选操作。 - **智能识别**:自动识别对话类型并匹配图标。 - **多级目录**:支持文件夹嵌套,结构更深邃。 - **AI Studio 适配**:上述高级功能即将支持 AI Studio。 - **Google Drive 同步**:支持将文件夹结构同步到 Google Drive。 ### Gemini 专属增强 #### 自定义颜色 点击文件夹图标自定义颜色。内置 7 种默认配色,亦支持通过调色盘选取你的专属色彩。 文件夹配色 #### 账号隔离 自动隔离不同 Google 账号的对话列表,防止数据混淆。 账号隔离模式 #### AI 自动整理 对话太多,懒得手动分?让 Gemini 替你想。 一键复制当前对话结构,粘贴给 Gemini,它会帮你生成一份整理好的文件夹方案——直接导入,即刻生效。 **第一步:复制对话结构** 在扩展弹窗的文件夹区域底部,点击 **AI Organize** 按钮。它会自动收集你所有未归类的对话和现有文件夹结构,生成一段提示词并复制到剪贴板。 AI Organize 按钮 **第二步:让 Gemini 整理** 将剪贴板内容粘贴到 Gemini 对话中,它会分析你的对话标题并输出一段 JSON 格式的文件夹方案。 **第三步:导入分类结果** 点击文件夹面板菜单中的 **Import folders**,选择 **Or paste JSON directly**,将 Gemini 返回的 JSON 粘贴进去,点击 **Import**。
导入菜单
粘贴 JSON 导入
- **增量合并**:默认使用"Merge"策略,只添加新文件夹和新分配,不会破坏你已有的分类。 - **多语言**:提示词会自动使用你设置的语言,文件夹名也会用对应语言生成。 ### AI Studio 专属增强 - **侧边栏调节**:鼠标拖拽边缘,自由调整侧边栏宽度。 - **库拖拽支持**:支持直接从 Library 列表中拖拽项目到文件夹。 ================================================ FILE: docs/guide/fork.md ================================================ # 对话分支 (实验性) 思维不应是一条单行道。在复杂的探索中,我们常常需要回到某个关键节点,尝试不同的可能性。 Voyager 带来的 **对话分支** 功能,让你能够轻松发散思维,探索对话的平行宇宙。 ## 功能介绍 > **⚠️ 提示**:该功能目前处于实验阶段。你需要先点击浏览器扩展图标打开设置弹窗,并开启 **启用对话分支** 开关。 在任何你想要发散思绪的时刻,只需将鼠标悬停在你的提问上,点击 **对话分支** 按钮: ![对话分支](/assets/branching.png) Voyager 会立刻截取从对话开头到该节点的所有上下文,并为你 **开启一段全新的对话**。 你可以在这个新分支中尽情修改提问,尝试不同的方向,而不必担心破坏原有的对话历史。尽情释放你的创造力与好奇心吧! ================================================ FILE: docs/guide/formula-copy.md ================================================ # 公式复制 Voyager 让数学公式和科学符号的复用变得异常简单。支持一键复制 LaTeX 源码以及兼容 Microsoft Word 的 MathML 格式。 ## 功能介绍 当你要求 Gemini 推导公式或编写数学表达式时,Gemini 通常会使用 LaTeX 渲染。虽然看起来很美观,但如果你想将这些公式复制到自己的论文、文档或编辑器中,往往需要手动提取源码。 Voyager 为此提供了无缝支持: 1. **自动识别**:Voyager 会自动识别页面中渲染出的 LaTeX 公式。 2. **复制按钮**:当你将鼠标悬停在公式上时,公式右侧会出现复制图标。 3. **格式选择**:点击复制图标,你可以选择: - **Copy LaTeX**: 复制标准的 LaTeX 源码,适用于 Overleaf、Markdown 编辑器等。 - **Copy MathML**: 复制 MathML 源码,这是最适合直接粘贴到 **Microsoft Word** 中的格式。 ![公式复制](/assets/gemini-math-copy.png) ## 特性 - **Word 完美兼容**:通过 MathML 支持,你可以将复杂的 AI 输出公式直接粘贴进 Word 文档,保持完美的可编辑公式格式。 - **上下文保留**:不仅复制公式本身,还保留了公式的数学语境。 - **极速响应**:完全在本地处理,点击即得。 ## 使用技巧 - **论文写作**:在 Word 中编写论文时,让 Gemini 推导公式,然后使用 MathML 复制并粘贴,省去手动在 Word 公式编辑器中输入的烦恼。 - **代码笔记**:在 Obsidian 或 Notion 中记笔记时,直接复制 LaTeX 源码即可。 ================================================ FILE: docs/guide/getting-started.md ================================================ # 欢迎登船 恭喜。你的工作流刚刚升舱了。 Voyager 不只是工具,它是种习惯。给我 5 分钟,带你上手。 ## 1. 就位 还没装?去 [安装指南](/guide/installation)。 装好了?刷新 Gemini 页面。变化立竿见影。 ## 2. 穿梭 聊个长的。比如聊聊汉字演变史,或者量子力学。 看右边。 **那串点,就是你的导航图。** - **指**:瞥一眼那会儿说了啥。 - **点**:瞬间穿越回去。 - **按**:长按加星,标记高光时刻。 别再滚轮滚到手酸。思维多快,你就多快。 ## 3. 归档 看左边的聊天列表。 **文件夹来了。** 拎起一个聊天,拖进去,松手。 丝般顺滑。嵌套、重命名,随你心意。把脑子里的杂乱清空,只留清爽。 ## 4. 珍藏 写了个绝妙的提示词?别让它滑走。 点输入框里的 **✨ 图标**。 存下来,打个标签。 下次要用? 点一下图标,搜一搜,插入。 这不是聊天,这是在沉淀你的数字资产。 --- **起飞。** 去深挖每个功能: - [玩转时间轴](/guide/timeline) - [精通文件夹](/guide/folders) - [管理提示词](/guide/prompts) - [掌握数据](/guide/export) ================================================ FILE: docs/guide/input-collapse.md ================================================ # 输入框折叠 输入框为空时自动折叠,获得更多阅读空间。点击折叠后的按钮即可展开输入。
输入框折叠
## 如何使用 1. 当输入框为空且失去焦点时,会自动折叠为一个简洁的胶囊按钮 2. 点击胶囊按钮即可展开输入框,开始输入 3. 也可以按 Ctrl/+I 快速展开输入框 4. 在设置面板中可以开启或关闭此功能(默认关闭) ================================================ FILE: docs/guide/installation.md ================================================ # 安装 ::: info 新闻 🍎 **Safari 浏览器原生插件已推出!** 现在支持一键安装并完全免费。 ::: 选一条路。 > ⚠️ 提示词管理器是唯一支持 Gemini™ 企业版的功能。 ## 1. 官方商店(推荐) 最简单的方式,支持自动更新。 **Chrome / Brave / Opera / Vivaldi:** [从 Chrome 网上应用店安装](https://chromewebstore.google.com/detail/kjdpnimcnfinmilocccippmododhceol?utm_source=github&utm_medium=docs&utm_campaign=organic_growth&utm_content=zh) ::: warning ⚠️ Chrome Web Store 暂时不可用 由于商标版权问题插件正式改名为 **Voyager**,Chrome Web Store 审核仍在进行中,暂时无法使用。详情见[此帖](https://x.com/Nag1ovo/status/2031561180213313944)。请使用下方 **Edge / Firefox** 或**手动安装**。 ::: **Microsoft Edge:** [从 Microsoft Edge Add-ons 安装](https://microsoftedge.microsoft.com/addons/detail/gemini-voyager/gibmkggjijalcjinbdhcpklodjkhhlne) **Firefox:** [从 Firefox Add-ons 安装](https://addons.mozilla.org/firefox/addon/gemini-voyager/) ## 2. 手动(抢鲜版) 应用店审核慢。如果你追求最新功能,走这条路。 **Chrome / Edge / Brave / Opera:** 1. 去 [GitHub Releases](https://github.com/Nagi-ovo/gemini-voyager/releases) 下最新的 `gemini-voyager-chrome-vX.Y.Z.zip`。 2. 解压。 3. 打开扩展页 (`chrome://extensions`)。 4. 开 **开发者模式** (右上角)。 5. 点 **加载已解压的扩展程序**,选刚才的文件夹。 **Firefox:** 1. 去 [Releases](https://github.com/Nagi-ovo/gemini-voyager/releases) 下最新的 `gemini-voyager-firefox-vX.Y.Z.xpi`。 2. 打开扩展管理页 (`about:addons`)。 3. 把下载的 `.xpi` 文件拖进去安装(或者点右上角齿轮 ⚙️ -> **从文件安装附加组件**)。 > 💡 XPI 文件已获 Mozilla 官方签名,可在所有 Firefox 版本中永久安装。 ## 3. Safari (macOS) Safari 现在支持直接分发!下载预签名的应用: 1. 下载 最新 Safari 版本 (.dmg)。 2. 双击打开后按提示安装应用。 3. 双击启动应用。 4. 在 **Safari 设置 > 扩展** 中启用。 > 💡 Safari 版本现已直接签名分发——不再需要 Xcode 转换! > > ⚠️ **已知限制**:由于 Safari 特性,(a) 水印去除 (b) 图片导出(推荐用 PDF)暂不支持。 --- _想贡献代码?开发者请移步 [贡献指南](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/CONTRIBUTING.md)。_ ================================================ FILE: docs/guide/markdown-fix.md ================================================ # Markdown 渲染修复 Gemini™ 的网页界面有时会在文本中插入 HTML 元素(例如引用来源或高亮标记),这可能会破坏 Markdown 的加粗语法(`**text**`),导致文本无法正确加粗显示。 Voyager 内置了自动修复功能,能够智能识别并修复这些断裂的加粗标签,确保文档渲染的整洁与准确。 > [!INFO] > 此功能为自动启用,无需额外配置。 ================================================ FILE: docs/guide/mermaid.md ================================================ # Mermaid 图表渲染 自动将 Mermaid 代码渲染为可视化图表。 ## 功能介绍 当 Gemini™ 输出 Mermaid 代码块时(如流程图、时序图、甘特图等),Voyager 会自动检测并渲染为交互式图表。 ### 主要特性 - **自动检测**:支持 `graph`、`flowchart`、`sequenceDiagram`、`gantt`、`pie`、`classDiagram` 等所有主流 Mermaid 图表类型 - **一键切换**:通过按钮在渲染图表和源代码之间自由切换 - **全屏查看**:点击图表进入全屏模式,支持滚轮缩放和拖拽平移 - **深色模式**:自动适配页面主题 ## 使用方法 1. 让 Gemini 生成任意 Mermaid 图表代码 2. 代码块会自动替换为渲染后的图表 3. 点击 ** Code** 按钮查看原始代码 4. 点击 **📊 Diagram** 按钮切回图表视图 5. 点击图表区域进入全屏查看 ## 全屏模式操作 - **滚轮**:缩放图表 - **拖拽**:移动图表位置 - **+/-**:工具栏缩放按钮 - **⊙**:重置视图 - **✕ / ESC**:关闭全屏 ## 兼容性与故障排除 ::: warning 说明 - **Firefox 限制**:由于环境限制,Firefox 使用 9.2.2 版本,暂不支持 **Timeline**、**Sankey** 等新特性。 - **语法错误**:渲染失败通常是因为 Gemini 生成的代码有语法错误。我们正在收集 Bad Case,后续将通过补丁自动修复常见的生成错误。 :::
Mermaid 图表渲染
================================================ FILE: docs/guide/nanobanana.md ================================================ # NanoBanana 选项 ::: warning 浏览器兼容性 目前 **NanoBanana** 去水印功能由于浏览器 API 限制,**暂不支持 Safari 浏览器**。如果您需要使用此功能,建议使用 **Chrome** 或 **Firefox**。 Safari 用户可以将下载的图片上传到 [banana.ovo.re](https://banana.ovo.re/) 等工具网站进行手动去除(但由于 Gemini™ 图片尺寸的多样性,不能保证每张图片都能成功还原)。 ::: **AI 图片,本该纯净。** Gemini 生成的图片默认带有可见的水印。虽然这是出于安全考虑,但在某些创作场景下,你可能需要一张完全干净的底稿。 ## 无损还原 NanoBanana 采用的是 **反向 Alpha 混合算法 (Reverse Alpha Blending)**。 - **非 AI 重绘**:传统的去水印往往使用 AI 涂抹,会破坏图片细节。 - **像素级精度**:我们通过数学计算,将叠加在像素上的水印透明层精确移除,还原出 100% 原始的像素点。 - **零质量损失**:处理前后的图片在非水印区域完全一致。 ## 如何使用 1. **开启功能**:在 Voyager 设置面板最后方找到 “NanoBanana 选项”,开启 “去除 NanoBanana 水印”。 2. **自动触发**:此后你生成的每一张图片,我们都会在后台自动完成去水印处理。 3. **直接下载**: - 悬停在处理后的图片上,你会看到一个 🍌 按钮。 - **🍌 按钮已完全替代**了原生的下载按钮,点击即可直接下载 100% 无水印的图片。
NanoBanana 示例
## 特别鸣谢 本功能基于 [journey-ad (Jad)](https://github.com/journey-ad) 开发的 [gemini-watermark-remover](https://github.com/journey-ad/gemini-watermark-remover) 项目。该项目是 [allenk](https://github.com/allenk) 开发的 [GeminiWatermarkTool C++ 版本](https://github.com/allenk/GeminiWatermarkTool) 的 JavaScript 移植版。感谢原作者们对开源社区的贡献。🧡 ## 隐私与安全 所有的去水印处理均在你的 **浏览器本地** 完成。图片不会被上传到任何第三方服务器,保护你的隐私和创作安全。 ================================================ FILE: docs/guide/prevent-auto-scroll.md ================================================ # 防自动跳转 在查看过往对话时,如果您输入了新问题并按下回车,Gemini™ 默认会将页面强制滚动到最底部以显示最新生成的回答。这可能会打断您的阅读体验。 **防自动跳转** 功能可以拦截这种不必要的滚动行为: - 当您向上滚动查看历史记录时,系统会自动阻止页面跳回底部。 - 此功能在扩展的“时间轴选项”设置中默认**关闭**,您可以手动前往扩展弹窗开启。 ## 开启方法 1. 点击浏览器工具栏的 Voyager 扩展图标打开弹窗。 2. 找到“时间轴选项(Timeline Options)”区域。 3. 开启“防自动跳转(Prevent Auto Scroll)”开关即可生效。 ================================================ FILE: docs/guide/prompts.md ================================================ # 你的数字资产:提示词库 磨了半天写出个神级 Prompt,帮大忙了。 用完就丢? 不,存起来。 ## 指令宝库 这是你的指令宝库。 ### 1. 捕获 写出好东西了?点输入框旁边的 **浮窗图标**。 存入库中,落袋为安。 ### 2. 归类 打上 `#代码`、`#邮件`、`#学术` 的标签。 工具要趁手,也要整洁。 ### 3. 调遣 下次要用,别再重敲。 打开库,搜标签,点一下插入。 一键调用,效率翻倍。 ![提示词管理器](/assets/gemini-prompt-manager.png) ## 任何网站皆可用 提示词管理器现在可以在您选择的任何网站上使用,不仅限于 Gemini™ 和 AI Studio。 ### 如何启用 1. 点击浏览器扩展栏的 Voyager 图标。 2. 滚动到 **提示词管理器** 部分。 3. 输入网站 URL(例如:`chatgpt.com` 或 `claude.ai`)。 4. 点击 **添加网站** 并授予权限。 5. **刷新目标网页**,即可看到悬浮球。 ### 常见 AI 网站示例 - `chatgpt.com` - ChatGPT - `claude.ai` - Claude - `copilot.microsoft.com` - Microsoft Copilot - `poe.com` - Poe ::: tip 在自定义网站上,**仅**激活提示词管理器功能。时间线、文件夹等其他功能是专为 Gemini 设计的,不会加载。 ::: ================================================ FILE: docs/guide/quote-reply.md ================================================ # 引用回复 Voyager 提供了便捷的“引用回复”功能,让针对特定内容的回复更加精准高效。 ## 功能介绍 在日常对话中,我们经常需要针对 AI 输出的某一段具体内容进行追问或反驳。传统的做法是复制那段话,然后在输入框里手打 `> ` 符号,非常繁琐。 Voyager 简化了这一流程: 1. **选中即引**:在对话页面(无论是你的提问还是 Gemini 的回答)中,用鼠标选中任意一段文字。 2. **悬浮按钮**:选中文字附近会自动浮现一个“引用回复”按钮。 3. **一键插入**:点击按钮,选中的文字会自动以标准的 Markdown 引用格式(`> 内容`)插入到你的输入框中。 ![引用回复](/assets/quote-reply.png) ## 特性 - **上下文感知**:智能识别对话内容,避免在无关区域(如输入框本身)误触发。 - **标准格式**:使用通用的 Markdown 语法,Gemini 可以完美理解这种引用结构,从而做出更精准的回应。 - **多行支持**:如果选中了多行文本,Voyager 会自动为每一行添加引用符号,保持格式整洁。 ## 使用技巧 - **追问细节**:选中 Gemini 回答中不清楚的某个概念,点击引用,然后输入“请详细解释一下这个概念”。 - **纠正错误**:选中回答中错误的代码或事实,引用后指出“这里不对,应该是...”。 ================================================ FILE: docs/guide/recents-hider.md ================================================ # 隐藏最近项目和 Gem ::: info **注意**:该功能仅在 1.1.9 及后续版本中支持。 ::: 为 Gemini™ 首页的“最近保存”部分添加一个优雅的切换开关,让界面更加简洁。现在也支持隐藏侧边栏的 **Gems** 列表!

隐藏最近保存

隐藏 Gems 列表

## 功能特点 - **上下文切换**:仅在鼠标悬停在“最近”区域时才显示微妙的隐藏按钮。 - **极简状态**:隐藏后,该区域会被底部的极简“窥视条”取代。 - **一键恢复**:只需悬停在“窥视条”上并点击即可立即恢复显示。 - **隐私保护**:防止在公共场合或他人经过时泄露您最近的活动内容。 - **持久化**:您的偏好会被保存,并在下次访问时自动应用。 ## 如何使用 1. 悬停在 Gemini 首页的“最近”区域。 2. 点击右上角出现的“隐藏”图标(划掉的眼睛)以折叠该区域。 3. 如需恢复,悬停在该区域底部留下的细线上并点击。 ================================================ FILE: docs/guide/settings.md ================================================ # 随心所欲 默认的已经很好。但我们要的是完美。 你的地盘,你做主。 ## 影院模式 为什么要透过门缝看世界? 把聊天框拉大。 - **宽屏**:1400px。写代码、看大表,视野全开。 - **专注**:800px。沉浸阅读,心无旁骛。 - **随意**:拖动滑块,你觉得多宽舒服,就多宽。 ## 掌控 点插件图标,进控制台。 - **滚动**:自然顺滑,还是经典手感? - **位置**:时间轴放哪顺手,就放哪。 - **视觉特效**:可切换 `飘雪`、`樱花`、`雨`,给页面加一点氛围感。 ## 自定义排序 控制台里的功能区域太多,常用的被埋在下面? 鼠标悬停在任意功能卡片上,右上角会出现 ▲/▼ 按钮。点一下,卡片就会上移或下移。调整后的顺序自动保存,下次打开还是你的布局。 ## 氛围感 Voyager 不只是在做效率增强,也允许你顺手把页面气质调对。 - **飘雪**:轻柔雪花缓慢飘落,适合安静阅读。 - **樱花**:花瓣自然飘散,页面会更轻盈。 - **雨**:电影感雨丝与细微水花,整体更有沉浸感。 - **平滑切换**:关闭特效或切换到另一种效果时,粒子会自然退场,不会突然消失。

打开设置

打开设置指南

调整视野

聊天宽度调整
================================================ FILE: docs/guide/sidebar-auto-hide.md ================================================ # 侧边栏自动收起 想要更加沉浸式的对话体验? 我们提供了**自动收起侧边栏**的功能。开启后,当你把鼠标移出侧边栏区域时,它会自动收起;当你把鼠标移入侧边栏区域时,它会自动展开。 ### 演示
### 如何开启 1. 打开 Voyager 的设置面板。 2. 在 **通用设置** 中找到 **侧边栏自动收起** 开关。 3. 打开开关即可生效。 _注意:此功能目前仅支持 Google Gemini。_ ================================================ FILE: docs/guide/sidebar.md ================================================ # 侧边栏宽度 文件夹名字太长,显示不全? 或者觉得侧边栏太宽,占用了宝贵的聊天空间? 现在,你可以自由调整侧边栏的宽度。 ## 如何调整 1. 打开 Voyager 的设置面板(点击浏览器右上角的插件图标)。 如何打开设置面板 2. 在 **通用设置** 中找到 **侧边栏宽度** 选项。 3. 拖动滑块,选择你觉得最舒适的宽度。 - **窄**:节省空间,专注于对话。 - **宽**:完整显示长文件夹名称,一目了然。 ## 支持平台 此功能同时支持: - **Google Gemini** - **Google AI Studio** 你的设置会自动保存,并在下次打开时生效。 ================================================ FILE: docs/guide/sponsor.md ================================================ # 赞助 > [!NOTE] > 如果 Voyager 帮到了你,欢迎分享到 X、即刻、小红书、Linux.do、V2EX 等等,也欢迎推荐给海外 KOL。每一次分享都能让更多人看到这个项目,从而改善 Gemini 的使用体验。谢谢。 维护开源项目主要靠热情(和咖啡)驱动 ☕ **[Voyager](https://github.com/Nagi-ovo/gemini-voyager)** 是一个完全免费且开源的浏览器扩展,旨在提升你的 Gemini 使用体验。如果这个扩展帮助你更高效地使用 Gemini,欢迎通过以下方式支持我继续开发和维护这个项目。 --- ## 在线平台 爱发电 ## 扫码投喂 🍵
微信支付 微信支付
支付宝 支付宝
--- ### 🎙️ 特别推荐: Typeless 我非常推荐 **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)** 这款 AI 语音输入工具。在开发 Voyager 的过程中,我将其整合进了日常工作流,极大地节省了我的时间并显著提升了整体开发效率。 > 🎁 **[点击我的邀请链接注册](https://www.typeless.com/?via=gemini-voyager)**(邀请码 _`gemini-voyager`_)即可获得 **5 美元免费额度**,同时也能支持本项目的开发。❤️ --- 感谢你的支持!你的每一份贡献都是对我最大的鼓励 ❤️ ================================================ FILE: docs/guide/tab-title.md ================================================ # 标签页标题同步 自动将浏览器标签页标题同步为当前 Gemini™ 对话的标题。 ## 功能介绍 - **实时同步**:当对话标题发生变化时(例如 AI 生成了新标题或你手动重命名了对话),浏览器标签页标题不仅仅是 "Gemini",而是会立即更新为具体的对话内容。 - **多页面支持**:完美支持普通的对话页面、Gem 对话以及多账户环境。 - **开关控制**:如果你不喜欢这个功能,可以在设置面板的“通用选项”中随时关闭。
标签页标题同步
## 如何使用 1. 安装扩展后,该功能默认开启。 2. 打开任意 Gemini 对话,观察浏览器标签页标题,它会自动变为当前的对话标题。 3. 若要关闭: - 点击扩展图标打开设置面板。 - 找到“通用选项” (General Options)。 - 关闭“同步标签页标题” (Update Tab Title) 开关。 ================================================ FILE: docs/guide/timeline.md ================================================ # 时间旅行 长对话是灾难。上上下下,找不着北。 Voyager 把对话变成一条线。 ## 看见节奏 看屏幕右侧。 每个点都是一句话。那是你对话的脉搏。 ## 导航,一步到位 - **瞬移**:点哪去哪,绝不拖泥带水。 - **偷看**:鼠标放上去,不用跳转也能看内容。 - **插眼**:长按节点 **加星**。给大脑打个书签。 - **层级 (实验性)**:右键点击节点,设置不同层级(1-3 级)或折叠子节点。让深度分支对话一目了然。 - **快捷键**:用键盘飞速穿梭。默认 `j`/`k` 上下跳转,想改就改。 ![时间轴导航](/assets/teaser.png) ## 键盘,更快 不想用鼠标?用键盘。 **就像在 Gemini 里开了 Vim Mode。** ### 默认快捷键 - `k` - 跳到上一个节点 - `j` - 跳到下一个节点 ### 自定义 打开扩展设置,点击快捷键框,按下你想用的键。 任意键,任意组合。`n`/`p`?`,`/`.`?随你。 **流动模式**下连按会排队播放动画。 **跳跃模式**下立即响应,速度拉满。 ================================================ FILE: docs/index.md ================================================ --- layout: home hero: name: 'Voyager' text: '终于,它完整了。' tagline: '思维有形,万物归位。' image: src: /logo.png alt: Voyager Logo actions: - theme: brand text: 下载安装 link: ./guide/installation - theme: alt text: 开始旅程 link: ./guide/getting-started teaser: title: '重新定义交互。' description: '我们不造扩展,我们重塑思考。
用 Voyager,不再是人适应界面,而是界面顺应心流。' image: '/assets/teaser.png' features: - title: '时间轴' details: '看见对话的脉搏。
让线性的时间,变成可触摸的空间。' - title: '文件夹' details: '给思想安个家。
哪怕是一闪而过的念头,也值得被郑重对待。' - title: '掌控权' details: '数据归你。
打破云端的围墙,让知识真正属于你。' features: - icon: 🧭 title: 时间轴 details: 别滚屏,去飞。瞬间抵达思维的任何落点。 - icon: 🗂️ title: 文件夹 details: 告别混沌。原生手感,直觉操作,井井有条。 - icon: ✨ title: 指令宝库 details: 捕捉灵光。珍藏你的每一次神来之笔。 - icon: 💬 title: 引用回复 details: 选中即引。上下文精确回复,沟通更高效。 - icon: ↔️ title: 对话宽度 details: 视野全开。自由调节对话框宽度,代码表格完整呈现。 - icon: 💾 title: 对话导出 details: 数据归你。多种格式一键存档,知识不再流失。 - icon: 🌦️ title: 视觉特效 details: 页面也有情绪。可在弹窗中切换飘雪、下雨与樱花花瓣效果。 - icon: 🍌 title: NanoBanana 水印去除 details: 无损去水印。让 AI 生成的瞬间回归纯净。 - icon: 📐 title: 公式复制 details: 一键复制 LaTeX 和 MathML (Word) 源码。 - icon: 🧜‍♀️ title: Mermaid 图表 details: 代码变图表。流程图、时序图、甘特图一键可视化。 - icon: 🏷️ title: 标签页标题同步 details: 一眼即知。自动将标签页标题同步为对话标题。 - icon: 🔀 title: 对话分支 (实验性) details: 发散思维。在任意节点分叉对话,探索不同可能。 - icon: 🗑️ title: 批量删除对话 details: 一键清理。选中多个对话,批量删除,告别繁琐。 - icon: ☁️ title: 云同步 details: 永远在线。文件夹与提示词库同步至 Google Drive,多设备无缝衔接。 - icon: ⚡️ title: 默认模型 details: 拒绝重复劳动。新建对话自动切换至你最爱的模型。 - icon: 🔬 title: Deep Research details: 拆开黑箱。一键提取 Deep Research 的思考过程与研究链接。 ---
⚠️ 改名公告:由于商标版权问题,本插件已正式改名为 Voyager。但由于谷歌插件商店审核速度奇慢,七天内未能完成名称更新审核,暂时无法在 Chrome Web Store 使用。

每一次下载,都是信任的刻度

来自 Chrome Web Store 与 GitHub 的实时数据。致敬每一位与我们同行的 Voyager。

GitHub Star GitHub Fork 最新版本 GitHub 下载量 Chrome 商店用户数 Chrome 商店评分 Edge 商店 Firefox 商店用户数 Firefox 商店评分
Nagi-ovo%2Fgemini-voyager | Trendshift

特别鸣谢

✨ 我们已在 Product Hunt 上线!欢迎来分享你的想法和反馈。❤️

Voyager on Product Hunt

“它不只是工具,更是伴你思维远航的伙伴。”

探索更多 →

================================================ FILE: docs/ja/guide/batch-delete.md ================================================ # 一括削除 複数の会話を一度に削除し、一つずつ消す面倒な作業に別れを告げましょう。 ## 機能紹介 - **複数選択モード**:任意の会話を長押しすると複数選択モードに入り、削除したい会話を複数チェックできます。 - **一括削除**:選択後、削除ボタンをクリックするだけで、選択した会話をまとめて削除できます。 - **進捗表示**:削除中は進捗が表示され、現在の状態を確認できます。 - **安全確認**:削除前には確認ダイアログが表示され、誤操作を防ぎます。
Batch Delete
## 使い方 1. サイドバーの会話リストで、任意の会話項目を **長押し** します。 2. 複数選択モードに入ると、会話項目の左側にチェックボックスが表示されます。 3. 削除したい会話にチェックを入れます(一度に最大50件まで選択可能)。 4. 出現した **削除ボタン** をクリックします。 5. **フォルダリストの上** に表示される赤い確認エリアで「確定」をクリックすると、一括削除が開始されます。 ::: tip ヒント 削除確認パネルはフォルダエリアの上に表示されます。これは会話リストを遮らないようにするためです。一括削除操作は取り消せませんので、慎重に操作してください。 ::: ================================================ FILE: docs/ja/guide/cloud-sync.md ================================================ # クラウド同期 フォルダ、プロンプトライブラリ、その他のデータを Google ドライブに同期して、デバイス間で一貫した体験を維持します。 ## 機能の特徴 - **マルチデバイス同期**: Google ドライブを使用して、複数のコンピュータで設定を同期させます。 - **データのプライバシー**: データはご自身の Google ドライブ ストレージに直接保存されるため、サードパーティのサーバーを介さずプライバシーが確保されます。 - **柔軟な同期**: 手動でのアップロードおよびデータのダウンロード・マージをサポートしています。 ::: info **近日公開**: 次のバージョンでは、スター付きの会話の同期をサポートする予定です。 ::: ## 使用方法 1. Gemini™ ページの右下隅にある拡張機能アイコンをクリックして、設定パネルを開きます。 2. **クラウド同期**セクションを見つけます。 3. **Google でサインイン**をクリックし、認証を完了します。 4. 認証されたら、**クラウドにアップロード**をクリックしてローカルデータをクラウドに同期するか、**ダウンロードしてマージ**をクリックしてクラウドデータをローカルマシンに取り込みます。 ### 💡 クイック同期 最も簡単な方法は、左側のサイドバーの**フォルダエリア上部**にある「クラウドにアップロード」または「ダウンロードしてマージ」ボタンをクリックすることです。 クラウド同期クイックボタン ::: warning **安全上の推奨事項:二重保護** クラウド同期は非常に便利ですが、データの万全を期すため、定期的に**ローカルファイル形式**でコアデータを手動バックアップすることを強くお勧めします。 1. **全設定をエクスポート**: 設定パネル下部の「バックアップと復元」から、すべての設定、フォルダー、プロンプトを含む完全なパッケージをエクスポートします。 全設定をエクスポート 2. **すべてのフォルダーをエクスポート**: 設定パネル의「フォルダー」セクションで「エクスポート」をクリックし、すべてのフォルダー構造と会話のみをバックアップします(プロンプトは含まれません)。 すべてのフォルダーをエクスポート ::: ================================================ FILE: docs/ja/guide/community.md ================================================ # コミュニティ 私たちは、すべてのユーザーの声を大切にしています。バグを見つけたとき、機能のアイデアがあるとき、あるいは自慢のプロンプト集を共有したいときなど、以下の方法でいつでもご連絡ください。 ## 📢 最新情報 X (Twitter) でフォローして、最新の開発状況をチェックしましょう。 - **新バージョン**:アップデート情報をいち早くお届け。 - **機能プレビュー**:今後追加される機能を先行公開。 ## 💬 Discord コミュニティ Discord サーバーに参加して、他の Voyager ユーザーと交流しましょう! - **リアルタイムチャット**:他のユーザーや開発者と直接会話できます。 - **プロンプト共有**:みんながどんなプロンプトを使っているか見てみましょう。 - **開発状況**:新機能の開発状況をいち早くキャッチできます。 ## 🐙 GitHub Issues バグを発見した場合や、具体的な機能リクエストがある場合は、GitHub で Issue を作成することをお勧めします: - [バグ報告を提出する](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=bug_report.yml) - [機能提案を提出する](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=feature_request.yml) Voyager をサポートしていただき、ありがとうございます!❤️ ================================================ FILE: docs/ja/guide/context-sync.md ================================================ # 記憶の搬送:コンテキスト同期(実験的) **異なる次元、シームレスな共有** ウェブでロジックを推敲し、IDEでコードを実装する。 Voyager は次元の壁を打ち破り、IDEにウェブ側の「思考プロセス」を即座に共有します。 ## 繰り返しの横断にさよなら 開発者にとって最大の悩み:ウェブで解決策を徹底的に話し合った後、VS Code/Trae/Cursorに戻ると、見知らぬ人のように要件を再説明しなければならないこと。 利用制限やレスポンス速度の関係で、ウェブは「脳」、IDEは「手」となります。 Voyager は、それらに一つの魂を共有させます。 ## 極簡な3ステップ、同じ呼吸で 1. **CoBridgeのインストールと起動**: **CoBridge** 拡張機能をインストールします。これはウェブインターフェースとローカルIDEを接続する中核的な架け橋です。 - **[マーケットプレイスからインストール](https://open-vsx.org/extension/windfall/co-bridge)** ![CoBridge拡張機能](/assets/CoBridge-extension.png) インストール後、**任意の作業ディレクトリを開き**、右側のアイコンをクリックしてサーバーを起動します。 ![CoBridgeサーバー起動](/assets/CoBridge-on.png) 2. **接続の確立**: - Voyagerの設定で「コンテキスト同期」を有効にします。 - ポート番号を合わせます。「IDE オンライン」と表示されれば接続完了です。 ![コンテキスト同期コンソール](/assets/context-sync-console.png) 3. **ワンクリック同期**:**"IDEに同期"**をクリックします。複雑な**データテーブル**も、直感的な**参考画像**も、瞬時にIDEへ同期されます。 ![同期完了](/assets/sync-done.png) ## IDEへの定着 同期が完了すると、IDEの作業ディレクトリに `.cobridge/AI_CONTEXT.md` が追加されます。 Trae、Cursor、Copilotのいずれであっても、それぞれのRuleファイルを介してこの「記憶」を自動的に読み取ります。 ``` your-project/ ├── .cobridge/ │ ├── images/ │ │ ├── context_img_1_1.png │ │ └── context_img_1_2.png │ └── AI_CONTEXT.md ├── .github/ │ └── copilot-instructions.md ├── .gitignore ├── .traerules └── .cursorrules ``` ## その原則 - **ゼロ汚染**:CoBridgeは自動的に `.gitignore` を処理し、プライベートな会話がGitリポジトリにプッシュされないようにします。 - **実用的**:完全なMarkdown形式で、IDE内のAIが取扱説明書を読むようにスムーズに理解できます。 - **ヒント**:会話が古い場合は、まず [タイムライン] で上にスクロールして、ウェブ側に記憶を「思い出させて」から同期すると、より効果的です。 --- ## いざ、起動へ **クラウドで整った思考を、今こそローカルで具現化させましょう。** - **[CoBridge拡張機能をインストール](https://open-vsx.org/extension/windfall/co-bridge)**:次元の扉を開き、一クリックで「同期する呼吸」を体感してください。 - **[GitHubリポジトリを訪ねる](https://github.com/Winddfall/CoBridge)**:CoBridgeの深層ロジックを探索し、この「魂を同期させる」プロジェクトにStarを贈りましょう。 > **AIはこれでもう物忘れしない、手にした瞬間から即戦力。** ================================================ FILE: docs/ja/guide/deep-research.md ================================================ # Deep Research エクスポート Deep Research で生成された最終レポートをエクスポートしたり、その完全な「思考」プロセスを Markdown ファイルとして保存したりできます。 ## 1. レポートのエクスポート (PDF / 画像) Deep Research で生成されたレポートは、美しいフォーマットの PDF または共有に便利な単一の画像としてエクスポートできます(Markdown および JSON 形式もサポートしています)。 ![レポートのエクスポート](/assets/deep-research-report-export.png) ## 2. 思考プロセスのエクスポート (Markdown) 最終レポートに加えて、Deep Research の会話から完全な「思考」内容をエクスポートすることも可能です。 ### 機能の特長 - **ワンクリック・エクスポート**: 共有・エクスポートボタンをクリックするだけでダウンロードできます。 - **構造化されたフォーマット**: 思考フェーズ、思考項目、参照したウェブサイトを元の順序どおりに保持します。 - **バイリンガル見出し**: Markdown ファイルには、英語と現在の言語のバイリンガル見出しが含まれます。 - **自動ファイル名**: ファイル名にはタイムスタンプが使用され、整理が容易です(例: `deep-research-thinking-20240128-153045.md`)。 ### 使い方 1. Gemini™ で Deep Research の会話を開きます。 2. 会話の **共有とエクスポート** ボタンをクリックします。 3. 「Download Thinking Content(思考内容をダウンロード)」を選択します。 4. Markdown ファイルが自動的にダウンロードされます。 ![Deep Research 思考プロセスのエクスポート](/assets/deepresearch_download_thinking.png) ### エクスポートファイルの形式 エクスポートされる Markdown ファイルには以下が含まれます: - **タイトル**: 会話のタイトル - **メタデータ**: エクスポート日時、総思考フェーズ数 - **思考フェーズ**: 各フェーズには以下が含まれます: - 思考項目(タイトルと内容) - 参照したウェブサイト(リンクとページタイトル) #### 出力例 ```markdown # Deep Research 会話タイトル **导出时间 / Exported At:** 2025-12-28 17:25:35 **总思考阶段 / Total Phases:** 3 --- ## 思考阶段 1 / Thinking Phase 1 ### 思考タイトル 1 思考内容... ### 思考タイトル 2 思考内容... #### 研究网站 / Researched Websites - [domain.com](https://example.com) - ページタイトル - [another.com](https://another.com) - 別のタイトル --- ## 思考阶段 2 / Thinking Phase 2 ... ``` ## プライバシー保護 抽出とフォーマット処理はすべて、ブラウザ内で **100% ローカル** に行われます。外部サーバーにデータが送信されることはありません。 ================================================ FILE: docs/ja/guide/default-model.md ================================================ # デフォルトモデル ::: info **注意**: この機能はバージョン 1.1.9 以降でサポートされています。 ::: お気に入りの Gemini™ モデルをデフォルトとして設定し、新しい会話を始めるたびに手動で切り替える手間を省きます。
## 機能の特徴 - **直感的な設定**:Gemini のモデル選択メニューに「スター」ボタンを直接追加します。 - **自動切り替え**:新しい会話を開始すると、設定したデフォルトモデルに自動的に切り替わります。 - **設定の保存**:設定は保存され、デバイス間で同期されます。 - **SPA 最適化**:「新しいチャット」ボタンのクリック、ショートカットキーの使用、またはホームページへの移動を正確に検知して動作します。 ## 使い方 1. Gemini 入力欄の上にある**モデルセレクター**をクリックします。 2. デフォルトにしたいモデルにマウスを合わせ、表示される**スターアイコン**をクリックします。 3. スターが**塗りつぶされた状態**になれば、そのモデルがデフォルトとして設定されます。 4. 以降、新しいチャットを開始するたびに、システムが自動的にそのモデルを選択します。 5. 解除するには、もう一度塗りつぶされたスターアイコンをクリックしてください。 ================================================ FILE: docs/ja/guide/export.md ================================================ # 完全な自由 データに鍵をかけられるのは、最悪の体験です。 私たちの信条はシンプルです:あなたが創ったものは、あなたのものです。 ## すべてを持ち出す Voyager は、データをクラウドからあなたの手元へと引き戻す手助けをします。 ### 選べるフォーマット - **Markdown**:Obsidian や Notion へ。クリーンで扱いやすい形式。(Safariユーザーへの注意:ブラウザの制限により画像を抽出できません。PDFエクスポートを推奨します) - **PDF**:共有や印刷に。画像も含まれた美しいレイアウト。 - **JSON**:開発者向け。生のデータ、使い方はあなた次第。 ### エクスポート方法 1. Geminiロゴにマウスを合わせると、**エクスポートアイコン**が表示されます。 2. フォーマットを選びます。 3. 持ち出します。 あなたのデータは、あなたの意のままに。

1. ロゴにホバー

Export Guide Step 1

2. フォーマットを選ぶ

Export Guide Step 2
### Safari PDF エクスポートに関する注意 Safari で PDF をエクスポートする手順は少し異なります(手動印刷が必要です): 1. **エクスポート**ボタンをクリックし、PDF 形式を選択します。 2. **1秒ほど待ちます**(ページが印刷スタイルの準備をするため)。 3. `Command + P` を押して印刷ダイアログを開きます。 4. 印刷ダイアログで **"Save to PDF"**(または「PDFとして保存」)を選択します。 Safari Export PDF ================================================ FILE: docs/ja/guide/folders.md ================================================ # フォルダ、本来あるべき姿へ AI チャットの整理がなぜこれほど難しかったのでしょうか? 私たちはそれを解決しました。あなたの思考のためのファイルシステムを構築しました。

Gemini™

Gemini フォルダ

AI Studio

AI Studio フォルダ
## 整理の直感 手触りが良ければ、すべてがうまくいきます。 - **ドラッグ&ドロップ**:チャットを掴んで、フォルダに落とす。直感的な物理フィードバック。 - **階層構造**:プロジェクトの中にサブプロジェクトを。フォルダの中にフォルダを作成し、自分流に構造化。 - **フォルダ間隔**:コンパクトからゆったりまで、サイドバーの密度を自由に調整。 > _注:Mac Safari では調整がリアルタイムに反映されない場合があります。ページを再読み込みすると反映されます。_ - **インスタント同期**:デスクトップで整理すれば、ノートパソコンでもすぐに反映。 ## プロの技 - **複数選択**:チャット項目を長押しすると複数選択モードに入り、一括操作でまとめて処理できます。 - **名前変更**:フォルダをダブルクリックするだけで、直接リネームできます。 - **アイコン**: Gem のタイプ (コーディング、クリエイティブなど) を自動的に検出し、適切なアイコンを割り当てます。何もする必要はありません。 ## プラットフォームによる機能の違い ### 共通機能 - **基本管理**:ドラッグ&ドロップ、名前変更、複数選択。 - **スマート認識**:チャットの種類を自動判別し、アイコンを割り当て。 - **階層構造**:フォルダの入れ子構造(ネスト)に対応。 - **AI Studio 対応**:上記の高度な機能はまもなく AI Studio でも利用可能になります。 - **Google Drive 同期**:フォルダ構造を Google Drive と同期。 ### Gemini 限定機能 #### カスタムカラー フォルダーのアイコンをクリックして、色をカスタマイズします。7つのデフォルトカラーから選ぶか、カラーピッカーで好きな色を選択できます。 フォルダカラー #### アカウント隔離 ヘッダーの「人物」アイコンをクリックすると、他の Google アカウントの会話を瞬時にフィルタリングします。複数のアカウントを使い分ける際、ワークスペースをクリーンに保ちます。 アカウント隔離 #### AI 自動整理 チャットが多すぎて、整理するのが面倒?Gemini に考えてもらいましょう。 ワンクリックで今の会話構造をコピーして、Gemini に貼り付けるだけ。すぐにインポートできるフォルダプランを生成してくれます——一瞬で整理完了。 **ステップ 1:会話構造をコピー** 拡張機能ポップアップのフォルダセクション下部にある **AI 整理** ボタンをクリック。未分類の会話と既存のフォルダ構造を自動的に収集し、プロンプトを生成してクリップボードにコピーします。 AI Organize Button **ステップ 2:Gemini に分類してもらう** クリップボードの内容を Gemini の会話に貼り付けます。チャットのタイトルを分析して、JSON フォルダプランを出力してくれます。 **ステップ 3:結果をインポート** フォルダパネルのメニューから **フォルダをインポート** をクリックし、**または JSON を直接貼り付け** を選択、Gemini が返した JSON を貼り付けて **インポート** をクリックします。
Import Menu
Paste JSON Import
- **増分マージ**:デフォルトで「マージ」戦略を採用——新しいフォルダと割り当てを追加するだけで、既存の整理を壊すことはありません。 - **多言語対応**:プロンプトは設定した言語を自動的に使用し、フォルダ名もその言語で生成されます。 ### AI Studio 限定機能 - **サイドバー調整**:ドラッグでサイドバーの幅を自由に調整。 - **Library 連携**:Library リストからフォルダへ直接ドラッグ&ドロップ。 ================================================ FILE: docs/ja/guide/fork.md ================================================ # 会話の分岐 (実験的) 思考は一方通行であるべきではありません。複雑な探求の過程では、しばしば重要な分岐点に戻り、別の可能性を試したくなるものです。 Voyager の **会話の分岐** 機能を使えば、思考を柔軟に広げ、チャットの並行宇宙を探索できます。 ## 機能紹介 > **⚠️ 注意**: これは実験的な機能です。まず、ブラウザのツールバーにある拡張機能アイコンをクリックして設定ポップアップを開き、**「会話の分岐を有効にする」** スイッチをオンにする必要があります。 別の道を試したくなった時は、あなたの質問にマウスを重ねて **分岐** ボタンをクリックするだけです。 ![会話の分岐](/assets/branching.png) Voyager は、会話の始まりからその時点までのすべての文脈を即座に抽出し、あなたのために **新しい会話を開始** します。 この新しい分岐では、元の会話の履歴を気にする必要はありません。自由に質問を修正し、様々な方向性へと探求を進めてください。あなたの創造力と好奇心を解き放ちましょう! ================================================ FILE: docs/ja/guide/formula-copy.md ================================================ # 数式コピー Voyager を使用すると、数式や科学記号の再利用が非常に簡単になります。LaTeX ソースコードの一クリックコピーに加え、Microsoft Word と互換性のある MathML 形式もサポートしています。 ## 機能紹介 Gemini に数式の導出や数学的表現の記述を依頼すると、通常は LaTeX を使用してレンダリングされます。見た目は美しいですが、これらの数式を自分の論文、ドキュメント、またはエディタにコピーしたい場合、これまでは手動でソースを抽出する必要がありました。 Voyager は、そのためのシームレスなサポートを提供します。 1. **自動認識**: Voyager は、ページ内にレンダリングされた LaTeX 数式を自動的に識別します。 2. **コピーボタン**: 数式にマウスを合わせると、数式の右側にコピーアイコンが表示されます。 3. **形式の選択**: コピーアイコンをクリックすると、以下を選択できます: - **Copy LaTeX**: Overleaf や Markdown エディタなどに適した、標準的な LaTeX ソースをコピーします。 - **Copy MathML**: **Microsoft Word** に直接貼り付けるのに最適な MathML ソースをコピーします。 ![数式コピー](/assets/gemini-math-copy.png) ## 特徴 - **Word との完璧な互換性**: MathML サポートにより、複雑な AI 生成の数式を Word 文書に直接貼り付けることができ、編集可能な数式形式を維持できます。 - **コンテキストの保持**: 数式そのものだけでなく、数式の数学的な文脈も保持します。 - **高速なレスポンス**: すべてローカルで処理されるため、クリックするだけで瞬時に結果が得られます。 ## 活用シーン - **論文執筆**: Word で論文を書く際、Gemini に数式を導出させ、MathML でコピー&ペーストすることで、Word の数式エディタで手入力する手間を省けます。 - **ノート作成**: Obsidian や Notion でメモを取る際、LaTeX ソースを直接コピーできます。 ================================================ FILE: docs/ja/guide/getting-started.md ================================================ # ようこそ、船上へ おめでとうございます。あなたのワークフローは、いまアップグレードされました。 Voyager は単なるツールではなく、一つの「習慣」です。5分だけ時間をください。使い方をご案内します。 ## 1. 準備完了 まだインストールしていませんか? [インストールガイド](/ja/guide/installation) へどうぞ。 インストール済みですか? Gemini のページを更新してみてください。変化は一目瞭然でしょう。 ## 2. 時間を旅する 長い会話をしてみましょう。例えば漢字の変遷史について、あるいは量子力学について。 右側を見てください。 **その点の繋がりが、あなたの航海図です。** - **見る**:マウスオーバーするだけで、その時の発言内容をのぞき見できます。 - **飛ぶ**:クリックすれば、その瞬間へワープします。 - **残す**:長押しでスターを付けて、ハイライトとして保存します。 もうマウスホイールを回し続けて指を痛める必要はありません。思考の速度で、移動しましょう。 ## 3. 整理整頓 左側のチャットリストを見てください。 **フォルダの登場です。** チャットを掴んで、ドラッグして、ドロップ。 絹のように滑らかです。階層化も、名前の変更も、思いのまま。脳内のノイズを一掃し、清々しさだけを残しましょう。 ## 4. 宝石を保存 素晴らしいプロンプト(指示)が書けましたか? そのまま流してしまうのはもったいない。 入力欄にある **✨ アイコン** をクリックしてください。 保存して、タグを付けましょう。 次回使いたい時は? アイコンをクリックして、検索して、挿入するだけ。 これは単なるチャットではありません。あなたのデジタル資産を蓄積するプロセスなのです。 --- **発進。** それぞれの機能を深く掘り下げてみましょう: - [タイムラインを使いこなす](/ja/guide/timeline) - [フォルダをマスターする](/ja/guide/folders) - [プロンプトを管理する](/ja/guide/prompts) - [データを掌握する](/ja/guide/export) ================================================ FILE: docs/ja/guide/input-collapse.md ================================================ # 入力欄の自動非表示 入力欄が空の時に自動的に折りたたみ、より広い読書スペースを確保します。クリックすると展開して入力できます。
Input Collapse
## 使い方 1. 入力欄が空で、かつフォーカスが外れていると、自動的にシンプルなカプセル型のボタンに折りたたまれます。 2. カプセルボタンをクリックすると、入力欄が展開され、入力を開始できます。 3. Ctrl/+I を押して素早く入力欄を展開することもできます。 4. この機能は設定パネルでオン/オフを切り替えられます(デフォルトはオフ)。 ================================================ FILE: docs/ja/guide/installation.md ================================================ # インストール ::: info ニュース 🍎 **Safari ネイティブ拡張機能が登場!** 完全無料でワンクリックインストールが可能です。 ::: 方法を選択してください。 > ⚠️ プロンプトマネージャーは Gemini™ Enterprise 版で唯一対応している機能です。 ## 1. 公式ストア(推奨) 最も簡単な方法で、自動更新に対応しています。 **Chrome / Brave / Opera / Vivaldi:** [Chrome ウェブストアからインストール](https://chromewebstore.google.com/detail/kjdpnimcnfinmilocccippmododhceol?utm_source=github&utm_medium=docs&utm_campaign=organic_growth&utm_content=ja) ::: warning ⚠️ Chrome Web Store は一時的に利用不可 商標上の問題により、本拡張機能は **Voyager** に正式改名されました。Chrome Web Store の審査は進行中です。詳細は[こちらの投稿](https://x.com/Nag1ovo/status/2031561180213313944)をご覧ください。当面は **Edge / Firefox** または**手動インストール**をご利用ください。 ::: **Microsoft Edge:** [Microsoft Edge Add-ons からインストール](https://microsoftedge.microsoft.com/addons/detail/gemini-voyager/gibmkggjijalcjinbdhcpklodjkhhlne) **Firefox:** [Firefox Add-ons からインストール](https://addons.mozilla.org/firefox/addon/gemini-voyager/) ## 2. 手動インストール(最新版) ストアの審査は時間がかかります。最新機能をいち早く試したい方は、こちらをどうぞ。 **Chrome / Edge / Brave / Opera:** 1. [GitHub Releases](https://github.com/Nagi-ovo/gemini-voyager/releases) から最新の `gemini-voyager-chrome-vX.Y.Z.zip` をダウンロードします。 2. 解凍します。 3. 拡張機能ページ (`chrome://extensions`) を開きます。 4. **デベロッパーモード**(右上)をオンにします。 5. **パッケージ化されていない拡張機能を読み込む** をクリックし、先ほど解凍したフォルダを選択します。 **Firefox:** 1. [Releases](https://github.com/Nagi-ovo/gemini-voyager/releases) から最新の `gemini-voyager-firefox-vX.Y.Z.xpi` をダウンロードします。 2. アドオン管理ページ (`about:addons`) を開きます。 3. ダウンロードした `.xpi` ファイルをドラッグ&ドロップしてインストールします(または右上の歯車アイコン ⚙️ -> **ファイルからアドオンをインストール**)。 > 💡 XPI ファイルは Mozilla 公式の署名済みであり、すべての Firefox バージョンで恒久的にインストール可能です。 ## 3. Safari (macOS) Safari が直接配布に対応しました!署名済みアプリをダウンロードできます: 1. 最新の Safari バージョン (.dmg)をダウンロードします。 2. ダブルクリックして開き、指示に従ってインストールします。 3. ダブルクリックしてアプリを起動します。 4. **Safari の設定 > 拡張機能**で有効にします。 > 💡 Safari ビルドが直接署名配布に対応しました。Xcode 変換は不要です! > > ⚠️ **制限事項**: Safari の特性上、(a) 透かしの削除 (b) 画像のエクスポート(PDF を推奨)はサポートされていません。 --- _コードに貢献したいですか? 開発者の方は [貢献ガイド](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/CONTRIBUTING.md) へどうぞ。_ ================================================ FILE: docs/ja/guide/markdown-fix.md ================================================ # Markdown レンダリングの修正 Gemini™ のウェブインターフェースでは、テキスト内に HTML 要素(引用元やハイライトマーカーなど)が挿入されることがあり、これにより Markdown の太字構文(`**text**`)が壊れ、テキストが正しく太字で表示されない場合があります。 Voyager には自動修正機能が組み込まれており、これらの壊れた太字タグをインテリジェントに識別して修復し、ドキュメントが綺麗かつ正確に表示されるようにします。 > [!INFO] > この機能は自動的に有効になり、追加の設定は必要ありません。 ================================================ FILE: docs/ja/guide/mermaid.md ================================================ # Mermaid ダイアグラムレンダリング Mermaid コードを図表として自動レンダリングします。 ## 機能紹介 Gemini™ が Mermaid コードブロック(フローチャート、シーケンス図、ガントチャートなど)を出力すると、Voyager はそれを自動的に検出し、インタラクティブな図表として描画します。 ### 主な特徴 - **自動検出**: `graph`、`flowchart`、`sequenceDiagram`、`gantt`、`pie`、`classDiagram` など、主要な Mermaid 図表タイプをすべてサポートしています。 - **ワンクリック切り替え**: ボタン一つで、レンダリングされた図表と元のソースコードを自由に切り替えられます。 - **全画面表示**: 図表をクリックすると全画面モードになり、マウスホイールでのズームやドラッグによる移動が可能です。 - **ダークモード**: ページのテーマに自動的に適応します。 ## 使い方 1. Gemini に Mermaid の図表コードを生成させます。 2. コードブロックが自動的にレンダリング後の図表に置き換わります。 3. ** Code** ボタンをクリックすると、元のコードを確認できます。 4. **📊 Diagram** ボタンをクリックすると、図表ビューに戻ります。 5. 図表エリアをクリックすると、全画面表示になります。 ## 全画面モードの操作 - **ホイール**: 図表のズーム - **ドラッグ**: 図表の移動 - **+/-**: ツールバーでのズーム - **⊙**: ビューのリセット - **✕ / ESC**: 全画面を閉じる ## 互換性とトラブルシューティング ::: warning 説明 - **Firefox の制限**: 環境の制限により、Firefox では 9.2.2 バージョンを使用しており、**Timeline** や **Sankey** などの新機能は現在サポートされていません。 - **構文エラー**: レンダリングの失敗は、通常 Gemini が生成したコードの構文エラーによるものです。現在 Bad Case を収集しており、今後のアップデートで一般的な生成エラーを自動修正するパッチを導入予定です。 :::
Mermaid Diagram Rendering
================================================ FILE: docs/ja/guide/nanobanana.md ================================================ # NanoBanana オプション ::: warning ブラウザの互換性 現在、**NanoBanana** ウォーターマーク除去機能は、ブラウザの API の制限により **Safari ではサポートされていません**。この機能を使用する必要がある場合は、**Chrome** または **Firefox** を使用することをお勧めします。 Safari ユーザーは、ダウンロードした画像を [banana.ovo.re](https://banana.ovo.re/) などのツールサイトにアップロードして手動で除去することも可能です(ただし、画像の解像度の違いにより、すべての画像で成功するとは限りません)。 ::: **AI 画像、あるべき純粋な姿へ。** Gemini™ が生成する画像には、デフォルトで目に見える透かしが入っています。これは安全上の理由によるものですが、創作活動においては、完全にクリーンな素材が必要な場合もあるでしょう。 ## 無劣化復元 NanoBanana は **逆アルファブレンドアルゴリズム (Reverse Alpha Blending)** を採用しています。 - **AI による再描画なし**: 従来の透かし除去ツールが多用する AI による塗りつぶしは、画像の細部を破壊してしまいます。 - **ピクセル精度の復元**: 私たちは計算によって、ピクセル上の透かしの透明層を正確に取り除き、オリジナルのピクセルを 100% 復元します。 - **品質劣化ゼロ**: 処理前後の画像は、透かし以外の部分において完全に一致します。 ## 使い方 1. **機能を有効化**: Voyager の設定パネル末尾にある「NanoBanana オプション」を見つけ、「NanoBanana 透かし除去」をオンにします。 2. **自動処理**: これ以降、あなたが生成するすべての画像に対し、バックグラウンドで自動的に透かし除去処理が行われます。 3. **直接ダウンロード**: - 処理済みの画像にマウスを乗せると、🍌 ボタンが表示されます。 - **🍌 ボタンは標準のダウンロードボタンを完全に置き換えます**。クリックするだけで、100% 透かしのない画像を直接ダウンロードできます。
NanoBanana Example
## 特別謝辞 本機能は、[journey-ad (Jad)](https://github.com/journey-ad) 氏が開発した [gemini-watermark-remover](https://github.com/journey-ad/gemini-watermark-remover) プロジェクトに基づいています。このプロジェクトは、[allenk](https://github.com/allenk) 氏による [GeminiWatermarkTool C++ 版](https://github.com/allenk/GeminiWatermarkTool) の JavaScript 移植版です。オープンソースコミュニティへの多大なる貢献に感謝します。🧡 ## プライバシーとセキュリティ すべての透かし除去処理は、あなたの **ブラウザ内でローカル** に完了します。画像がいかなる第三者のサーバーにアップロードされることはなく、あなたのプライバシーと創作の安全は守られます。 ================================================ FILE: docs/ja/guide/prevent-auto-scroll.md ================================================ # 自動スクロール防止 過去の会話を読んでいるときに新しいプロンプトを送信すると、Gemini™ は新しく生成された回答を追跡するためにページを一番下まで強制的にスクロールします。これにより読書体験が妨げられる可能性があります。 **自動スクロール防止** 機能は、この迷惑なジャンプ動作を阻止します。 - 履歴を読むために上にスクロールしている間、システムはページが一番下にジャンプするのをブロックします。 - この機能はデフォルトで**無効**になっています。ポップアップ設定の「Timeline Options」から手動で有効にできます。 ## 有効にする方法 1. ブラウザのツールバーにある Voyager 拡張機能アイコンをクリックしてポップアップを開きます。 2. 「Timeline Options(タイムラインオプション)」セクションを見つけます。 3. 「自動スクロール防止(Prevent Auto Scroll)」スイッチをオンにします。 ================================================ FILE: docs/ja/guide/prompts.md ================================================ # あなたのデジタル資産:プロンプトヴォルト 苦労して書き上げた神がかったプロンプト。大いに役立ちましたね。 使い終わったら捨てますか? いいえ、保存しましょう。 ## プロンプトヴォルト これは、あなたのヴォルトです。 ### 1. 保存 いいプロンプトができましたか? 入力欄の **✨ アイコン** をクリックしましょう。 ヴォルトに保存して、しっかり自分のものに。 ### 2. 分類 `#コード`、`#メール`、`#学術` などのタグを付けましょう。 道具は、使いやすく整えられてこそ意味があります。 ### 3. 呼び出し 次回使いたい時、もう打ち直す必要はありません。 ヴォルトを開き、タグで検索し、ワンクリックで挿入。 一瞬で呼び出し、効率を倍増させましょう。 ![Prompt Manager](/assets/gemini-prompt-manager.png) ## あらゆるサイトで利用可能 プロンプトマネージャーは、Gemini™ と AI Studio に限らず、あなたが選択したあらゆるウェブサイトで使用できるようになりました。 ### 有効にする方法 1. ブラウザのツールバーにある Voyager アイコンをクリックします。 2. **Prompt Manager** (プロンプトマネージャー) セクションまでスクロールします。 3. ウェブサイトの URL を入力します(例:`chatgpt.com` や `claude.ai`)。 4. **Add Website** (ウェブサイトを追加) をクリックして権限を許可します。 5. **対象のページを再読み込み** すると、フローティングボタンが表示されます。 ### 人気の AI サイトの例 - `chatgpt.com` - ChatGPT - `claude.ai` - Claude - `copilot.microsoft.com` - Microsoft Copilot - `poe.com` - Poe ::: tip カスタムウェブサイトでは、**プロンプトマネージャー機能のみ** が有効になります。タイムラインやフォルダなど、Gemini 専用に設計された機能は読み込まれません。 ::: ================================================ FILE: docs/ja/guide/quote-reply.md ================================================ # 引用返信 Voyager の「引用返信」機能を使うと、文脈を保った返信をより正確かつ効率的に行えます。 ## 機能紹介 日常的な対話の中で、AI の出力の特定部分についてさらに質問したり、反論したりしたい場面がよくあります。従来の方法では、その部分をコピーし、入力欄で手動で `> ` 記号を打つ必要があり、非常に面倒でした。 Voyager なら、もっとシンプルです: 1. **選択して引用**:会話内(あなたの質問でも Gemini の回答でも)で、任意のテキストを選択します。 2. **フローティングボタン**:選択したテキストの近くに「引用返信」ボタンが自動的に浮かび上がります。 3. **ワンクリック挿入**:ボタンをクリックすると、選択したテキストが標準的な Markdown 引用形式(`> コンテンツ`)で自動的に入力欄に挿入されます。 ![引用返信](/assets/quote-reply.png) ## 特徴 - **コンテキスト認識**:会話内容をインテリジェントに認識し、無関係な領域(入力欄自体など)での誤作動を防ぎます。 - **標準フォーマット**:一般的な Markdown 構文を使うため、Gemini が引用として正しく解釈しやすくなり、より的確な応答を引き出せます。 - **複数行対応**:複数行のテキストを選択した場合、Voyager は各行に引用記号を自動的に追加し、フォーマットを整えます。 ## 活用テクニック - **詳細を掘り下げる**:Gemini の回答の中で不明確な概念を選択して引用し、「この概念について詳しく説明してください」と入力します。 - **誤りを指摘する**:回答中の誤ったコードや事実を選択し、引用した上で「ここは正しくは...です」と指摘します。 ================================================ FILE: docs/ja/guide/recents-hider.md ================================================ # 最近の項目と Gem を非表示 ::: info **注意**: この機能はバージョン 1.1.9 以降でサポートされています。 ::: Gemini™ ホームページの「最近の保存」セクションを非表示にするエレガントなトグルを追加し、インターフェースをよりすっきりとさせます。サイドバーの **Gems** リストの非表示にも対応しました!

最近の保存を非表示

Gems リストを非表示

## 特徴 - **コンテキストトグル**: 「最近の項目」セクションにマウスを合わせたときだけ、控えめな非表示ボタンが表示されます。 - **ミニマリスト状態**: 非表示にすると、下部の目立たない「ピークバー」に置き換わります。 - **ワンクリック復元**: ピークバーにマウスを合わせてクリックするだけで、すぐに元の表示に戻ります。 - **プライバシー保護**: 公共の場などで、周囲の人に最近のアクティビティを見られるのを防ぎます。 - **永続性**: 設定は保存され、次回の訪問時に自動的に適用されます。 ## 使い方 1. Gemini ホームページの「最近」セクションにマウスを合わせます。 2. 右上に表示される非表示アイコン(斜線の入った目)をクリックして、セクションを折りたたみます。 3. 復元するには、エリアの下部に残っている細い線にマウスを合わせてクリックします。 ================================================ FILE: docs/ja/guide/settings.md ================================================ # 思うがままに デフォルトも優れていますが、私たちは完璧を求めます。 あなたの環境は、あなた好みに整えましょう。 ## シネマモード ドアの隙間から世界を覗く必要はありません。 チャットボックスを広げましょう。 - **ワイドスクリーン**: 1400px。コードを書いたり、大きな表を見たり、視界を全開に。 - **集中モード**: 800px。読書に没頭し、余計なものを排除。 - **フリースタイル**: スライダーをドラッグして、一番心地よい幅を見つけてください。 ## コントロール 拡張機能のアイコンをクリックして、コントロールパネルへ。 - **スクロール**: 自然な滑らかさか、クラシックな感触か? - **配置**: タイムラインは右利き用? 左利き用? 使いやすい場所に。 - **ビジュアルエフェクト**: `雪`、`桜`、`雨` から季節の雰囲気を選べます。 ## カスタム並び替え ポップアップの設定項目が多すぎて、よく使うものが下に埋もれていませんか? 設定カードにマウスを合わせると、右上に ▲/▼ ボタンが表示されます。クリックでカードを上下に移動でき、並び順は自動保存されます。 ## アトモスフィア Voyager は効率化だけでなく、ページの気分を変えることもできます。 - **雪**: やわらかな雪の結晶がゆっくり舞い落ちる、穏やかな冬の雰囲気。 - **桜**: 花びらが自然に舞い散る、軽やかな春の雰囲気。 - **雨**: 斜めの雨筋と微かな水しぶきが映画的な臨場感を演出。 - **スムーズな切り替え**: エフェクトをオフにしたり切り替えたりすると、パーティクルは自然に退場。

設定を開く

Open Settings Guide

視界を調整

Chat Width Adjustment
================================================ FILE: docs/ja/guide/sidebar-auto-hide.md ================================================ # サイドバー自動非表示 もっと没入感のあるチャット体験をしたいですか? **サイドバー自動非表示**機能を提供しています。有効にすると、マウスがサイドバー領域から離れると自動的に折りたたまれ、マウスを戻すと自動的に展開されます。 ### デモ
### 有効にする方法 1. Voyager の設定パネルを開きます。 2. **一般設定**にある**サイドバー自動非表示**のスイッチを見つけます。 3. スイッチをオンにして有効にします。 _注意: この機能は現在 Google Gemini のみをサポートしています。_ ================================================ FILE: docs/ja/guide/sidebar.md ================================================ # サイドバーの幅 フォルダ名が長すぎて表示されませんか? あるいは、サイドバーが広すぎてチャットスペースを圧迫していませんか? サイドバーの幅を自由に調整できるようになりました。 ## 調整方法 1. Voyager の設定パネルを開きます(ブラウザ右上の拡張機能アイコンをクリック)。 設定パネルの開き方 2. **一般設定** にある **サイドバーの幅** オプションを見つけます。 3. スライダーをドラッグして、最適な幅を選択してください。 - **狭い**: スペースを節約し、会話に集中できます。 - **広い**: 長いフォルダ名も一目で確認できます。 ## 対応プラットフォーム この機能は以下に対応しています: - **Google Gemini** - **Google AI Studio** 設定は自動的に保存され、次回ページを開いたときに適用されます。 ================================================ FILE: docs/ja/guide/sponsor.md ================================================ # スポンサー > [!NOTE] > もし Voyager が役に立っているなら、X、YouTube、Reddit などで共有してもらえると嬉しいです。シェアが増えるほど、このプロジェクトをより多くの人に届けられ、Gemini の体験改善にもつながります。ありがとう。 オープンソースプロジェクトの維持は、主に情熱(とコーヒー)で支えられています ☕ **[Voyager](https://github.com/Nagi-ovo/gemini-voyager)** は、Gemini の体験を向上させることを目的とした、完全無料かつオープンソースのブラウザ拡張機能です。もしこの拡張機能があなたの効率アップに役立ったなら、以下の方法で開発とメンテナンスの継続をご支援いただけると幸いです。 --- ## オンラインプラットフォーム Afdian ### 🎙️ おすすめツール: Typeless **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)** は、私が個人的に強く推奨する AI 音声入力ツールです。Voyager の開発において日常のワークフローに組み込むことで、大幅な時間短縮と開発効率の向上を実現できました。 > 🎁 **[私の招待リンクから登録](https://www.typeless.com/?via=gemini-voyager)**(招待コード:_`gemini-voyager`_)すると、**5 ドルの無料クレジット**を獲得できます。同時に、このプロジェクトの継続的な開発を支援することにも繋がります。❤️ --- ## QR コードで支援 🍵
WeChat Pay WeChat Pay
Alipay Alipay
--- ご支援ありがとうございます!あなたの貢献の一つひとつが、私にとって最大の励みです ❤️ ================================================ FILE: docs/ja/guide/tab-title.md ================================================ # タブタイトルの同期 ブラウザのタブタイトルを、現在の Gemini™ の会話タイトルと自動的に同期します。 ## 機能紹介 - **リアルタイム同期**: 会話タイトルが変わると(AI が新しいタイトルを生成したり、手動でリネームした場合など)、タブの表示も「Gemini」だけではなく、すぐに会話タイトルへ更新されます。 - **マルチページ対応**: 通常の会話ページ、Gem 会話、およびマルチアカウント環境を完全にサポートしています。 - **オン/オフ**: 不要な場合は、設定パネルの「一般オプション」からいつでもオフにできます。
Tab Title Sync
## 使い方 1. 拡張機能をインストールすると、この機能はデフォルトでオンになっています。 2. 任意の Gemini 会話を開き、ブラウザのタブタイトルを確認してください。自動的に現在の会話タイトルに変わります。 3. オフにする場合: - 拡張機能アイコンをクリックして設定パネルを開きます。 - 「一般オプション (General Options)」を探します。 - 「タブタイトルの同期 (Update Tab Title)」スイッチをオフにします。 ================================================ FILE: docs/ja/guide/timeline.md ================================================ # 時間旅行 長い会話は迷宮です。上へ下へとスクロールし、方向を見失います。 Voyager は、会話を一筋の「線」に変えます。 ## リズムを見る 画面の右端を見てください。 そこにある点は、一つひとつが発言です。それは、あなたとAIの対話の脈動そのものです。 ## ナビゲーション、一足飛び - **瞬時に移動**:クリックした場所へ、即座に飛びます。もたつきません。 - **のぞき見**:マウスを乗せるだけで、ジャンプせずに中身を確認できます。 - **ブックマーク**:ノードを長押しして **スター** を付けましょう。脳のしおりです。 - **階層化 (実験的)**:ノードを右クリックして、レベル(1-3)を設定したり、子ノードを折りたたんだりできます。深い議論の枝葉を一目で把握できます。 - **ショートカット**:キーボードで高速移動。デフォルトは `j` / `k` ですが、自由に変更可能です。 ![タイムラインナビゲーション](/assets/teaser.png) ## キーボードが生む速度 マウスを使いたくない? キーボードがあります。 **まるで Gemini で Vim モードを使っているかのように。** ### デフォルト・ショートカット - `k` - 前のノードへ移動 - `j` - 次のノードへ移動 ### カスタマイズ 拡張機能の設定を開き、ショートカットの入力欄をクリックして、使いたいキーを押すだけです。 任意のキー、任意の組み合わせで。`n`/`p`? `,`/`.`? お好みでどうぞ。 **流動モード**では、連打するとアニメーションがキューに入って滑らかに再生されます。 **跳躍モード**では、即座に反応し、最高速度で移動します。 ================================================ FILE: docs/ja/index.md ================================================ --- layout: home hero: name: 'Voyager' text: 'ついに、完成。' tagline: '思考を形に、すべてをあるべき場所へ。' image: src: /logo.png alt: Voyager Logo actions: - theme: brand text: ダウンロード link: ./guide/installation - theme: alt text: 旅を始める link: ./guide/getting-started teaser: title: 'インタラクションを再定義する。' description: '私たちは拡張機能を作るのではありません。思考そのものを再構築するのです。
Voyager があれば、人がインターフェースに合わせる必要はありません。インターフェースが、あなたの思考の流れに寄り添うのです。' image: '/assets/teaser.png' features: - title: 'タイムライン' details: '会話の鼓動を見る。
直線的な時間を、触れられる空間へと変える。' - title: 'フォルダ' details: '思考に家を与える。
一瞬の閃きでさえ、丁重に扱われる価値がある。' - title: '主導権' details: 'データはあなたのもの。
クラウドの壁を越え、知識を真にあなたの手に。' features: - icon: 🧭 title: タイムライン details: スクロールは不要、飛ぶだけ。思考の着地点へ、瞬時に到達。 - icon: 🗂️ title: フォルダ details: 混沌に別れを。直感的な操作で、驚くほど整理整頓。 - icon: ✨ title: プロンプトヴォルト details: 閃きを逃さない。珠玉のアイデアを、大切に保管。 - icon: 💬 title: 引用返信 details: テキストを選択してワンクリックで引用。文脈に応じた返信で、効率的なコミュニケーションを。 - icon: ↔️ title: チャット幅 details: 視野を広げよう。チャットの幅を自由に調整して、より良い閲覧体験を。 - icon: 💾 title: 会話のエクスポート details: データは、あなたのもの。多様な形式でアーカイブし、知識を永続化。 - icon: 🌦️ title: ビジュアルエフェクト details: 雰囲気を演出。ポップアップから雪、雨、桜の花びらエフェクトを切り替えられます。 - icon: 🍌 title: NanoBanana 透かし除去 details: 生成された瞬間を、純粋なままに。ノイズのない美しさを。 - icon: 📐 title: 数式コピー details: LaTeX および MathML (Word) のソースコードを一クリックでコピー。 - icon: 🧜‍♀️ title: Mermaid details: コードを視覚化。フローチャート、シーケンス図、ガントチャートを瞬時にレンダリング。 - icon: 🏷️ title: タブタイトルの同期 details: 一目で分かる。タブのタイトルが、会話の内容に自動で変化。 - icon: 🔀 title: 会話の分岐 (実験的) details: 拡散的思考。任意のノードで会話を分岐させ、異なる可能性を探究。 - icon: 🗑️ title: 一括削除 details: 整理も一瞬。複数の会話を選んで、まとめて消去。 - icon: ☁️ title: クラウド同期 details: いつでも同期。フォルダとプロンプトを Google ドライブにバックアップ。 - icon: ⚡️ title: デフォルトモデル details: 繰り返し作業は不要です。新しいチャットでお気に入りのモデルに自動切り替え。 - icon: 🔬 title: Deep Research details: 思考を解き明かす。Deep Research の研究過程とリンクを抽出。 ---
⚠️ 名称変更のお知らせ:商標・著作権上の問題により、本拡張機能は正式に Voyager へ改名されました。ただし、Chrome ウェブストアの審査が非常に遅いため、7 日以内に名称変更が承認されず、現在 Chrome Web Store では一時的にご利用いただけない状態です。

すべてのダウンロードは、信頼の証

Chrome ウェブストアと GitHub からのリアルタイムデータ。共に歩んでくれるすべての Voyager に敬意を表します。

GitHub Star GitHub Fork 最新バージョン GitHub ダウンロード数 Chrome ストア ユーザー数 Chrome ストア 評価 Edge ストア Firefox ストア ユーザー数 Firefox ストア 評価
Nagi-ovo%2Fgemini-voyager | Trendshift

特別謝辞

✨ Product Hunt にて公開中!ご意見やフィードバックをお待ちしております。❤️

Voyager on Product Hunt

「それは単なるツールではありません。思考の航海における、頼れるパートナーです。」

探索する →

================================================ FILE: docs/ja/privacy.md ================================================ # プライバシーポリシー 最終更新日:2026年3月16日 ## はじめに Voyager(以下「本拡張機能」)は、お客様のプライバシー保護に努めています。本プライバシーポリシーでは、本ブラウザ拡張機能がどのように情報を収集・利用・保護するかについて説明します。 ## データの収集と使用 **本拡張機能では個人情報を一切収集しません。** Voyager は、完全にお客様のブラウザ内でローカルに動作します。拡張機能が生成・管理するすべてのデータ(フォルダ、プロンプトテンプレート、スター付きメッセージ、設定など)は、以下の場所に保存されます: 1. お客様のローカルデバイス(`chrome.storage.local`) 2. ブラウザの同期ストレージ(`chrome.storage.sync`、利用可能な場合)。これにより、デバイス間で設定が同期されます。 開発者は、お客様の個人データ、チャット履歴、その他のプライバシー情報には一切アクセスできません。また、閲覧履歴を追跡することもありません。 ## Google ドライブ同期(オプション) Google ドライブ同期機能を明示的に有効にした場合、拡張機能は Chrome Identity API を使用して OAuth2 トークン(`drive.file` スコープのみ)を取得し、フォルダとプロンプトを**お客様自身の Google ドライブ**にバックアップします。この転送はお客様のブラウザと Google のサーバー間で直接行われます。開発者がこのデータにアクセスすることはなく、開発者が運営するサーバーに送信されることもありません。 ## 権限について 本拡張機能は、機能維持に必要な最小限の権限のみを申請します: - **Storage(ストレージ)**:設定、フォルダ、プロンプト、スター付きメッセージ、UI カスタマイズオプションをローカルおよびデバイス間で保存するために使用します。 - **Identity(認証)**:オプションの Google ドライブ同期機能の Google 認証に使用します。クラウド同期を明示的に有効にした場合のみ使用されます。 - **Scripting(スクリプト注入)**:Gemini ページおよびユーザーが指定したカスタムウェブサイトにコンテンツスクリプトを動態的に注入するために使用します(プロンプトマネージャー機能)。拡張機能自身にバンドルされたスクリプトのみが注入され、リモートコードの取得や実行は行いません。 - **Host Permissions(ホスト権限)**(gemini.google.com、aistudio.google.com など):Gemini UI を拡張するコンテンツスクリプトを注入するために使用します(フォルダ、エクスポート、タイムライン、引用返信など)。Google 関連ドメイン(googleapis.com、accounts.google.com)は Google ドライブ同期の認証に必要です。 - **Optional Host Permissions(オプションのホスト権限)**(すべての URL):プロンプトマネージャーのカスタムウェブサイトを明示的に追加した場合のみ、ランタイムでリクエストされます。ユーザーの操作なしに有効化されることはありません。 ## 第三者サービス 本拡張機能が、第三者サービス、広告主、または分析プロバイダーとデータを共有することは一切ありません。 ## ポリシーの変更 プライバシーポリシーは随時更新される可能性があります。変更があった場合は、このページに新しいプライバシーポリシーを掲載することで通知します。 ## お問い合わせ 本プライバシーポリシーについてご質問がある場合は、[GitHub リポジトリ](https://github.com/Nagi-ovo/gemini-voyager) を通じてお問い合わせください。 ================================================ FILE: docs/ko/guide/batch-delete.md ================================================ # 일괄 삭제 여러 대화를 한 번에 삭제하세요. 이제 더 이상 하나씩 삭제할 필요가 없습니다. ## 주요 기능 - **다중 선택 모드**: 대화를 길게 눌러 다중 선택 모드로 진입하고 삭제할 대화들을 여러 개 체크할 수 있습니다. - **클릭 한 번으로 정리**: 선택이 완료되면 삭제 버튼을 클릭하여 선택한 모든 대화를 한 번에 제거합니다. - **진행 상황 피드백**: 삭제 중에 실시간 진행 상황이 표시되어 현재 상태를 알 수 있습니다. - **안전한 확인**: 실수로 인한 작업을 방지하기 위해 삭제 전 확인 대화창이 나타납니다.
일괄 삭제
## 사용 방법 1. 사이드바 대화 목록에서 아무 대화 항목이나 **길게 누릅니다**. 2. 다중 선택 모드로 진입하면 각 대화의 왼쪽에 체크박스가 나타납니다. 3. 삭제하려는 대화들을 체크합니다 (한 번에 최대 50개까지 가능). 4. 나타나는 **삭제 버튼**을 클릭합니다. 5. **폴더 목록 상단**에 나타나는 빨간색 확인 영역에서 "확인"을 클릭하여 삭제를 시작합니다. ::: tip 참고 확인 패널은 대화 목록을 가리지 않기 위해 폴더 영역 위에 겹쳐서 표시됩니다. 일괄 삭제 작업은 취소할 수 없으므로 주의해서 진행해 주세요. ::: ================================================ FILE: docs/ko/guide/cloud-sync.md ================================================ # 클라우드 동기화 폴더, 프롬프트 라이브러리 및 기타 데이터를 Google Drive에 동기화하여 여러 기기에서 일관된 환경을 유지하세요. ## 주요 기능 - **다중 기기 동기화**: Google Drive를 사용하여 여러 컴퓨터 간에 설정을 동기화 상태로 유지합니다. - **데이터 프라이버시**: 데이터가 본인의 Google Drive 저장소에 직접 저장되므로 제3자 서버 없이 프라이버시가 보장됩니다. - **유연한 동기화**: 수동 업로드 및 데이터 다운로드/병합을 지원합니다. ::: info **출시 예정**: 다음 버전에서는 별표 표시된 대화 동기화가 지원될 예정입니다. ::: ## 사용 방법 1. Gemini™ 페이지 우측 하단의 확장 프로그램 아이콘을 클릭하여 설정 패널을 엽니다. 2. **클라우드 동기화 (Cloud Sync)** 섹션을 찾습니다. 3. **Google 계정으로 로그인 (Sign in with Google)**을 클릭하고 권한 승인을 완료합니다. 4. 승인이 완료되면 **클라우드에 업로드 (Upload to Cloud)**를 클릭하여 로컬 데이터를 클라우드로 동기화하거나, **다운로드 및 병합 (Download & Merge)**을 클릭하여 클라우드 데이터를 로컬로 가져옵니다. ### 💡 빠른 동기화 가장 쉬운 방법은 왼쪽 사이드바의 폴더 영역 상단에 있는 **"클라우드에 업로드"** 또는 **"다운로드 및 병합"** 버튼을 클릭하는 것입니다. 클라우드 동기화 빠른 버튼 ::: warning **보안 권장 사항: 이중 보호** 클라우드 동기화는 매우 편리하지만, 정기적으로 **로컬 파일**을 사용하여 핵심 데이터를 백업하는 것을 강력히 권장합니다. 1. **전체 내보내기**: 설정 패널 하단의 "백업 및 복원 (Backup & Restore)"에서 모든 설정, 폴더, 프롬프트가 포함된 전체 패키지를 내보냅니다. 전체 내보내기 2. **모든 폴더 내보내기**: 설정 패널의 "폴더 (Folders)" 섹션에서 "내보내기 (Export)"를 클릭하여 프롬프트를 제외한 모든 폴더와 대화를 백업합니다. 모든 폴더 내보내기 ::: ================================================ FILE: docs/ko/guide/community.md ================================================ # 커뮤니티 및 피드백 우리는 모든 사용자의 목소리를 소중하게 생각합니다. 버그를 발견했거나, 기능 제안이 있거나, 자신의 프롬프트 저장소를 공유하고 싶다면 여러 가지 방법을 통해 소통할 수 있습니다. ## 📢 업데이트 팔로우 X (Twitter)에서 우리를 팔로우하고 최신 개발 소식을 받아보세요. - **새로운 릴리스**: 업데이트 소식을 가장 먼저 확인하세요. - **기능 미리 보기**: 출시 예정인 기능을 미리 확인해 보세요. ## 💬 Discord 커뮤니티 Discord 서버에 가입하여 다른 Voyager들과 대화해 보세요! - **실시간 채팅**: 다른 사용자 및 개발자와 직접 소통하세요. - **프롬프트 공유**: 다른 사람들이 Gemini™를 어떻게 사용하는지 확인하고 자신의 최고의 프롬프트를 공유하세요. - **개발 업데이트**: 예정된 기능과 릴리스에 대한 최신 소식을 받으세요. ## 🐙 GitHub 이슈 버그를 발견했거나 구체적인 기능 제안이 있다면 GitHub에서 이슈를 열어주세요: - [버그 보고하기](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=bug_report.yml) - [기능 제안하기](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=feature_request.yml) Voyager를 응원해 주셔서 감사합니다! ❤️ ================================================ FILE: docs/ko/guide/context-sync.md ================================================ # 기억 운반: 컨텍스트 동기화 (실험적) **다른 차원, 부드러운 공유** 웹에서 로직을 추론하고, IDE에서 코드를 구현하세요. Voyager는 차원의 벽을 허물어 IDE가 웹의 "사고 과정"을 즉시 공유받을 수 있게 합니다. ## 반복되는 화면 전환과 작별하세요 개발자들이 가장 번거로워하는 일: 웹에서 해결책을 충분히 논의한 후 VS Code/Trae/Cursor로 돌아왔을 때, 마치 처음 보는 사람처럼 요구 사항을 다시 설명해야 하는 상황입니다. 할당량과 응답 속도 때문에 웹은 "두뇌", IDE는 "손"이 됩니다. Voyager는 그들이 하나의 영혼을 공유하게 합니다. ## 아주 간단한 3단계, 같은 호흡으로 1. **CoBridge 설치 및 실행**: **CoBridge** 플러그인을 설치하세요. 웹 인터페이스와 로컬 IDE를 연결하는 핵심 브리지 역할을 합니다. - **[마켓플레이스에서 설치](https://open-vsx.org/extension/windfall/co-bridge)** ![CoBridge 확장 프로그램](/assets/CoBridge-extension.png) 설치 후 **임의의 작업 디렉토리를 열고**, 오른쪽 아이콘을 클릭하여 서버를 시작합니다. ![CoBridge 서버 시작](/assets/CoBridge-on.png) 2. **연결 확인 (Handshake)**: - Voyager 설정에서 "컨텍스트 동기화"를 활성화합니다. - 포트 번호를 맞춥니다. "IDE Online"이 표시되면 연결된 것입니다. ![컨텍스트 동기화 패널](/assets/context-sync-console.png) 3. **클릭 한 번으로 동기화**: **"Sync to IDE"**를 클릭합니다. 복잡한 **데이터 테이블**부터 직관적인 **참조 이미지**까지 모두 즉시 IDE로 전송됩니다. ![동기화 완료](/assets/sync-done.png) ## IDE에 뿌리 내리기 동기화가 완료되면 IDE 작업 디렉토리에 `.cobridge/AI_CONTEXT.md` 파일이 생성됩니다. Trae, Cursor, Copilot 중 무엇을 사용하든 각각의 Rule 파일을 통해 이 "기억"을 자동으로 읽어옵니다. ``` your-project/ ├── .cobridge/ │ ├── images/ │ │ ├── context_img_1_1.png │ │ └── context_img_1_2.png │ └── AI_CONTEXT.md ├── .github/ │ └── copilot-instructions.md ├── .gitignore ├── .traerules └── .cursorrules ``` ## 그것의 원칙 - **오염 제로**: CoBridge는 자동으로 `.gitignore`를 처리하여 개인적인 대화가 Git 저장소에 푸시되지 않도록 보장합니다. - **산업 표준 호환**: 전체 Markdown 형식을 사용하여 IDE의 AI가 마치 제품 설명서를 읽는 것처럼 부드럽게 내용을 파악할 수 있습니다. - **전문가 팁**: 대화가 오래전 내용이라면 [타임라인]을 사용하여 위로 스크롤해 웹이 컨텍스트를 "기억"하게 한 뒤 동기화하는 것이 더 효과적입니다. --- ## 지금 바로 시작하세요 **생각은 이미 클라우드에서 준비되었습니다. 이제 로컬에 뿌리를 내리게 하세요.** - **[CoBridge 확장 프로그램 설치](https://open-vsx.org/extension/windfall/co-bridge)**: 당신의 차원 관문을 찾아 클릭 한 번으로 "동기화된 호흡"을 경험하세요. - **[GitHub 저장소 방문](https://github.com/Winddfall/CoBridge)**: CoBridge의 기저 로직을 깊이 탐구하거나 이 "영혼 동기화" 프로젝트에 Star를 눌러주세요. > **거대 모델은 이제 더 이상 기억을 잃지 않으며, 즉시 실전에 투입 가능합니다.** ================================================ FILE: docs/ko/guide/deep-research.md ================================================ # Deep Research 내보내기 Deep Research에서 생성된 최종 보고서를 내보내거나, 전체 "생각(Thinking)" 과정을 Markdown 파일로 저장할 수 있습니다. ## 1. 보고서 내보내기 (PDF / 이미지) Deep Research에서 생성된 보고서는 스타일리시한 PDF 또는 공유용 단일 이미지로 내보낼 수 있습니다 (Markdown 및 JSON 형식도 지원됩니다). ![보고서 내보내기](/assets/deep-research-report-export.png) ## 2. 생각 과정 내보내기 (Markdown) 최종 보고서 외에도 Deep Research 대화의 전체 "생각" 내용을 한 번의 클릭으로 내보낼 수 있습니다. ### 주요 기능 - **클릭 한 번으로 내보내기**: 공유 및 내보내기 버튼을 클릭하면 다운로드 버튼이 나타납니다. - **구조화된 형식**: 생각 단계, 생각 항목, 조사한 웹사이트를 원래 순서대로 보존합니다. - **다국어 헤더**: Markdown 파일에는 영어와 현재 언어의 섹션 헤더가 모두 포함됩니다. - **자동 명명**: 파일은 정리가 용이하도록 타임스탬프와 함께 저장됩니다 (예: `deep-research-thinking-20240128-153045.md`). ### 사용 방법 1. Gemini™에서 Deep Research 대화를 엽니다. 2. 대화에서 **공유 및 내보내기** 버튼을 클릭합니다. 3. "생각 내용 다운로드 (下载 Thinking 内容)"를 선택합니다. 4. Markdown 파일이 자동으로 다운로드됩니다. ![Deep Research 생각 과정 내보내기](/assets/deepresearch_download_thinking.png) ### 내보낸 파일 형식 내보낸 Markdown 파일에는 다음이 포함됩니다: - **제목**: 대화 제목 - **메타데이터**: 내보낸 시간 및 총 생각 단계 수 - **생각 단계**: 각 단계는 다음을 포함합니다: - 생각 항목 (제목 및 내용) - 조사한 웹사이트 (링크 및 제목) #### 예시 구조 ```markdown # Deep Research 대화 제목 **导出时间 / Exported At:** 2025-12-28 17:25:35 **总思考阶段 / Total Phases:** 3 --- ## 思考阶段 1 / Thinking Phase 1 ### 생각 제목 1 생각 내용... ### 생각 제목 2 생각 내용... #### 研究网站 / Researched Websites - [domain.com](https://example.com) - 페이지 제목 - [another.com](https://another.com) - 다른 제목 --- ## 思考阶段 2 / Thinking Phase 2 ... ``` ## 프라이버시 모든 추출 및 형식 지정은 브라우저에서 100% 로컬로 이루어집니다. 외부 서버로 어떠한 데이터도 전송되지 않습니다. ================================================ FILE: docs/ko/guide/default-model.md ================================================ # 기본 모델 ::: info **참고**: 이 기능은 버전 1.1.9 이상에서 지원됩니다. ::: 새 대화를 시작할 때마다 모델을 수동으로 변경할 필요 없도록, 선호하는 Gemini™ 모델을 기본값으로 설정하세요.
## 주요 기능 - **대화형 설정**: Gemini의 기본 모델 선택 메뉴에 직접 "별표" 버튼을 추가합니다. - **자동 전환**: 새 대화를 시작할 때마다 선호하는 모델로 자동으로 전환합니다. - **영구적인 기본 설정**: 선택한 설정은 저장되어 기기 간에 동기화됩니다. - **SPA 최적화**: "새 채팅" 버튼을 클릭하거나, 단축키를 사용하거나, 홈 페이지로 돌아갈 때 정확하게 작동합니다. ## 사용 방법 1. Gemini 입력창 위의 **모델 선택기**를 클릭합니다. 2. 선호하는 모델 위에 마우스를 올리고 **별표 아이콘**을 클릭합니다. 3. 별표가 **채워지면** 해당 모델이 기본 모델로 설정된 것입니다. 4. 이제 확장 프로그램이 모든 새 채팅에 대해 이 모델을 자동으로 선택합니다. 5. 설정을 해제하려면 채워진 별표 아이콘을 다시 클릭하면 됩니다. ================================================ FILE: docs/ko/guide/export.md ================================================ # 완전한 자유 데이터에 갇히는 것은 적입니다. 우리는 당신이 만든 것이라면 당신이 소유해야 한다고 믿습니다. ## 모든 것을 내보내기 Voyager를 사용하면 데이터를 클라우드에서 꺼내어 당신의 손안으로 가져올 수 있습니다. ### 형식 - **Markdown**: Obsidian 저장소나 Notion을 위한 형식입니다. 깨끗하고 서식이 있는 텍스트입니다. (Safari 사용자 주의: 브라우저 제한으로 인해 이미지를 추출할 수 없습니다. PDF 내보내기를 권장합니다.) - **PDF**: 공유나 인쇄를 위한 형식입니다. 이미지가 포함된 아름다운 레이아웃을 제공합니다. - **JSON**: 원시 데이터입니다. 자신의 기록을 바탕으로 무언가를 구축하려는 개발자를 위한 형식입니다. ### 내보내는 방법 1. Gemini 로고 위에 마우스를 올리면 **내보내기 아이콘**이 나타납니다. 2. 형식을 선택하세요. 3. 끝입니다. 이것은 당신의 데이터입니다. 원하는 대로 사용하세요.

1단계: 로고 호버

내보내기 가이드 1단계

2단계: 선택

내보내기 가이드 2단계
### Safari PDF 내보내기 참고 사항 Safari에서 PDF를 내보내는 과정은 조금 다릅니다(수동 인쇄 필요): 1. **내보내기(Export)** 버튼을 클릭하고 PDF 형식을 선택합니다. 2. **1초 정도 기다립니다** (페이지가 인쇄 스타일을 준비할 시간을 줍니다). 3. `Command + P`를 눌러 인쇄 대화상자를 엽니다. 4. 인쇄 대화상자에서 **"Save to PDF"**(또는 "PDF로 저장")를 선택합니다. Safari Export PDF ================================================ FILE: docs/ko/guide/folders.md ================================================ # 제대로 된 폴더 관리 AI 채팅을 정리하는 것이 왜 그렇게 힘들까요? 우리가 해결했습니다. 당신의 생각을 위한 파일 시스템을 구축했습니다.

Gemini™

Gemini 폴더

AI Studio

AI Studio 폴더
## 정리의 물리학 단순히 직관적입니다. - **드래그 앤 드롭**: 대화를 선택하세요. 폴더에 넣으세요. 직접 만지는 듯한 느낌을 줍니다. - **계층 구조**: 프로젝트에는 하위 프로젝트가 있습니다. 폴더 안에 폴더를 만드세요. _당신만의_ 방식으로 구조화하세요. - **폴더 간격**: 사이드바 밀도를 자유롭게 조정할 수 있습니다. > _참고: Mac Safari에서는 조정 사항이 실시간으로 반영되지 않을 수 있습니다. 페이지를 새로고침하면 적용됩니다._ - **즉시 동기화**: 데스크탑에서 정리하세요. 노트북에서도 그대로 확인할 수 있습니다. ## 전문가 팁 - **다중 선택**: 대화를 길게 눌러 다중 선택 모드로 진입한 다음, 여러 채팅을 선택하여 한 번에 이동할 수 있습니다. - **이름 바꾸기**: 폴더를 더블 클릭하여 이름을 바꿉니다. - **아이콘**: Gem의 유형(코딩, 창의적 등)을 자동으로 감지하여 적절한 아이콘을 할당합니다. 당신은 아무것도 할 필요가 없습니다. ## 플랫폼별 기능 차이 ### 공통 기능 - **기본 관리**: 드래그 앤 드롭, 이름 바꾸기, 다중 선택. - **스마트 인식**: 대화 유형을 자동으로 감지하여 적절한 아이콘 할당. - **계층 구조**: 폴더 중첩(중첩 계층) 지원. - **AI Studio 지원**: 위의 고급 기능들은 곧 AI Studio에서도 지원될 예정입니다. - **Google Drive 동기화**: 폴더 구조를 Google Drive와 동기화. ### Gemini 전용 기능 #### 색상 맞춤 설정 폴더 아이콘을 클릭하여 색상을 맞춤 설정하세요. 7가지 기본 색상 중에서 선택하거나 색상 피커를 사용하여 원하는 색상을 선택할 수 있습니다. 폴더 색상 #### 계정 분리 헤더의 "사람" 아이콘을 클릭하면 다른 Google 계정의 채팅을 즉시 필터링할 수 있습니다. 여러 계정을 사용할 때 작업 공간을 깨끗하게 유지하세요. 계정 분리 #### AI 자동 정리 채팅이 너무 많고, 정리하기 귀찮다고요? Gemini한테 맡기세요. 원클릭으로 현재 대화 구조를 복사하고, Gemini에 붙여넣으면 바로 가져올 수 있는 폴더 계획을 생성해 줍니다 — 순식간에 정리 완료. **1단계: 대화 구조 복사** 확장 프로그램 팝업의 폴더 섹션 하단에서 **AI 정리** 버튼을 클릭하세요. 미분류 대화와 기존 폴더 구조를 자동으로 수집하고, 프롬프트를 생성하여 클립보드에 복사합니다. AI Organize Button **2단계: Gemini가 분류하게 하기** 클립보드 내용을 Gemini 대화에 붙여넣으세요. 채팅 제목을 분석한 뒤 JSON 폴더 계획을 출력해 줍니다. **3단계: 결과 가져오기** 폴더 패널 메뉴에서 **폴더 가져오기**를 클릭하고, **또는 JSON 직접 붙여넣기**를 선택한 다음, Gemini가 반환한 JSON을 붙여넣고 **가져오기**를 클릭하세요.
Import Menu
Paste JSON Import
- **증분 병합**: 기본적으로 "병합" 전략을 사용합니다 — 새 폴더와 할당만 추가하며, 기존 정리를 절대 파괴하지 않습니다. - **다국어 지원**: 프롬프트는 설정된 언어를 자동으로 사용하고, 폴더 이름도 해당 언어로 생성됩니다. ### AI Studio 전용 기능 - **사이드바 너비 조절**: 사이드바 가장자리를 드래그하여 자유롭게 조절. - **라이브러리 드래그 지원**: Library 목록에서 폴더로 직접 드래그 앤 드롭 내보내기. ================================================ FILE: docs/ko/guide/fork.md ================================================ # 대화 분기 (실험적) 생각은 일방통행이 되어서는 안 됩니다. 복잡한 탐색에서는 종종 중요한 노드로 돌아가 다른 가능성을 시도해야 할 때가 있습니다. Voyager의 **대화 분기** 기능을 사용하면 생각을 발산하고 대화의 평행 우주를 자유롭게 탐색할 수 있습니다. ## 기능 소개 > **⚠️ 참고**: 이 기능은 현재 실험적 기능입니다. 먼저 브라우저 툴바의 확장 프로그램 아이콘을 클릭하여 설정 팝업을 열고 **"대화 분기 활성화"** 스위치를 켜야 합니다. 다른 방향으로 나아가고 싶을 때는 언제든지 질문 위에 마우스를 올리고 **분기** 버튼을 클릭하세요: ![대화 분기](/assets/branching.png) Voyager는 처음부터 해당 지점까지의 모든 컨텍스트를 즉시 캡처하여 **완전히 새로운 대화를 시작**합니다. 이 새로운 분기에서는 원래의 대화 기록을 훼손할 걱정 없이 질문을 자유롭게 수정하고 다양한 방향을 탐색할 수 있습니다. 당신의 창의력과 호기심을 마음껏 펼치세요! ================================================ FILE: docs/ko/guide/formula-copy.md ================================================ # 수식 복사 Voyager를 사용하면 수학 공식과 과학 기호를 손쉽게 재사용할 수 있습니다. LaTeX 소스 코드와 Microsoft Word 호환 MathML 형식을 클릭 한 번으로 복사할 수 있도록 지원합니다. ## 소개 Gemini에게 공식을 유도하거나 수학적 표현을 작성하도록 요청하면 보통 LaTeX를 사용하여 렌더링합니다. 보기에 아름답지만, 자신의 논문, 문서 또는 에디터에서 사용하기 위해 소스 코드를 추출하는 것은 종종 번거로운 수작업을 필요로 합니다. Voyager는 이를 위한 원활한 지원을 제공합니다: 1. **자동 감지**: Voyager는 페이지에 렌더링된 LaTeX 수식을 자동으로 식별합니다. 2. **복사 버튼**: 수식 위에 마우스를 올리면 오른쪽에 복사 아이콘이 나타납니다. 3. **형식 옵션**: 아이콘을 클릭하여 다음을 선택할 수 있습니다: - **LaTeX 복사**: Overleaf, Markdown 에디터 등에 적합한 표준 LaTeX 소스를 복사합니다. - **MathML 복사**: **Microsoft Word**에 직접 붙여넣기에 가장 적합한 형식인 MathML 소스를 복사합니다. ![수식 복사](/assets/gemini-math-copy.png) ## 주요 기능 - **Word 호환성**: MathML 지원을 통해 AI가 생성한 복잡한 공식을 편집 가능한 완벽한 서식을 유지하면서 Word 문서에 직접 붙여넣을 수 있습니다. - **문맥 보존**: 수식 자체뿐만 아니라 수학적 문맥도 보존하여 복사합니다. - **즉각적인 응답**: 모든 처리가 로컬에서 이루어지므로 결과가 즉시 나타납니다. ## 사용 팁 - **학술 글쓰기**: Word에서 논문을 작성할 때 Gemini에게 공식을 유도하게 한 후, MathML 복사-붙여넣기를 사용하여 Word 수식 에디터에서 수동으로 입력하는 번거로움을 피하세요. - **노트 필기**: Obsidian이나 Notion에서 노트를 필기할 때 LaTeX 소스를 직접 복사하여 사용하세요. ================================================ FILE: docs/ko/guide/getting-started.md ================================================ # 환영합니다 축하합니다. 당신의 지능을 업그레이드하셨습니다. Voyager는 단순한 유틸리티가 아니라 워크플로우입니다. 처음 5분 동안 이를 최대한 활용하는 방법을 소개합니다. ## 1. 설정 아직 설치하지 않으셨다면 [설치 가이드](/ko/guide/installation)를 확인하세요. 설치가 완료되면 Gemini 탭을 새로고침하세요. 즉시 차이점을 느끼실 수 있습니다. ## 2. 타임라인 대화를 시작해 보세요. 아주 긴 대화도 좋습니다. 타이포그래피의 역사나 블랙홀의 물리학에 대해 물어보세요. 오른쪽을 보세요. **점들로 이루어진 띠가 보이시나요? 그것이 당신의 지도입니다.** - **마우스를 올리면** 무엇을 말했는지 미리 볼 수 있습니다. - **클릭하면** 해당 지점으로 순간 이동합니다. - **길게 누르면** 간직하고 싶은 순간에 별표를 표시할 수 있습니다. 이제 끝없는 스크롤은 필요 없습니다. 당신은 이제 생각의 속도로 탐색하고 있습니다. ## 3. 정리 왼쪽의 대화 목록을 보세요. 새로운 것이 보이시나요? **폴더입니다.** 대화 하나를 선택하세요. 드래그하세요. 폴더에 넣으세요. 자연스럽지 않나요? 그것이 바로 이 기능의 본질입니다. 폴더를 중첩하거나 이름을 바꾸어 머릿속의 어수선함을 정리할 수 있습니다. ## 4. 저장소 (Vault) 방금 완벽한 프롬프트를 작성하셨나요? 그것이 허공으로 사라지게 두지 마세요. 입력창 근처의 **반짝이는 아이콘**(✨)을 클릭하세요. 저장하고 태그를 다세요. 다음 번에는요? 아이콘을 클릭하여 찾아서 삽입하기만 하면 됩니다. 당신은 이제 단순히 채팅을 하는 것이 아닙니다. 당신만의 천재성이 담긴 저장소를 구축하고 있습니다. --- **준비가 되었습니다.** 자세한 내용을 보려면 특정 가이드를 살펴보세요: - [타임라인 마스터하기](/ko/guide/timeline) - [폴더 관리](/ko/guide/folders) - [프롬프트 엔지니어링](/ko/guide/prompts) - [데이터 내보내기](/ko/guide/export) ================================================ FILE: docs/ko/guide/input-collapse.md ================================================ # 입력창 접기 입력창이 비어 있을 때 이를 접어서 더 많은 읽기 공간을 확보하세요. 접힌 바를 클릭하면 다시 펼쳐져서 타이핑을 시작할 수 있습니다.
입력창 접기
## 사용 방법 1. 입력창이 비어 있고 포커스를 잃으면, 자동으로 콤팩트한 알약 모양의 버튼으로 접힙니다. 2. 알약 버튼을 클릭하면 입력창이 펼쳐지며 타이핑을 시작할 수 있습니다. 3. Ctrl/+I 를 눌러 빠르게 입력창을 펼칠 수도 있습니다. 4. 설정 패널에서 이 기능을 켜거나 끌 수 있습니다 (기본적으로 비활성화되어 있습니다). ================================================ FILE: docs/ko/guide/installation.md ================================================ # 설치 ::: info 뉴스 🍎 **Safari 네이티브 확장 프로그램이 출시되었습니다!** 완전 무료로 제공되며 클릭 한 번으로 설치할 수 있습니다. ::: 원하는 설치 방법을 선택하세요. > ⚠️ 참고: 프롬프트 관리자는 Gemini™ Enterprise를 지원하는 유일한 기능입니다. ## 1. 확장 프로그램 스토어 (권장) 가장 간단한 시작 방법입니다. 업데이트가 자동으로 이루어집니다. **Chrome / Brave / Opera / Vivaldi:** [Chrome 웹 스토어에서 설치](https://chromewebstore.google.com/detail/kjdpnimcnfinmilocccippmododhceol?utm_source=github&utm_medium=docs&utm_campaign=organic_growth&utm_content=ko) ::: warning ⚠️ Chrome Web Store 일시적으로 이용 불가 상표 문제로 인해 이 확장 프로그램이 **Voyager**로 공식 개명되었습니다. Chrome Web Store 심사가 진행 중입니다. 자세한 내용은 [이 게시물](https://x.com/Nag1ovo/status/2031561180213313944)을 확인하세요. 당분간 **Edge / Firefox** 또는 **수동 설치**를 이용해 주세요. ::: **Microsoft Edge:** [Microsoft Edge 추가 기능에서 설치](https://microsoftedge.microsoft.com/addons/detail/gemini-voyager/gibmkggjijalcjinbdhcpklodjkhhlne) **Firefox:** [Firefox 추가 기능에서 설치](https://addons.mozilla.org/firefox/addon/gemini-voyager/) ## 2. 수동 설치 (최신 기능) 웹 스토어의 심사 과정은 다소 느릴 수 있습니다. 최신 기능을 즉시 사용하고 싶다면 수동으로 설치하세요. **Chrome / Edge / Brave / Opera의 경우:** 1. [GitHub Releases](https://github.com/Nagi-ovo/gemini-voyager/releases)에서 최신 `gemini-voyager-chrome-vX.Y.Z.zip`을 다운로드합니다. 2. 파일의 압축을 풉니다. 3. 브라우저의 확장 프로그램 페이지(`chrome://extensions`)를 엽니다. 4. 우측 상단의 **개발자 모드**를 활성화합니다. 5. **압축해제된 확장 프로그램을 로드합니다** 버튼을 클릭하고 압축을 푼 폴더를 선택합니다. **Firefox의 경우:** 1. [Releases](https://github.com/Nagi-ovo/gemini-voyager/releases)에서 최신 `gemini-voyager-firefox-vX.Y.Z.xpi`를 다운로드합니다. 2. 부가 기능 관리자(`about:addons`)를 엽니다. 3. `.xpi` 파일을 드래그 앤 드롭하여 설치합니다 (또는 톱니바퀴 아이콘 ⚙️ -> **파일에서 부가 기능 설치** 클릭). > 💡 XPI 파일은 Mozilla에 의해 공식적으로 서명되었으며 모든 Firefox 버전에서 영구적으로 설치할 수 있습니다. ## 3. Safari (macOS) Safari가 이제 직접 배포를 지원합니다! 사전 서명된 앱을 다운로드하세요: 1. 최신 Safari 버전 (.dmg)을 다운로드합니다. 2. 파일을 더블 클릭하여 안내에 따라 설치합니다. 3. 더블 클릭하여 앱을 실행합니다. 4. **Safari 설정 > 확장 프로그램**에서 활성화합니다. > 💡 Safari 빌드가 직접 서명 배포를 지원합니다 — Xcode 변환이 필요 없습니다! > > ⚠️ **제한 사항**: Safari의 특성상 (a) 워터마크 제거 (b) 이미지 내보내기(PDF 권장)는 지원되지 않습니다. --- _개발 설정이 궁금하신가요? 기여를 원하는 개발자라면 [기여 가이드](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/CONTRIBUTING.md)를 확인해 보세요._ ================================================ FILE: docs/ko/guide/markdown-fix.md ================================================ # Markdown 렌더링 수정 Gemini™ 웹 인터페이스는 때때로 텍스트 내에 HTML 요소(인용 출처나 하이라이트 표시 등)를 삽입하는데, 이로 인해 Markdown의 굵게 표시 문법(`**텍스트**`)이 깨져서 텍스트가 정상적으로 굵게 렌더링되지 않는 경우가 발생합니다. Voyager에는 이러한 깨진 굵게 표시 태그를 지능적으로 식별하고 복구하는 자동 수정 기능이 내장되어 있어, 문서가 깔끔하고 정확하게 렌더링되도록 보장합니다. > [!INFO] > 이 기능은 자동으로 활성화되며 추가 설정이 필요하지 않습니다. ================================================ FILE: docs/ko/guide/mermaid.md ================================================ # Mermaid 다이어그램 렌더링 Mermaid 코드를 시각적 다이어그램으로 자동으로 렌더링합니다. ## 개요 Gemini™가 Mermaid 코드 블록(플로우차트, 시퀀스 다이어그램, 간트 차트 등)을 출력하면, Voyager는 이를 자동으로 감지하여 대화형 다이어그램으로 렌더링합니다. ### 주요 기능 - **자동 감지**: `graph`, `flowchart`, `sequenceDiagram`, `gantt`, `pie`, `classDiagram` 및 모든 주요 Mermaid 다이어그램 유형을 지원합니다. - **보기 전환**: 클릭 한 번으로 렌더링된 다이어그램과 소스 코드 간을 전환할 수 있습니다. - **전체 화면 모드**: 다이어그램을 클릭하여 확대/축소 및 이동이 가능한 전체 화면 모드로 진입합니다. - **다크 모드**: 페이지 테마에 따라 자동으로 적응합니다. ## 사용 방법 1. Gemini에게 Mermaid 다이어그램 코드를 생성하도록 요청합니다. 2. 코드 블록이 렌더링된 다이어그램으로 자동으로 교체됩니다. 3. ** 코드** 버튼을 클릭하여 소스 코드를 확인합니다. 4. **📊 다이어그램** 버튼을 클릭하여 다이어그램 보기로 다시 전환합니다. 5. 다이어그램 영역을 클릭하여 전체 화면으로 봅니다. ## 전체 화면 컨트롤 - **마우스 휠**: 확대/축소 - **드래그**: 다이어그램 이동 - **+/-**: 도구 모음 확대/축소 버튼 - **⊙**: 보기 초기화 - **✕ / ESC**: 전체 화면 닫기 ## 호환성 및 문제 해결 ::: warning 안내 - **Firefox 제한**: 환경 제한으로 인해 Firefox는 9.2.2 버전을 사용하며, **Timeline**, **Sankey** 등 최신 기능은 지원하지 않습니다. - **구문 오류**: 렌더링 실패는 주로 Gemini가 생성한 코드의 구문 오류 때문입니다. 현재 Bad Case를 수집 중이며, 향후 패치를 통해 일반적인 생성 오류를 자동 수정할 예정입니다. :::
Mermaid 다이어그램 렌더링
================================================ FILE: docs/ko/guide/nanobanana.md ================================================ # NanoBanana 옵션 ::: warning 브라우저 호환성 현재 **NanoBanana** 워터마크 제거 기능은 브라우저 API 제한으로 인해 **Safari에서 지원되지 않습니다**. 이 기능을 사용해야 하는 경우 **Chrome** 또는 **Firefox**를 사용하는 것을 권장합니다. Safari 사용자는 다운로드한 이미지를 [banana.ovo.re](https://banana.ovo.re/)와 같은 도구 사이트에 업로드하여 수동으로 제거할 수 있습니다(단, 이미지 해상도에 따라 모든 이미지가 성공적으로 복구되는 것은 아닙니다). ::: **AI 이미지를 순수하게 유지하세요.** Gemini™가 생성한 이미지에는 기본적으로 눈에 보이는 워터마크가 포함되어 있습니다. 이는 안전을 위한 조치이지만, 완벽하게 깨끗한 이미지가 필요한 창의적인 상황이 있을 수 있습니다. ## 무손실 복구 NanoBanana는 **역 알파 블렌딩 (Reverse Alpha Blending)** 알고리즘을 사용합니다. - **AI 인페인팅이 아닙니다**: 기존의 워터마크 제거 방식은 종종 AI를 사용하여 해당 영역을 "뭉개는" 방식을 사용하며, 이는 픽셀 세부 정보를 파괴합니다. - **완벽한 픽셀 복구**: 우리는 수학적 계산을 통해 투명한 워터마크 레이어를 정밀하게 제거하여 100% 원본 픽셀을 복원합니다. - **품질 저하 제로**: 처리된 이미지는 워터마크가 없는 모든 영역에서 원본과 동일하게 유지됩니다. ## 사용 방법 1. **활성화**: Voyager 설정 패널 끝부분에 있는 "NanoBanana 옵션"을 찾아 활성화합니다. 2. **자동 처리**: 이제 생성하는 모든 이미지가 백그라운드에서 자동으로 처리됩니다. 3. **직접 다운로드**: - 처리된 이미지 위에 마우스를 올리면 🍌 버튼이 나타납니다. - **🍌 버튼은 기존의 다운로드 버튼을 완전히 대체**하여 항상 100% 워터마크가 제거된 이미지를 직접 받을 수 있도록 보장합니다.
NanoBanana 데모
## 감사 인사 이 기능은 [journey-ad (Jad)](https://github.com/journey-ad)의 [gemini-watermark-remover](https://github.com/journey-ad/gemini-watermark-remover) 프로젝트를 기반으로 하며, 이는 [allenk](https://github.com/allenk)의 [원본 C++ 구현](https://github.com/allenk/GeminiWatermarkTool)을 JavaScript로 포팅한 것입니다. 커뮤니티에 대한 그들의 기여에 감사드립니다. 🧡 ## 프라이버시 및 보안 모든 처리는 **사용자의 브라우저 내에서 로컬로** 이루어집니다. 이미지는 제3자 서버로 절대 업로드되지 않으므로 프라이버시와 창의적 보안이 보장됩니다. ================================================ FILE: docs/ko/guide/prevent-auto-scroll.md ================================================ # 자동 스크롤 방지 과거 대화를 읽고 있을 때 새로운 프롬프트를 전송하면, Gemini™는 새로 생성된 응답을 추적하기 위해 페이지를 강제로 가장 아래로 스크롤합니다. 이는 읽기 경험을 방해할 수 있습니다. **자동 스크롤 방지** 기능은 이러한 원치 않는 점프 동작을 차단합니다: - 기록을 읽기 위해 위로 스크롤한 상태에서는 시스템이 페이지가 아래로 점프하는 것을 방지합니다. - 이 기능은 기본적으로 **비활성화**되어 있습니다. 팝업 설정의 "Timeline Options"에서 수동으로 활성화할 수 있습니다. ## 활성화 방법 1. 브라우저 도구 모음에서 Voyager 확장 프로그램 아이콘을 클릭하여 팝업을 엽니다. 2. "Timeline Options (타임라인 옵션)" 섹션을 찾습니다. 3. "자동 스크롤 방지 (Prevent Auto Scroll)" 스위치를 켭니다. ================================================ FILE: docs/ko/guide/prompts.md ================================================ # 지적 자산: 프롬프트 라이브러리 당신은 완벽한 프롬프트를 만듭니다. 그것은 복잡한 코딩 문제를 해결하거나 아름다운 이메일을 작성합니다. 그것을 그냥 버리시겠습니까? 아니요. 저장하세요. ## 프롬프트 저장소 (Vault) 이것은 당신의 천재성을 담은 개인 저장소입니다. ### 1. 캡처 (Capture) 훌륭한 프롬프트를 작성했다면 입력창 근처에 떠 있는 **프롬프트 관리자** 아이콘을 클릭하세요. 이제 그것은 당신의 저장소의 일부가 되었습니다. ### 2. 분류 (Categorize) `#coding`, `#email`, `#research`와 같은 태그를 추가하세요. 당신의 도구들을 날카롭게 유지하고 분류하세요. ### 3. 배포 (Deploy) 다음에 필요할 때 다시 입력하지 마세요. 관리자를 열고 태그나 키워드로 검색한 다음 클릭하여 삽입하세요. 한 번의 클릭으로 무한한 지렛대 효과를 누리세요. ![프롬프트 관리자](/assets/gemini-prompt-manager.png) ## 어디서나 사용 가능 프롬프트 관리자는 이제 Gemini™와 AI Studio뿐만 아니라 당신이 선택한 모든 웹사이트에서 사용할 수 있습니다. ### 활성화 방법 1. 브라우저 확장 프로그램 도구 모음에서 Voyager 아이콘을 클릭합니다. 2. **프롬프트 관리자(Prompt Manager)** 섹션으로 스크롤합니다. 3. 웹사이트 URL(예: `chatgpt.com` 또는 `claude.ai`)을 입력합니다. 4. **웹사이트 추가(Add website)**를 클릭하고 권한을 허용합니다. 5. **대상 페이지를 새로고침**하여 플로팅 버튼을 확인합니다. ### 인기 AI 웹사이트 - `chatgpt.com` - ChatGPT - `claude.ai` - Claude - `copilot.microsoft.com` - Microsoft Copilot - `poe.com` - Poe ::: tip 사용자 지정 웹사이트에서는 **프롬프트 관리자** 기능만 활성화됩니다. 타임라인 및 폴더와 같은 다른 기능은 Gemini 전용으로 설계되었으며 로드되지 않습니다. ::: ================================================ FILE: docs/ko/guide/quote-reply.md ================================================ # 인용 답장 Voyager는 특정 내용에 대해 더 정확하고 효율적으로 답장할 수 있는 편리한 "인용 답장" 기능을 제공합니다. ## 소개 일상적인 대화에서 우리는 AI 출력의 특정 부분에 대해 추가 질문을 하거나 반박해야 할 때가 많습니다. 기존 방식은 해당 텍스트를 복사하고 입력창에 수동으로 `> ` 기호를 입력하는 것이었는데, 이는 매우 번거로운 과정입니다. Voyager는 이 과정을 간소화합니다: 1. **선택하여 인용**: 대화 페이지에서 마우스로 원하는 텍스트를 선택합니다 (자신의 질문이나 Gemini의 답변 모두 가능). 2. **플로팅 버튼**: 선택한 텍스트 근처에 "인용 답장" 버튼이 자동으로 나타납니다. 3. **클릭 한 번으로 삽입**: 버튼을 클릭하면 선택한 텍스트가 표준 Markdown 인용구 형식(`> 내용`)으로 입력창에 자동 삽입됩니다. ![인용 답장](/assets/quote-reply.png) ## 주요 기능 - **문맥 인식**: 대화 내용을 지능적으로 식별하여 관련 없는 영역(예: 입력창 자체)에서 실수로 트리거되는 것을 방지합니다. - **표준 형식**: Gemini가 완벽하게 이해하는 범용 Markdown 구문을 사용하여 더 정확한 답변을 유도합니다. - **다중 행 지원**: 여러 줄의 텍스트를 선택하면 Voyager가 각 줄에 자동으로 인용 기호를 추가하여 서식을 깔끔하게 유지합니다. ## 사용 팁 - **세부 사항 후속 질문**: Gemini의 답변 중 혼란스러운 개념을 선택하고 인용을 클릭한 뒤, "이 개념에 대해 자세히 설명해 주세요"라고 입력하세요. - **오류 수정**: 답변에서 잘못된 코드나 사실을 선택하여 인용하고, "이 부분은 틀렸습니다. 원래는... 이어야 합니다"라고 지적하세요. ================================================ FILE: docs/ko/guide/recents-hider.md ================================================ # 최근 항목 및 Gem 숨기기 ::: info **참고**: 이 기능은 버전 1.1.9 이상에서 지원됩니다. ::: Gemini™ 홈 페이지의 "최근에 저장됨" 섹션을 숨겨 더 깔끔한 인터페이스를 유지할 수 있는 세련된 토글 기능을 추가하세요. 이제 사이드바의 **Gem** 목록을 숨기는 기능도 지원합니다!

최근 항목 숨기기

Gem 목록 숨기기

## 주요 기능 - **문맥 인식 토글**: 최근 항목 섹션 위에 마우스를 올릴 때만 미세한 숨기기 버튼이 나타납니다. - **미니멀한 상태**: 숨겨진 상태에서는 하단의 눈에 띄지 않는 "피크 바 (peek bar)"로 대체됩니다. - **클릭 한 번으로 복원**: 피크 바 위에 마우스를 올리고 클릭하면 최근 항목을 즉시 다시 불러올 수 있습니다. - **프라이버시 보호**: 근처의 다른 사람이 최근 활동을 볼 수 없도록 방지하여 공공장소에서 사용하기 적합합니다. - **설정 유지**: 사용자의 선택이 저장되어 다음 방문 시 자동으로 적용됩니다. ## 사용 방법 1. Gemini 홈 페이지의 "최근" 섹션 위에 마우스를 올립니다. 2. 우측 상단에 나타나는 눈 가리기 아이콘을 클릭하여 섹션을 숨깁니다. 3. 복원하려면 해당 영역 하단에 남아 있는 얇은 선 위에 마우스를 올리고 클릭합니다. ================================================ FILE: docs/ko/guide/settings.md ================================================ # 나만의 것으로 만들기 기본 환경도 훌륭합니다. 하지만 당신은 완벽함을 원할 수도 있죠. 모든 세부 사항을 맞춤 설정하세요. ## 시네마 모드 (Cinema Mode) 왜 미래를 작은 바늘구멍을 통해 보나요? Voyager를 사용하면 대화창 너비를 확장할 수 있습니다. - **넓게 (Wide)**: 코딩이나 복잡한 표를 볼 때 적합한 1400px. - **집중 (Focused)**: 읽기에 적합한 800px. - **당신의 결정**: 슬라이더를 사용하여 당신에게 딱 맞는 너비를 찾으세요. ## 컨트롤 (Control) 확장 프로그램 아이콘을 클릭하여 컨트롤 센터에 접속하세요. - **스크롤 모드**: 자연스러운 방식 또는 클래식 방식. - **타임라인 위치**: 당신이 편안하게 느끼는 곳에 두세요. - **시각 효과**: `눈`, `벚꽃`, `비`로 계절 분위기를 연출하세요. ## 사용자 정의 순서 팝업에 설정 항목이 너무 많아 자주 쓰는 것이 아래에 묻혀 있나요? 설정 카드에 마우스를 올리면 오른쪽 상단에 ▲/▼ 버튼이 나타납니다. 클릭하면 카드가 위아래로 이동하며, 순서는 자동 저장됩니다. ## 분위기 Voyager는 효율 향상에만 그치지 않습니다. 페이지의 분위기도 바꿀 수 있습니다. - **눈**: 부드러운 눈송이가 천천히 내려 차분한 겨울 느낌을 줍니다. - **벚꽃**: 벚꽃 잎이 자연스럽게 흩날리며 가벼운 봄 분위기를 연출합니다. - **비**: 비스듬한 빗줄기와 은은한 물방울이 시네마틱한 몰입감을 줍니다. - **부드러운 전환**: 효과를 끄거나 전환하면 파티클이 자연스럽게 사라집니다.

설정 열기

설정 가이드 열기

너비 조절

대화 너비 조절
================================================ FILE: docs/ko/guide/sidebar-auto-hide.md ================================================ # 사이드바 자동 숨김 더 몰입감 있는 채팅 경험을 원하시나요? 우리는 **사이드바 자동 숨김** 기능을 제공합니다. 이 기능을 활성화하면 마우스가 사이드바 영역을 벗어날 때 사이드바가 자동으로 접히고, 마우스를 다시 사이드바 영역으로 가져가면 자동으로 펼쳐집니다. ### 데모
### 활성화 방법 1. Voyager 설정 패널을 엽니다. 2. **일반 설정 (General Settings)**에서 **사이드바 자동 숨김 (Auto-hide sidebar)** 토글을 찾습니다. 3. 토글을 켜서 활성화합니다. _참고: 이 기능은 현재 Google Gemini만 지원합니다._ ================================================ FILE: docs/ko/guide/sidebar.md ================================================ # 사이드바 너비 폴더 이름이 너무 길어서 다 보이지 않나요? 아니면 사이드바가 소중한 채팅 공간을 너무 많이 차지하고 있나요? 이제 사이드바의 너비를 자유롭게 조절할 수 있습니다. ## 조절 방법 1. Voyager 설정 패널을 엽니다 (브라우저 우측 상단의 확장 프로그램 아이콘 클릭). 설정 패널 여는 방법 2. **일반 설정 (General Settings)**에서 **사이드바 너비 (Sidebar width)** 옵션을 찾습니다. 3. 슬라이더를 드래그하여 자신에게 적합한 너비를 선택합니다. - **좁게 (Narrow)**: 공간을 절약하고 대화에 집중하세요. - **넓게 (Wide)**: 긴 폴더 이름을 한눈에 명확하게 확인하세요. ## 지원 플랫폼 이 기능은 다음을 모두 지원합니다: - **Google Gemini** - **Google AI Studio** 설정은 자동으로 저장되며 다음에 페이지를 열 때 적용됩니다. ================================================ FILE: docs/ko/guide/sponsor.md ================================================ # 후원하기 > [!NOTE] > Voyager가 도움이 되었다면 X, YouTube, Reddit 등에서 공유해 주세요. 공유가 늘수록 더 많은 사용자가 프로젝트를 발견하고 Gemini 사용 경험도 함께 좋아집니다. 감사합니다. 오픈 소스 프로젝트를 유지하는 것은 주로 열정(그리고 커피)에 의해 이루어집니다 ☕ **[Voyager](https://github.com/Nagi-ovo/gemini-voyager)**는 Gemini 경험을 향상시키기 위해 설계된 완전 무료 오픈 소스 브라우저 확장 프로그램입니다. 이 확장 프로그램이 Gemini를 더 효율적으로 사용하는 데 도움이 되었다면, 프로젝트의 지속적인 개발과 유지 관리를 위해 후원을 고려해 주세요. --- ## 온라인 플랫폼 Afdian ### 🎙️ 추천 도구: Typeless Voyager 개발 중에 광범위하게 사용한 AI 음성-텍스트 변환 도구인 **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**를 강력히 추천합니다. 이를 매일의 워크플로우에 통합함으로써 엄청난 시간을 절약하고 생산성을 크게 높일 수 있었습니다. > 🎁 **[제 추천 링크를 통해 가입](https://www.typeless.com/?via=gemini-voyager)**(코드: _`gemini-voyager`_)하시면 **$5 무료 크레딧**을 받으실 수 있습니다. 이는 제가 이 프로젝트를 계속 유지 관리할 수 있는 크레딧을 제공하며, 저의 작업을 지원하는 무료 방법입니다! ❤️ --- ## 커피 한 잔 후원하기 (QR) 🍵
WeChat Pay WeChat Pay
Alipay Alipay
--- 후원해 주셔서 감사합니다! 모든 기여는 저에게 큰 격려가 됩니다 ❤️ ================================================ FILE: docs/ko/guide/tab-title.md ================================================ # 탭 제목 동기화 브라우저 탭 제목을 현재 Gemini™ 채팅 제목과 자동으로 동기화합니다. ## 주요 기능 - **실시간 동기화**: 채팅 제목이 변경될 때(예: AI가 새 제목을 생성하거나 사용자가 직접 이름을 바꿀 때) 브라우저 탭 제목이 "Gemini"에서 특정 대화 주제로 즉시 업데이트됩니다. - **범용 지원**: 표준 채팅 페이지, Gem 대화 및 다중 계정 환경에서 완벽하게 작동합니다. - **토글 제어**: 기본 동작을 선호하는 경우 설정 패널의 "일반 옵션 (General Options)" 섹션에서 이 기능을 쉽게 비활성화할 수 있습니다.
탭 제목 동기화
## 사용 방법 1. 이 기능은 설치 시 기본적으로 활성화되어 있습니다. 2. Gemini 대화를 열고 브라우저 탭 제목을 확인해 보세요. 채팅 제목과 일치하도록 자동으로 업데이트됩니다. 3. 비활성화하려면: - 확장 프로그램 아이콘을 클릭하여 설정 패널을 엽니다. - "일반 옵션 (General Options)"을 찾습니다. - "탭 제목 업데이트 (Update Tab Title)" 토글을 끕니다. ================================================ FILE: docs/ko/guide/timeline.md ================================================ # 시간 여행 긴 대화는 어수선해지기 마련입니다. 위아래로 스크롤하다 보면 현재 위치를 잃어버리곤 하죠. Voyager는 당신의 대화를 타임라인으로 바꿔줍니다. ## 대화의 형태를 확인하세요 화면 오른쪽을 보세요. 각 노드는 메시지를 나타냅니다. 타임라인은 당신의 대화 리듬을 시각화합니다. ## 내비게이션의 해결책 - **순간 이동(Teleport)**: 노드를 클릭하여 해당 메시지로 즉시 이동합니다. - **미리 보기(Peek)**: 마우스를 올려 이동하지 않고도 내용을 확인합니다. - **북마크(Bookmark)**: 노드를 길게 눌러 **별표**를 표시하세요. 당신의 뇌를 위한 북마크와 같습니다. - **레벨 (실험적)**: 노드를 우클릭하여 다양한 레벨(1-3)을 설정하거나 하위 노드를 접을 수 있습니다. 분기된 대화를 명확하게 정리하는 데 완벽합니다. - **키보드**: 생각의 속도로 탐색하세요. 기본값은 `j`/`k`이며, 원하는 대로 바꿀 수 있습니다. ![타임라인 탐색](/assets/teaser.png) ## 키보드로 더 빠르게 마우스를 사용하고 싶지 않으신가요? 키보드를 사용하세요. **Gemini에서 Vim 모드를 켜는 것과 같습니다.** ### 기본 단축키 - `k` - 이전 노드로 이동 - `j` - 다음 노드로 이동 ### 맞춤 설정 확장 프로그램 설정을 열고 단축키 상자를 클릭한 다음 원하는 키를 누르세요. 어떤 키나 조합도 가능합니다. `n`/`p`? `,`/`.`? 당신의 선택입니다. **플로우(Flow) 모드**: 빠르게 누르면 부드럽게 대기열에 추가됩니다. **점프(Jump) 모드**: 즉각적인 반응, 최대 속도. ================================================ FILE: docs/ko/index.md ================================================ --- layout: home hero: name: 'Voyager' text: 'Gemini를 위한 완벽한 운영체제.' tagline: '우리는 Gemini를 사랑합니다. 단지 그것이 완벽해지기를 원했습니다.' image: src: /logo.png alt: Voyager 로고 actions: - theme: brand text: 다운로드 link: ./guide/installation - theme: alt text: 시작하기 link: ./guide/getting-started teaser: title: '그냥 작동합니다.' description: '우리는 단순히 또 다른 확장 프로그램을 만들고 싶지 않았습니다. 더 나은 사고 방식을 구축하고 싶었습니다.
Voyager를 사용하면 인터페이스와 싸우는 대신 대화의 흐름에 집중할 수 있습니다.' image: '/assets/teaser.png' features: - title: '타임라인' details: '스크롤하지 마세요. 날아보세요. 대화의 어느 지점으로든 즉시 이동하세요.' - title: '폴더' details: '마침내 AI를 위한 파일 시스템이 생겼습니다. 기본적이고 직관적이며 강력합니다.' - title: '자유' details: '데이터는 당신의 것입니다. 클릭 한 번으로 JSON, Markdown 또는 PDF로 내보내세요.' features: - icon: 🧭 title: 타임라인 details: 당신의 생각을 위한 지도. 대화를 시각적으로 탐색하세요. - icon: 🗂️ title: 폴더 details: 혼돈 속의 질서. 드래그 앤 드롭으로 끝내세요. - icon: ✨ title: 저장소 details: 당신의 천재성을 캡처하세요. 최고의 프롬프트를 저장하고 재사용하세요. - icon: 💬 title: 인용 답장 details: 텍스트를 선택하여 인용하세요. 효율적인 커뮤니케이션을 위한 문맥 인식 답장. - icon: ↔️ title: 대화 너비 details: 더 넓게 보세요. 더 나은 시각적 경험을 위해 대화 너비를 자유롭게 조정하세요. - icon: 💾 title: 대화 내보내기 details: 데이터 주권. 지식이 손실되지 않도록 다양한 형식으로 아카이브하세요. - icon: 🌦️ title: 시각 효과 details: 분위기를 바꿔보세요. 팝업에서 눈, 비, 벚꽃잎 효과를 전환할 수 있습니다. - icon: 🍌 title: NanoBanana 워터마크 제거 details: 무손실 워터마크 제거. AI가 만든 순간을 순수하게 유지하세요. - icon: 📐 title: 수식 복사 details: LaTeX 및 MathML (Word) 소스 코드를 클릭 한 번으로 복사하세요. - icon: 🧜‍♀️ title: Mermaid 다이어그램 details: 코드를 시각화로. 플로우차트, 시퀀스 다이어그램, 간트 차트를 즉시 렌더링하세요. - icon: 🏷️ title: 탭 제목 동기화 details: 한눈에 파악하세요. 브라우저 탭 제목을 대화 제목과 자동으로 동기화합니다. - icon: 🔀 title: 대화 분기 (실험적) details: 발산적 사고. любой 지점에서 대화를 분기하여 다양한 가능성을 탐색하세요. - icon: 🗑️ title: 일괄 삭제 details: 한꺼번에 정리하세요. 여러 대화를 선택하여 한 번에 삭제하세요. - icon: ☁️ title: 클라우드 동기화 details: 항상 동기화. 폴더와 프롬프트를 Google Drive에 백업하세요. - icon: ⚡️ title: 기본 모델 details: 반복하지 마세요. 새 대화에서 선호하는 모델로 자동 전환합니다. - icon: 🔬 title: Deep Research details: 사고를 해체하세요. Deep Research 세션에서 연구 과정과 링크를 추출합니다. ---
⚠️ 이름 변경 안내: 상표 및 저작권 문제로 인해 이 확장 프로그램이 공식적으로 Voyager로 이름이 변경되었습니다. 하지만 Chrome 웹 스토어의 심사 속도가 매우 느려 7일 이내에 이름 변경이 승인되지 않아, 현재 Chrome Web Store에서 일시적으로 이용할 수 없는 상태입니다.

모든 설치는 신뢰의 투표입니다

Chrome 웹 스토어와 GitHub의 실시간 수치입니다. 우리와 함께해주시는 동료 Voyager분들께 감사드립니다.

GitHub Stars GitHub Forks Latest Release GitHub Downloads Chrome Web Store Users Chrome Web Store Rating Edge Add-ons Firefox Add-ons Users Firefox Add-ons Rating
Nagi-ovo%2Fgemini-voyager | Trendshift

특별 감사

✨ Product Hunt에 출시되었습니다! 여러분의 의견과 피드백을 환영합니다. ❤️

Voyager on Product Hunt

“단순한 도구가 아닙니다. 마음을 위한 자전거입니다.”

가능한 것들을 확인해 보세요 →

================================================ FILE: docs/ko/privacy.md ================================================ # 개인정보 처리방침 최종 업데이트: 2026년 3월 16일 ## 서론 Voyager("당사", "우리" 또는 "저희")는 사용자의 개인정보를 보호하기 위해 최선을 다하고 있습니다. 이 개인정보 처리방침은 당사의 브라우저 확장 프로그램이 사용자의 정보를 어떻게 수집, 사용 및 보호하는지 설명합니다. ## 데이터 수집 및 사용 **당사는 어떠한 개인정보도 수집하지 않습니다.** Voyager는 전적으로 사용자의 브라우저 내에서 작동합니다. 확장 프로그램에 의해 생성되거나 관리되는 모든 데이터(폴더, 프롬프트 템플릿, 즐겨찾기 메시지, 설정 등)는 다음 위치에 저장됩니다: 1. 사용자의 기기에 로컬로 저장 (`chrome.storage.local`) 2. 기기 간 설정을 동기화하기 위해 사용 가능한 경우 브라우저의 동기화된 저장소에 저장 (`chrome.storage.sync`) 당사는 사용자의 개인 데이터, 대화 기록 또는 기타 개인 정보에 액세스할 수 없습니다. 당사는 사용자의 브라우징 기록을 추적하지 않습니다. ## Google 드라이브 동기화 (선택 사항) Google 드라이브 동기화 기능을 명시적으로 활성화한 경우, 확장 프로그램은 Chrome Identity API를 사용하여 OAuth2 토큰(`drive.file` 범위만)을 획득하고 폴더와 프롬프트를 **사용자 자신의 Google 드라이브**에 백업합니다. 이 전송은 사용자의 브라우저와 Google 서버 간에 직접 이루어집니다. 당사는 이 데이터에 접근할 수 없으며, 당사가 운영하는 어떤 서버로도 전송되지 않습니다. ## 권한 확장 프로그램은 작동에 필요한 최소한의 권한만을 요청합니다: - **Storage (저장소)**: 사용자의 기본 설정, 폴더, 프롬프트, 즐겨찾기 메시지 및 UI 사용자 정의 옵션을 로컬 및 기기 간에 저장하기 위해 사용됩니다. - **Identity (인증)**: 선택적 Google 드라이브 동기화 기능을 위한 Google 인증에 사용됩니다. 클라우드 동기화를 명시적으로 활성화한 경우에만 사용됩니다. - **Scripting (스크립트 주입)**: Gemini 페이지 및 사용자가 지정한 커스텀 웹사이트에 콘텐츠 스크립트를 동적으로 주입하기 위해 사용됩니다 (프롬프트 매니저 기능). 확장 프로그램 자체에 번들된 스크립트만 주입되며, 원격 코드를 가져오거나 실행하지 않습니다. - **Host Permissions (호스트 권한)** (gemini.google.com, aistudio.google.com 등): Gemini UI를 향상시키는 콘텐츠 스크립트를 주입하기 위해 사용됩니다 (폴더, 내보내기, 타임라인, 인용 답장 등). Google 관련 도메인(googleapis.com, accounts.google.com)은 Google 드라이브 동기화 인증에 필요합니다. - **Optional Host Permissions (선택적 호스트 권한)** (모든 URL): 프롬프트 매니저의 커스텀 웹사이트를 명시적으로 추가한 경우에만 런타임에서 요청됩니다. 사용자의 조작 없이 활성화되지 않습니다. ## 제3자 서비스 Voyager는 제3자 서비스, 광고주 또는 분석 제공업체와 어떠한 데이터도 공유하지 않습니다. ## 방침 변경 당사는 때때로 개인정보 처리방침을 업데이트할 수 있습니다. 변경 사항은 이 페이지에 새로운 개인정보 처리방침을 게시함으로써 사용자에게 통지됩니다. ## 문의하기 이 개인정보 처리방침에 대해 궁금한 점이 있으면 [GitHub 저장소](https://github.com/Nagi-ovo/gemini-voyager)를 통해 문의해 주세요. ================================================ FILE: docs/privacy.md ================================================ # 隐私政策 最后更新:2026年3月16日 ## 简介 Voyager(以下简称"我们")致力于保护您的隐私。本隐私政策说明了我们的浏览器扩展程序如何收集、使用和保护您的信息。 ## 数据收集与使用 **我们不收集任何个人信息。** Voyager 完全在您的浏览器本地运行。扩展程序生成或管理的所有数据(如文件夹、提示词模板、星标消息和设置)均存储在: 1. 您的本地设备上(`chrome.storage.local`) 2. 您的浏览器同步存储中(`chrome.storage.sync`,如可用),以便在您的设备间同步设置。 我们无法访问您的个人数据、聊天记录或其他任何隐私信息。我们也不会跟踪您的浏览历史。 ## Google Drive 同步(可选) 如果您主动开启 Google Drive 同步功能,扩展程序会使用 Chrome Identity API 获取 OAuth2 令牌(仅限 `drive.file` 范围),将您的文件夹和提示词备份到**您自己的 Google Drive**。此传输直接发生在您的浏览器和 Google 服务器之间。我们无法访问此数据,且绝不会发送到我们运营的任何服务器。 ## 权限说明 本扩展程序仅申请维持功能所需的最小权限: - **Storage(存储)**:用于在本地和跨设备保存您的偏好设置、文件夹、提示词、星标消息和界面自定义选项。 - **Identity(身份认证)**:用于 Google Drive 同步功能的 Google 认证。仅在您主动启用云同步时使用。 - **Scripting(脚本注入)**:用于在 Gemini 页面及用户指定的自定义网站上动态注入内容脚本(提示词管理器功能)。仅注入扩展自身打包的脚本,不会加载或执行任何远程代码。 - **Host Permissions(主机权限)**(gemini.google.com、aistudio.google.com 等):用于注入增强 Gemini 界面的内容脚本,提供文件夹、导出、时间线、引用回复等功能。Google 相关域名(googleapis.com、accounts.google.com)用于 Google Drive 同步认证。 - **Optional Host Permissions(可选主机权限)**(所有 URL):仅在您主动添加提示词管理器的自定义网站时按需请求,不会在未经您操作的情况下激活。 ## 第三方服务 Voyager 不会与任何第三方服务、广告商或分析提供商共享数据。 ## 政策变更 我们可能会不时更新隐私政策。我们将通过在此页面发布新的隐私政策来通知您任何变更。 ## 联系我们 如果您对本隐私政策有任何疑问,请通过我们的 [GitHub 仓库](https://github.com/Nagi-ovo/gemini-voyager) 联系我们。 ================================================ FILE: docs/pt/guide/batch-delete.md ================================================ # Eliminação em Lote Elimine várias conversas de uma só vez, sem precisar de apagar uma a uma. ## Funcionalidades - **Modo de Seleção Múltipla**: Pressione e segure qualquer conversa para entrar no modo de seleção múltipla e marque várias conversas para eliminar. - **Limpeza com um clique**: Após selecionar, clique no botão de eliminar para remover todas as conversas selecionadas de uma só vez. - **Feedback de Progresso**: O progresso em tempo real é exibido durante a eliminação para que saiba o estado atual. - **Confirmação Segura**: Um diálogo de confirmação aparece antes da eliminação para evitar operações acidentais.
Eliminação em Lote
## Como Usar 1. Na lista de conversas da barra lateral, **pressione e segure** qualquer item de conversa. 2. Após entrar no modo de seleção múltipla, aparecerão caixas de seleção no lado esquerdo de cada conversa. 3. Marque as conversas que deseja eliminar (até 50 de uma vez). 4. Clique no **botão Eliminar** que aparece. 5. Clique em "Confirmar" na área de confirmação vermelha que aparece **acima da lista de pastas** para iniciar a eliminação. ::: tip Nota O painel de confirmação sobrepõe a área de pastas para evitar bloquear a lista de conversas. As operações de eliminação em lote não podem ser desfeitas, por isso prossiga com cuidado. ::: ================================================ FILE: docs/pt/guide/cloud-sync.md ================================================ # Sincronização na Nuvem Sincronize suas pastas, biblioteca de prompts e outros dados no Google Drive para manter sua experiência consistente em todos os seus dispositivos. ## Recursos - **Sincronização entre dispositivos**: Mantenha suas configurações sincronizadas em vários computadores usando o Google Drive. - **Privacidade de dados**: Os dados são armazenados diretamente no seu próprio armazenamento do Google Drive, garantindo a privacidade sem servidores de terceiros. - **Sincronização flexível**: Suporte para upload manual e download/mesclagem de dados. ::: info **Em breve**: A próxima versão suportará a sincronização de conversas marcadas com estrela. ::: ## Como usar 1. Clique no ícone da extensão no canto inferior direito da página do Gemini™ para abrir o painel de configurações. 2. Localize a seção **Sincronização na Nuvem**. 3. Clique em **Fazer login com o Google** e conclua a autorização. 4. Uma vez autorizado, clique em **Fazer upload para a nuvem** para sincronizar seus dados locais com a nuvem, ou em **Baixar e mesclar** para trazer os dados da nuvem para sua máquina local. ### 💡 Sincronização rápida A maneira mais fácil é clicar nos botões **"Fazer upload para a nuvem"** ou **"Baixar e mesclar"** na parte superior da área de pastas na barra lateral esquerda. Botões de sincronização rápida na nuvem ::: warning **Recomendação de segurança: Proteção dupla** Embora a sincronização na nuvem ofereça grande conveniência, recomendamos enfaticamente que você também faça backups periódicos dos seus dados principais usando **arquivos locais**. 1. **Exportação Completa**: Exporte um pacote completo contendo todas as configurações, pastas e prompts em "Backup e Restauração" na parte inferior do painel. Exportação Completa 2. **Exportar Todas as Pastas**: Clique em "Exportar" na seção "Pastas" do painel para fazer backup de todas as suas pastas e conversas, excluindo os prompts. Exportar Todas as Pastas ::: ================================================ FILE: docs/pt/guide/community.md ================================================ # Comunidade e Feedback Valorizamos a voz de cada utilizador. Quer tenha encontrado um Bug, tenha uma sugestão de funcionalidade ou queira partilhar a sua biblioteca de prompts, pode contactar-nos através dos seguintes canais. ## 📢 Siga as Novidades Siga a nossa conta no X (Twitter) para obter os últimos progressos de desenvolvimento. - **Novos Lançamentos**: Saiba das atualizações em primeira mão. - **Próximas Funcionalidades**: Espreite o que está para vir. ## 💬 Comunidade Discord Junte-se ao nosso servidor Discord e troque ideias com outros Voyagers! - **Chat Instantâneo**: Fale diretamente com outros utilizadores e programadores. - **Partilha de Prompts**: Veja que tipos de Prompts as outras pessoas estão a usar. - **Progresso de Desenvolvimento**: Receba notícias sobre o desenvolvimento de novas funcionalidades. ## 🐙 GitHub Issues Se encontrou um erro no programa (Bug) ou tem um pedido de funcionalidade claro (Feature Request), recomendamos submeter um Issue no GitHub: - [Submeter Relatório de Bug](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=bug_report.yml) - [Submeter Pedido de Funcionalidade](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=feature_request.yml) Obrigado pelo seu apoio ao Voyager! ❤️ ================================================ FILE: docs/pt/guide/context-sync.md ================================================ # Transporte de memória: Sincronização de Contexto (Experimental) **Diferentes Dimensões, Compartilhamento Contínuo** Itere a lógica na web e implemente o código no IDE. O Voyager quebra as barreiras dimensionales, dando ao seu IDE o "processo de pensamento" da web instantaneamente. ## Chega de pular entre abas A maior dor para os desenvolvedores: depois de discutir uma solução minuciosamente na web, você retorna ao VS Code/Trae/Cursor apenas para ter que reexplicar os requisitos como um estranho. Devido às cotas e velocidades de resposta, a web é o "cérebro" e o IDE são as "mãos". O Voyager permite que eles compartilhem a mesma alma. ## Três Passos Simples para Sincronizar 1. **Instale e ative o CoBridge**: Instale a extensão **CoBridge** no VS Code. Ela serve como a ponte central conectando a interface web ao seu IDE local. - **[Instalar via VS Code Marketplace](https://open-vsx.org/extension/windfall/co-bridge)** ![Extensão CoBridge](/assets/CoBridge-extension.png) Após a instalação, **abra qualquer diretório de trabalho**, clique no ícone à direita e inicie o servidor. ![Servidor CoBridge Ligado](/assets/CoBridge-on.png) 2. **Aperto de mão**: - Ative a "Sincronização de Contexto" nas configurações do Voyager. - Alinhe o número da porta. Quando vir "IDE Online", significa que eles estão conectados. ![Painel de Sincronização de Contexto](/assets/context-sync-console.png) 3. **Sincronização em um clique**: Clique em **"Sync to IDE"**. Sejam **tabelas de dados** complexas ou **imagens de referência** intuitivas, tudo pode ser sincronizado instantaneamente com o seu IDE. ![Sincronização Concluída](/assets/sync-done.png) ## Criando Raízes Assim que a sincronização for concluída, um arquivo `.cobridge/AI_CONTEXT.md` aparecerá no diretório de trabalho do seu IDE. Seja Trae, Cursor ou Copilot, eles lerão automaticamente essa 'memória' por meio de seus respectivos arquivos Rule. ``` your-project/ ├── .cobridge/ │ ├── images/ │ │ ├── context_img_1_1.png │ │ └── context_img_1_2.png │ └── AI_CONTEXT.md ├── .github/ │ └── copilot-instructions.md ├── .gitignore ├── .traerules └── .cursorrules ``` ## Seus Princípios - **Zero Poluição**: O CoBridge gerencia automaticamente o `.gitignore`, garantindo que suas conversas privadas não sejam enviadas para repositórios Git. - **Especialista**: Formato Markdown completo, fazendo com que a IA no IDE leia de forma tão fluida quanto um manual de instruções. - **Dica**: Se a conversa for antiga, use a [Linha do Tempo] para rolar para cima e fazer com que a web "lembre" do contexto antes de sincronizar para melhores resultados. --- ## Parta Agora **O pensamento já está pronto na nuvem, agora, deixe-o criar raízes localmente.** - **[Instalar o Plugin CoBridge](https://open-vsx.org/extension/windfall/co-bridge)**: Encontre seu portal dimensional e ative a "respiração sincronizada" com um clique. - **[Visitar o Repositório GitHub](https://github.com/Winddfall/CoBridge)**: Saiba mais sobre a lógica por trás do CoBridge ou dê uma Star para este projeto de "sincronização de almas". > **Grandes modelos não perdem mais a memória; prontos para ação imediata.** ================================================ FILE: docs/pt/guide/deep-research.md ================================================ # Exportação Deep Research Exporte o relatório final gerado pelo Deep Research, ou guarde o seu processo completo de "pensamento" como um ficheiro Markdown. ## 1. Exportação de Relatório (PDF / Imagem) Os relatórios gerados pelo Deep Research podem ser exportados como PDFs com formatação elegante ou como imagens individuais partilháveis (os formatos Markdown e JSON também são suportados). ![Exportação de Relatório](/assets/deep-research-report-export.png) ## 2. Exportação do Processo de Pensamento (Markdown) Além do relatório final, também pode exportar o conteúdo completo de "pensamento" das conversas do Deep Research. ### Funcionalidades - **Exportação num clique**: O botão de download aparece no menu da conversa (⋮) - **Formato estruturado**: Preserva as fases de pensamento, itens de pensamento e sites pesquisados na sua ordem original - **Cabeçalhos bilingues**: Ficheiros Markdown incluem cabeçalhos de secção em inglês e no seu idioma atual - **Nomeação automática**: Os ficheiros têm carimbo de data/hora para fácil organização (ex: `deep-research-thinking-20240128-153045.md`) ### Como Usar 1. Abra uma conversa Deep Research no Gemini™ 2. Clique no botão **Partilhar e Exportar** na conversa 3. Selecione "Transferir conteúdo de pensamento" (Download thinking content) 4. O ficheiro Markdown será transferido automaticamente ![Exportação de Pensamento Deep Research](/assets/deepresearch_download_thinking.png) ### Formato do Ficheiro Exportado O ficheiro Markdown exportado inclui: - **Título**: O título da conversa - **Metadados**: Data/hora da exportação e número total de fases de pensamento - **Fases de Pensamento**: Cada fase contém: - Itens de pensamento (com cabeçalhos e conteúdo) - Sites pesquisados (com links e títulos) #### Exemplo de Estrutura ```markdown # Título da Conversa Deep Research **Hora de exportação / Exported At:** 2025-12-28 17:25:35 **Total de fases / Total Phases:** 3 --- ## Fase de Pensamento 1 / Thinking Phase 1 ### Título do Pensamento 1 Conteúdo do pensamento... ### Título do Pensamento 2 Conteúdo do pensamento... #### Sites Pesquisados / Researched Websites - [domain.com](https://example.com) - Título da Página - [another.com](https://another.com) - Outro Título --- ## Fase de Pensamento 2 / Thinking Phase 2 ... ``` ## Privacidade Toda a extração e formatação ocorre 100% localmente no seu navegador. Nenhum dado é enviado para servidores externos. ================================================ FILE: docs/pt/guide/default-model.md ================================================ # Modelo Padrão ::: info **Nota**: Este recurso é suportado na versão 1.1.9 e posteriores. ::: Defina um modelo Gemini™ preferido como padrão para evitar a troca manual a cada nova conversa.
## Recursos - **Configuração Interativa**: Adiciona um botão de "Estrela" diretamente no menu nativo de seleção de modelos do Gemini. - **Troca Automática**: Muda automaticamente para o seu modelo preferido sempre que você inicia uma nova conversa. - **Preferência Persistente**: Sua escolha é salva e sincronizada entre os seus dispositivos. - **Otimizado para SPA**: É ativado com precisão ao clicar no botão "Novo chat", usar atalhos ou navegar de volta para a página inicial. ## Como usar 1. Clique no **Seletor de Modelos** acima da área de entrada do Gemini. 2. Passe o mouse sobre o seu modelo preferido e clique no **ícone de Estrela**. 3. Assim que a estrela estiver **preenchida**, esse modelo será definido como seu padrão. 4. A extensão selecionará automaticamente este modelo para todos os novos chats. 5. Para desativar, basta clicar no ícone de estrela preenchida novamente. ================================================ FILE: docs/pt/guide/export.md ================================================ # Total Freedom Data lock-in is the enemy. We believe that if you create it, you own it. ## Export Everything Voyager lets you pull your data out of the cloud and into your hands. ### The Formats - **Markdown**: For your Obsidian vault or Notion. Clean, formatted text. (Usuários do Safari: Imagens não podem ser extraídas devido a limitações do navegador, use a exportação em PDF) - **PDF**: For sharing or printing. Beautifully laid out, images included. - **JSON**: Raw data. For developers who want to build on top of their history. ### How to Export 1. Passe o mouse sobre o logo do Gemini para ver o **Ícone de Exportação**. 2. Choose your format. 3. Done. It’s your data. Do what you want with it.

Passo 1: Passar o mouse no Logo

Export guide step 1

Step 2: The Choice

Export guide step 2
### Safari PDF Export Note Exporting PDF on Safari requires a slightly different process (manual print): 1. Click the **Export** button and select PDF format. 2. **Wait for about a second** (allow the page to prepare print styles). 3. Press `Command + P` to open the print dialog. 4. Select **"Save to PDF"** in the print dialog. Safari Export PDF ================================================ FILE: docs/pt/guide/folders.md ================================================ # Pastas Bem Feitas Por que organizar chats de IA é tão difícil? Nós resolvemos isso. Construímos um sistema de arquivos para seus pensamentos.

Gemini™

Pastas Gemini

AI Studio

Pastas AI Studio
## A física da organização Simplesmente parece certo. - **Arrastar e Soltar**: Pegue um chat. Solte-o em uma pasta. É tátil. - **Hierarquia Aninhada**: Projetos têm subprojetos. Crie pastas dentro de pastas. Estruture do _seu_ jeito. - **Espaçamento de pastas**: Ajuste a densidade da barra lateral, de compacto a espaçoso. > _Nota: No Mac Safari, os ajustes podem não ser em tempo real; atualize a página para ver o efeito._ - **Sincronização Instantânea**: Organize no seu desktop. Veja no seu laptop. ## Dicas Profissionais - **Multi-Seleção**: Pressione e segure uma conversa para entrar no modo de multi-seleção, depois selecione vários chats e mova todos de uma vez. - **Renomear**: Clique duas vezes em qualquer pasta para renomeá-la. - **Ícones**: Detectamos automaticamente o tipo de Gem (Programação, Criativo, etc.) e atribuímos o ícone correto. Você não precisa fazer nada. ## Diferenças de recursos por plataforma ### Recursos comuns - **Gestão básica**: Arrastar e soltar, renomear, seleção múltipla. - **Reconhecimento inteligente**: Detecta automaticamente tipos de chat e atribui ícones. - **Hierarquia Aninhada**: Suporte para aninhamento de pastas. - **Adaptação para AI Studio**: Os recursos avançados estarão disponíveis em breve no AI Studio. - **Sincronização com Google Drive**: Sincroniza a estrutura de pastas com o Google Drive. ### Exclusivo para Gemini #### Cores personalizadas Clique no ícone da pasta para personalizar sua cor. Escolha entre 7 cores padrão ou use o seletor de cores para escolher qualquer cor. Cores das pastas #### Isolamento de conta Clique no ícone "pessoa" no cabeçalho para filtrar instantaneamente os chats de outras contas do Google. Mantenha seu espaço de trabalho limpo ao usar várias contas. Isolamento de conta #### Organização Automática com IA Chats demais, preguiça de organizar? Deixe o Gemini pensar por você. Um clique copia sua estrutura de conversas atual, cole no Gemini, e ele gera um plano de pastas pronto para importar — organização instantânea. **Passo 1: Copie sua estrutura de conversas** Na parte inferior da seção de pastas no popup da extensão, clique no botão **AI Organize**. Ele coleta automaticamente todas as suas conversas não classificadas e a estrutura de pastas existente, gera um prompt e copia para a área de transferência. AI Organize Button **Passo 2: Deixe o Gemini classificar** Cole o conteúdo da área de transferência em uma conversa do Gemini. Ele vai analisar os títulos dos seus chats e gerar um plano de pastas em JSON. **Passo 3: Importe os resultados** Clique em **Importar pastas** no menu do painel de pastas, selecione **Ou colar JSON diretamente**, cole o JSON que o Gemini retornou e clique em **Importar**.
Import Menu
Paste JSON Import
- **Mesclagem incremental**: Usa a estratégia de "Mesclar" por padrão — apenas adiciona novas pastas e atribuições, nunca destrói sua organização existente. - **Multilíngue**: O prompt usa automaticamente o idioma configurado, e os nomes das pastas também são gerados nesse idioma. ### Exclusivo para AI Studio - **Ajuste da barra lateral**: Arraste para redimensionar a largura da barra lateral. - **Integração com Library**: Arraste diretamente de sua Library para pastas. ================================================ FILE: docs/pt/guide/fork.md ================================================ # Bifurcação de Conversa (Experimental) O pensamento não deveria ser de sentido único. Em explorações complexas, frequentemente precisamos de voltar a um nó crucial e tentar diferentes possibilidades. Com a funcionalidade de **Bifurcação de Conversa**, o Voyager permite-lhe expandir as suas ideias e explorar universos paralelos do seu chat. ## Como Funciona > **⚠️ Nota**: Esta é uma funcionalidade experimental. Primeiro, precisa de a ativar clicando no ícone da extensão na barra de ferramentas do seu navegador para abrir o pop-up de configurações, e ativando o interruptor **"Ativar Bifurcação de Conversa"**. Sempre que quiser seguir um caminho diferente, passe o rato sobre a sua pergunta e clique no botão **Bifurcar**: ![Bifurcação](/assets/branching.png) O Voyager irá capturar instantaneamente todo o contexto desde o início até esse ponto e **iniciará uma nova conversa** para si. Neste novo ramo, pode modificar livremente a sua pergunta e explorar diferentes direções sem se preocupar em danificar o seu histórico de chat original. Liberte a sua criatividade e curiosidade! ================================================ FILE: docs/pt/guide/formula-copy.md ================================================ # Cópia de Fórmulas O Voyager torna fácil a reutilização de fórmulas matemáticas e símbolos científicos. Suporta a cópia com um clique do código-fonte LaTeX e do formato MathML compatível com o Microsoft Word. ## Introdução Quando pede ao Gemini para derivar fórmulas ou escrever expressões matemáticas, ele geralmente apresenta-as usando LaTeX. Embora seja visualmente atraente, extrair o código-fonte para usar nos seus próprios artigos, documentos ou editores exige frequentemente um esforço manual. O Voyager oferece suporte total para isso: 1. **Deteção Automática**: O Voyager identifica automaticamente as fórmulas LaTeX apresentadas na página. 2. **Botão de Cópia**: Ao passar o rato sobre uma fórmula, aparece um ícone de cópia no lado direito. 3. **Opções de Formato**: Clique no ícone para escolher: - **Copy LaTeX**: Copia o código-fonte LaTeX padrão, ideal para Overleaf, editores Markdown, etc. - **Copy MathML**: Copia o código-fonte MathML, o melhor formato para colar diretamente no **Microsoft Word**. ![Cópia de Fórmulas](/assets/gemini-math-copy.png) ## Características - **Compatibilidade com Word**: Com o suporte MathML, pode colar fórmulas complexas geradas por IA diretamente em documentos Word, mantendo um formato editável perfeito. - **Preservação do Contexto**: Não copia apenas a fórmula em si, mas também preserva o seu contexto matemático. - **Resposta Instantânea**: Processado inteiramente de forma local para resultados imediatos. ## Dicas de Utilização - **Escrita Académica**: Ao escrever artigos no Word, peça ao Gemini para derivar fórmulas e, em seguida, utilize a cópia MathML para evitar o trabalho de introdução manual no Editor de Equações do Word. - **Notas**: Ao tirar notas no Obsidian ou Notion, basta copiar a fonte LaTeX diretamente. ================================================ FILE: docs/pt/guide/getting-started.md ================================================ # Bem-vindo a Bordo Parabéns. Acabou de melhorar o seu intelecto. O Voyager não é apenas um utilitário; é um fluxo de trabalho. Veja como tirar o máximo partido dele nos seus primeiros 5 minutos. ## 1. A Configuração Se ainda não o instalou, vá para o [Guia de Instalação](/pt/guide/installation). Uma vez instalado, atualize o seu separador do Gemini. Verá a diferença imediatamente. ## 2. A Linha do Tempo Inicie uma conversa. Uma longa. Pergunte sobre a história da tipografia ou a física dos buracos negros. Olhe para a direita. **Aquela faixa de pontos? É o seu mapa.** - **Passe o rato** para espreitar o que disse. - **Clique** para se teletransportar para lá. - **Pressione longamente** para marcar com estrela um momento que queira guardar. Acabou-se o scroll interminável. Agora navega à velocidade do pensamento. ## 3. Organização Olhe para a sua lista de chats à esquerda. Nota algo novo? **Pastas.** Pegue num chat. Arraste-o. Solte-o numa pasta. Parece natural, não é? É porque é. Pode aninhá-las, renomeá-las e, finalmente, limpar a desordem da sua mente. ## 4. O Cofre Acabou de escrever o prompt perfeito. Não o deixe desaparecer no vazio. Clique no **Ícone de Faísca** (✨) na caixa de entrada. Guarde-o. Etiquete-o. Da próxima vez? Basta clicar no ícone para o encontrar e inserir. Já não está apenas a conversar. Está a construir um cofre do seu próprio génio. --- **Está pronto.** Explore os guias específicos para mergulhos profundos: - [Domínio da Linha do Tempo](/pt/guide/timeline) - [Gestão de Pastas](/pt/guide/folders) - [Engenharia de Prompts](/pt/guide/prompts) - [Exportação de Dados](/pt/guide/export) ================================================ FILE: docs/pt/guide/input-collapse.md ================================================ # Colapso de Entrada Recolha a área de entrada quando estiver vazia para ganhar mais espaço de leitura. Clique na barra recolhida para expandir e começar a escrever.
Colapso de entrada
## Como Usar 1. Quando a área de entrada está vazia e perde o foco, recolhe-se automaticamente num botão compacto. 2. Clique no botão para expandir a área de entrada e começar a escrever. 3. Também pode pressionar Ctrl/+I para expandir rapidamente a área de entrada. 4. Pode ativar ou desativar esta funcionalidade no painel de definições (desativado por defeito). ================================================ FILE: docs/pt/guide/installation.md ================================================ # Instalação ::: info Notícias 🍎 **A extensão nativa do Safari já está disponível!** É totalmente gratuita e suporta a instalação com um clique. ::: Escolha o seu caminho. > ⚠️ Nota: O Gestor de Prompts é a única funcionalidade que suporta Gemini™ para Enterprise. ## 1. Lojas de Extensões (Recomendado) A forma mais simples de começar. As atualizações são automáticas. **Chrome / Brave / Opera / Vivaldi:** [Instalar da Chrome Web Store](https://chromewebstore.google.com/detail/kjdpnimcnfinmilocccippmododhceol?utm_source=github&utm_medium=docs&utm_campaign=organic_growth&utm_content=pt) ::: warning ⚠️ Chrome Web Store temporariamente indisponível A extensão foi oficialmente renomeada para **Voyager** devido a problemas de marcas registadas. A atualização do nome no Chrome Web Store está pendente de revisão. Veja [esta publicação](https://x.com/Nag1ovo/status/2031561180213313944) para mais detalhes. Use **Edge / Firefox** ou a **instalação manual** entretanto. ::: **Microsoft Edge:** [Instalar do Microsoft Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/gemini-voyager/gibmkggjijalcjinbdhcpklodjkhhlne) **Firefox:** [Instalar do Firefox Add-ons](https://addons.mozilla.org/firefox/addon/gemini-voyager/) ## 2. A Via Manual (Funcionalidades Mais Recentes) O processo de revisão da Web Store pode ser lento. Se quiser a versão de ponta imediatamente, instale manualmente. **Para Chrome / Edge / Brave / Opera:** 1. Descarregue o último `gemini-voyager-chrome-vX.Y.Z.zip` das [Releases do GitHub](https://github.com/Nagi-ovo/gemini-voyager/releases). 2. Descompacte o ficheiro. 3. Abra a página de Extensões do seu navegador (`chrome://extensions`). 4. Ative o **Modo de programador** (canto superior direito). 5. Clique em **Carregar expandida** e selecione a pasta que acabou de descompactar. **Para Firefox:** 1. Descarregue o último `gemini-voyager-firefox-vX.Y.Z.xpi` das [Releases](https://github.com/Nagi-ovo/gemini-voyager/releases). 2. Abra o Gestor de Add-ons (`about:addons`). 3. Arraste e largue o ficheiro `.xpi` para instalar (ou clique no ícone de engrenagem ⚙️ -> **Instalar Add-on de Ficheiro**). > 💡 O ficheiro XPI é oficialmente assinado pela Mozilla e pode ser instalado permanentemente em todas as versões do Firefox. ## 3. Safari (macOS) O Safari agora suporta distribuição direta! Descarregue a aplicação pré-assinada: 1. Descarregue a última versão do Safari (.dmg). 2. Abra o ficheiro e siga as instruções para instalar. 3. Clique duas vezes para iniciar a aplicação. 4. Ative a extensão nas **Definições do Safari > Extensões**. > 💡 A versão do Safari está agora diretamente assinada para distribuição — não é necessária conversão com Xcode! > > ⚠️ **Limitações**: Devido à natureza do Safari, (a) a remoção de marca d'água (b) a exportação de imagens (PDF recomendado) não são suportadas. --- _Configuração de desenvolvimento? Se é um programador à procura de contribuir, consulte o nosso [Guia de Contribuição](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/CONTRIBUTING.md)._ ================================================ FILE: docs/pt/guide/markdown-fix.md ================================================ # Correção de Renderização Markdown A interface web do Gemini™ às vezes insere elementos HTML (como fontes de citações ou marcadores de destaque) no meio do texto, o que pode quebrar a sintaxe de negrito do Markdown (`**texto**`), fazendo com que o texto não seja exibido corretamente em negrito. O Voyager possui um recurso de correção automática integrado que identifica e repara de forma inteligente essas tags de negrito quebradas, garantindo que seus documentos sejam renderizados de forma limpa e precisa. > [!INFO] > Este recurso é ativado automaticamente e não requer configuração adicional. ================================================ FILE: docs/pt/guide/mermaid.md ================================================ # Mermaid Diagram Rendering Automatically render Mermaid code as visual diagrams. ## Overview When Gemini™ outputs Mermaid code blocks (flowcharts, sequence diagrams, Gantt charts, etc.), Voyager automatically detects and renders them as interactive diagrams. ### Key Features - **Auto-detection**: Supports `graph`, `flowchart`, `sequenceDiagram`, `gantt`, `pie`, `classDiagram`, and all major Mermaid diagram types - **Toggle view**: Switch between rendered diagram and source code with one click - **Fullscreen mode**: Click the diagram to enter fullscreen with zoom and pan support - **Dark mode**: Automatically adapts to page theme ## How to Use 1. Ask Gemini to generate any Mermaid diagram code 2. The code block is automatically replaced with the rendered diagram 3. Click the ** Code** button to view source code 4. Click the **📊 Diagram** button to switch back to diagram view 5. Click the diagram area to enter fullscreen ## Fullscreen Controls - **Scroll wheel**: Zoom in/out - **Drag**: Pan the diagram - **+/-**: Toolbar zoom buttons - **⊙**: Reset view - **✕ / ESC**: Close fullscreen ## Compatibilidade e Solução de Problemas ::: warning Nota - **Limitação do Firefox**: Devido a restrições do ambiente, o Firefox usa a versão 9.2.2 e não suporta novos recursos como **Timeline** ou **Sankey**. - **Erros de sintaxe**: Falhas de renderização geralmente ocorrem devido a erros de sintaxis na saída do Gemini. Estamos coletando "bad cases" para implementar correções automáticas em atualizações futuras. :::
Mermaid diagram rendering
================================================ FILE: docs/pt/guide/nanobanana.md ================================================ # NanoBanana Option ::: warning Compatibilidade do navegador Atualmente, o recurso **NanoBanana** **não é compatível com o Safari** devido a limitações da API do navegador. Recomendamos o uso do **Chrome** ou **Firefox** se você precisar usar este recurso. Os usuários do Safari podem fazer o upload manual de suas imagens baixadas em sites de ferramentas como [banana.ovo.re](https://banana.ovo.re/) para processamento (embora o sucesso não seja garantido para todas as imagens devido a diferentes resoluções). ::: **AI Images, kept pure.** Images generated by Gemini™ come with a visible watermark by default. While this is intended for safety, there are creative scenarios where you need a perfectly clean slate. ## Lossless Reconstruction NanoBanana uses a **Reverse Alpha Blending** algorithm. - **Not AI Inpainting**: Traditional watermark removal often uses AI to "smear" the area, which destroys pixel details. - **Pixel Perfection**: We use mathematical calculations to precisely remove the transparent watermark layer, restoring the 100% original pixels. - **Zero Quality Loss**: The processed image remains identical to the original in all non-watermarked areas. ## How to Use 1. **Enable it**: Find "NanoBanana Option" at the end of the Voyager settings panel and toggle it on. 2. **Auto-process**: Every image you generate will now be automatically processed in the background. 3. **Download directly**: - Hover over a processed image and you'll see a 🍌 button. - **The 🍌 button completely replaces** the native download button to ensure you always get the 100% unwatermarked image directly.
NanoBanana Demo
## Acknowledgement This feature is based on the [gemini-watermark-remover](https://github.com/journey-ad/gemini-watermark-remover) project by [journey-ad (Jad)](https://github.com/journey-ad), which is a JavaScript port of the [original C++ implementation](https://github.com/allenk/GeminiWatermarkTool) by [allenk](https://github.com/allenk). We are grateful for their contributions to the community. 🧡 ## Privacy & Security All processing happens **locally in your browser**. Your images are never uploaded to any third-party servers, ensuring your privacy and creative security. ================================================ FILE: docs/pt/guide/prevent-auto-scroll.md ================================================ # Prevenir rolamento automático Ao ler o histórico de uma conversa, enviar uma nova mensagem fará com que o Gemini™ role forçosamente a página até o fim para mostrar a nova resposta. Isso pode interromper a sua leitura. O recurso **Prevenir rolamento automático** intercepta esse salto indesejado: - Quando você subir na página para ler o histórico, o sistema bloqueará a descida abrupta da página. - Esse recurso vem **desativado** por padrão. Você pode ativá-lo nas configurações da extensão em "Timeline Options". ## Como habilitar 1. Clique no ícone de extensão do Voyager no seu navegador para abrir o popup. 2. Procure a seção "Timeline Options" (Opções de Linha do Tempo). 3. Ative a chave "Prevent auto-scroll to bottom" (Prevenir rolamento automático ao fim da página). ================================================ FILE: docs/pt/guide/prompts.md ================================================ # O Seu Ativo Digital: Biblioteca de Prompts Passou algum tempo a criar um Prompt divino que ajudou imenso. Usar e deitar fora? Não, guarde-o. ## Cofre de Comandos Este é o seu cofre de comandos. ### 1. Capturar Escreveu algo bom? Clique no **ícone flutuante** ao lado da caixa de entrada. Guarde no cofre, sinta-se seguro. ### 2. Categorizar Adicione etiquetas como `#código`, `#email`, `#académico`. As ferramentas devem ser úteis e também organizadas. ### 3. Implementar Da próxima vez que precisar, não escreva tudo de novo. Abra a biblioteca, pesquise por etiqueta, clique para inserir. Chamada num clique, duplique a eficiência. ![Gestor de Prompts](/assets/gemini-prompt-manager.png) ## Funciona em Qualquer Site O Gestor de Prompts agora pode ser usado em qualquer site à sua escolha, não limitado ao Gemini™ e AI Studio. ### Como Ativar 1. Clique no ícone do Voyager na barra de ferramentas de extensões do navegador. 2. Role até à secção **Gestor de Prompts**. 3. Introduza o URL do site (ex: `chatgpt.com` ou `claude.ai`). 4. Clique em **Adicionar Site** e conceda permissão. 5. **Atualize a página de destino**, e verá a bola flutuante. ### Exemplos de Sites de IA Comuns - `chatgpt.com` - ChatGPT - `claude.ai` - Claude - `copilot.microsoft.com` - Microsoft Copilot - `poe.com` - Poe ::: tip Em sites personalizados, **apenas** a funcionalidade de Gestor de Prompts é ativada. Outras funcionalidades como Linha do Tempo, Pastas, etc., são específicas do Gemini e não serão carregadas. ::: ================================================ FILE: docs/pt/guide/quote-reply.md ================================================ # Resposta com Citação Selecione para citar, assim como no Discord ou Slack. Selecione qualquer texto na resposta do Gemini™, e um botão **"Citar"** aparecerá. Clique nele para inserir o conteúdo selecionado na caixa de entrada, formatado como uma citação Markdown. Isso é especialmente útil para fazer perguntas de acompanhamento sobre partes específicas de uma resposta longa.
Resposta com Citação
================================================ FILE: docs/pt/guide/recents-hider.md ================================================ # Ocultar itens recentes e Gems ::: info **Nota**: Este recurso é suportado na versão 1.1.9 e posteriores. ::: Adicione um botão elegante para ocultar a seção "Salvos recentemente" na página inicial do Gemini™ para uma interface mais limpa. Agora também suporta a ocultação da lista de **Gems** na barra lateral!

Ocultar salvos recentemente

Ocultar lista de Gems

## Características - **Alternância Contextual**: Um botão discreto aparece apenas quando você passa o mouse sobre a seção de Itens Recentes. - **Estado Minimalista**: Quando oculto, é substituído por uma discreta "barra de visualização" na parte inferior. - **Restauração com um clique**: Basta passar o mouse sobre a barra de visualização e clicar para trazer seus itens recentes de volta instantaneamente. - **Proteção de Privacidade**: Evita que outras pessoas próximas vejam suas atividades recentes, ideal para espaços públicos. - **Persistência**: Sua preferência é salva e aplicada automaticamente em sua próxima visita. ## Como usar 1. Passe o mouse sobre a seção "Recentes" na página inicial do Gemini. 2. Clique no ícone de olho riscado que aparece no canto superior direito para ocultar a seção. 3. Para restaurar, passe o mouse sobre a linha fina que permanece na parte inferior da área e clique. ================================================ FILE: docs/pt/guide/settings.md ================================================ # Largura do Chat Utilize totalmente o seu monitor ultrawide. O Gemini™ restringe o conteúdo principal a uma largura fixa. O Voyager liberta isso. Aceda ao painel de definições e arraste o slider **"Largura do Chat"**. - **Alargar**: Perfeito para tabelas de código, análise de dados e janelas de ecrã dividido. - **Concentrar**: Estreite-o para leitura profunda sem distrações.
Ajuste de Largura do Chat
## Ordem personalizada Muitas seções no popup e as que você mais usa estão lá embaixo? Passe o mouse sobre qualquer cartão de configuração e os botões ▲/▼ aparecerão no canto superior direito. Clique para mover um cartão para cima ou para baixo. Sua disposição é salva automaticamente. ## Efeitos Visuais Escolha `Neve`, `Sakura` ou `Chuva` para uma atmosfera sazonal. O Voyager não se limita a melhorias utilitárias. Pode também mudar o ambiente da página. - **Neve**: Flocos suaves para uma sensação calma de inverno. - **Sakura**: Pétalas de flor de cerejeira flutuando para um toque primaveril mais leve. - **Chuva**: Uma camada de chuva cinematográfica com gotas inclinadas e salpicos subtis. - **Transição suave**: Ao desativar ou trocar de efeito, as partículas desaparecem naturalmente. ================================================ FILE: docs/pt/guide/sidebar-auto-hide.md ================================================ # Ocultar barra lateral automaticamente Quer uma experiência de chat mais imersiva? Oferecemos a funcionalidade de **Ocultar barra lateral automaticamente**. Quando ativada, a barra lateral contrai-se automaticamente quando o rato sai da área e expande-se automaticamente quando move o rato de volta para ela. ### Demonstração
### Como ativar 1. Abra o painel de definições do Voyager. 2. Encontre a opção **Ocultar barra lateral auto** nas **Definições Gerais**. 3. Ative o interruptor. _Nota: Esta funcionalidade suporta atualmente apenas o Google Gemini._ ================================================ FILE: docs/pt/guide/sidebar.md ================================================ # Largura da barra lateral Os nomes das pastas são muito longos? Ou a barra lateral ocupa muito espaço? Agora você pode ajustar livremente a largura da barra lateral. ## Como ajustar 1. Abra o painel de configurações do Voyager (clique no ícone da extensão no canto superior direito). Como abrir o painel de configurações 2. Encontre a opção **Largura da barra lateral**. 3. Arraste o controle deslizante para escolher a largura que preferir. - **Estreito**: Economize espaço e concentre-se na conversa. - **Largo**: Veja os nomes completos das pastas num piscar de olhos. ## Plataformas suportadas Este recurso suporta: - **Google Gemini** - **Google AI Studio** Suas configurações são salvas automaticamente. ================================================ FILE: docs/pt/guide/sponsor.md ================================================ # Patrocinar o Projeto > [!NOTE] > Se o Voyager for útil para você, compartilhe no X, Reddit, YouTube, etc. Cada partilha ajuda mais pessoas a descobrir o projeto e a melhorar a experiência com Gemini. Obrigado. Se o Voyager melhora a sua produtividade diária, considere patrocinar o projeto. O seu apoio ajuda-nos a manter o desenvolvimento ativo, corrigir bugs e adicionar novas funcionalidades. ## Formas de Apoiar ### 💖 GitHub Sponsors O método preferido. 100% do seu patrocínio vai para o programador (o GitHub não cobra taxas). [GitHub Sponsors](https://github.com/sponsors/Nagi-ovo) ### ☕ Buy Me a Coffee Uma forma simples de oferecer um café como agradecimento. [Buy Me a Coffee](https://buymeacoffee.com/nagiovo) ### ⭐ Star no GitHub É grátis e ajuda imenso! Dê uma estrela ao nosso repositório para nos ajudar a alcançar mais pessoas. [GitHub stars](https://github.com/Nagi-ovo/gemini-voyager) ## Para onde vai o dinheiro? - **Taxas de Programador Apple**: Para manter a versão Safari viva e assinada ($99/ano). - **Servidor e Domínio**: Para alojar esta documentação e serviços de backend. - **Café**: Combustível essencial para converter código em funcionalidades. Obrigado por ser um Voyager! 🚀 ================================================ FILE: docs/pt/guide/tab-title.md ================================================ # Sincronização de Título de Aba Nunca mais se perca num mar de separadores "Gemini™". Por defeito, todos os separadores do Gemini dizem apenas "Gemini". Quando tem 10 abertos, encontrar o certo é um pesadelo. O Voyager muda automaticamente o título do separador do navegador para corresponder ao título da conversa atual. - **Antes**: Gemini, Gemini, Gemini - **Depois**: Física Quântica, Receita de Massa, Debugging Python Encontre o que precisa num relance. ================================================ FILE: docs/pt/guide/timeline.md ================================================ # Navegação na Linha do Tempo O recurso de assinatura do Voyager. Uma maneira visual e espacial de navegar nas suas conversas. ## O Problema As conversas de IA podem tornar-se longas. Muito longas. O scroll é lento. "Cmd+F" é desajeitado. Perde o contexto. ## A Solução Olhe para a direita do ecrã. Essa é a Linha do Tempo. Cada ponto representa uma troca (a sua pergunta + a resposta do Gemini™). ### Interações - **Hover (Passar o rato)**: Veja uma pré-visualização instantânea do que foi discutido naquele ponto. Sem clicar, sem scroll. Apenas espreite. - **Clique**: Salte instantaneamente para essa mensagem. Teletransporte. - **Destaque de Contexto**: Enquanto faz scroll, o ponto correspondente acende-se, para que saiba sempre onde está no "mapa". ## Favoritos (Stars) Pressione longamente (ou clique com o botão direito) em qualquer ponto para o **Marcar com Estrela**. Pontos com estrela tornam-se maiores e mais brilhantes. Use-os para marcar: - O código final funcional. - A melhor explicação de um conceito. - O prompt que desbloqueou tudo. A Linha do Tempo transforma uma parede de texto plano num mapa estruturado de conhecimento. ================================================ FILE: docs/pt/index.md ================================================ --- layout: home hero: name: 'Voyager' text: 'O sistema operativo que faltava ao Gemini.' tagline: 'Adoramos o Gemini. Só queríamos que fosse perfeito.' image: src: /logo.png alt: Logótipo do Voyager actions: - theme: brand text: Descarregar link: ./guide/installation - theme: alt text: Iniciar Jornada link: ./guide/getting-started teaser: title: 'Simplesmente funciona.' description: 'Não queríamos criar apenas mais uma extensão. Queríamos criar uma melhor forma de pensar.
Quando usa o Voyager, deixa de lutar contra a interface e passa a fluir com ela.' image: '/assets/teaser.png' features: - title: 'Linha do Tempo' details: 'Não faça scroll. Voe. Salte para qualquer ponto da sua conversa instantaneamente.' - title: 'Pastas' details: 'Finalmente, um sistema de ficheiros para a sua IA. Nativo, intuitivo, poderoso.' - title: 'Liberdade' details: 'Os seus dados são seus. Exporte para JSON, Markdown ou PDF com um clique.' features: - icon: 🧭 title: Linha do Tempo details: Um mapa para a sua mente. Navegue visualmente pelas conversas. - icon: 🗂️ title: Pastas details: Ordem no caos. Arrastar, largar, feito. - icon: ✨ title: Cofre details: O seu génio, capturado. Guarde e reutilize os seus melhores prompts. - icon: 💬 title: Resposta com Citação details: Selecione para citar. Respostas contextualizadas para uma comunicação eficiente. - icon: ↔️ title: Largura do chat details: Amplie sua visão. Ajuste livremente a largura do chat para uma melhor experiência de visualização. - icon: 💾 title: Exportar Chat details: Soberania dos dados. Arquive em vários formatos para que o conhecimento nunca se perca. - icon: 🌦️ title: Efeitos Visuais details: Defina o ambiente. Alterne entre neve, chuva e pétalas de sakura na janela popup. - icon: 🍌 title: Remoção de Marca de Água NanoBanana details: Remoção de marca de água sem perdas. Mantenha os momentos de IA puros. - icon: 📐 title: Cópia de Fórmulas details: Cópia com um clique de códigos-fonte LaTeX e MathML (Word). - icon: 🧜‍♀️ title: Gráficos Mermaid details: De código para visual. Fluxogramas, diagramas de sequência e gráficos de Gantt renderizados instantaneamente. - icon: 🏷️ title: Sinc. Título da Aba details: Saiba num relance. Sincronize automaticamente o título da aba do navegador com o seu chat. - icon: 🔀 title: Bifurcação de Conversa (Experimental) details: Pensamento divergente. Bifurque a conversa em qualquer nó para explorar diferentes possibilidades. - icon: 🗑️ title: Eliminação em Lote details: Limpeza em massa. Selecione várias conversas e elimine-as todas de uma vez. - icon: ☁️ title: Sincronização na Nuvem details: Sempre sincronizado. Faça backup de pastas e prompts no Google Drive entre dispositivos. - icon: ⚡️ title: Modelo padrão details: Pare de se repetir. Mude automaticamente para seu modelo preferido em novos chats. - icon: 🔬 title: Deep Research details: Abra a caixa preta. Extraia processos de pesquisa e links das sessões de Deep Research. ---
⚠️ Aviso de mudança de nome: Devido a problemas de marcas registradas e direitos autorais, esta extensão foi oficialmente renomeada para Voyager. No entanto, devido ao processo extremamente lento de revisão do Chrome Web Store, a mudança de nome não foi aprovada em 7 dias — está temporariamente indisponível no Chrome Web Store.

Cada instalação é um voto de confiança

Números ao vivo da Chrome Web Store e GitHub. Obrigado por viajar connosco, companheiros Exploradores.

Estrelas GitHub Forks GitHub Último Lançamento Downloads GitHub Utilizadores Chrome Web Store Avaliação Chrome Web Store Edge Add-ons Utilizadores Firefox Add-ons Avaliação Firefox Add-ons
Nagi-ovo%2Fgemini-voyager | Trendshift

Agradecimentos Especiais

✨ Estamos ao vivo no Product Hunt! Adoraríamos ouvir as suas opiniões e feedback. ❤️

Voyager no Product Hunt

"Não é apenas uma ferramenta. É uma bicicleta para a mente."

Veja o que é possível →

================================================ FILE: docs/pt/privacy.md ================================================ # Política de Privacidade Última atualização: 16 de março de 2026 ## Introdução O Voyager ("nós", "nosso" ou "nos") está comprometido em proteger a sua privacidade. Esta Política de Privacidade explica como a nossa extensão de navegador recolhe, utiliza e protege as suas informações. ## Recolha e Utilização de Dados **Não recolhemos nenhuma informação pessoal.** O Voyager opera inteiramente dentro do seu navegador. Todos os dados gerados ou geridos pela extensão (como pastas, modelos de prompts, mensagens favoritas e configurações) são armazenados: 1. Localmente no seu dispositivo (`chrome.storage.local`) 2. No armazenamento sincronizado do seu navegador (`chrome.storage.sync`) se disponível, para sincronizar configurações entre os seus dispositivos. Não temos acesso aos seus dados pessoais, histórico de chat ou qualquer outra informação privada. Não rastreamos o seu histórico de navegação. ## Sincronização com Google Drive (Opcional) Se ativar explicitamente a função de sincronização com o Google Drive, a extensão utiliza a API Chrome Identity para obter um token OAuth2 (apenas com o scope `drive.file`) para fazer backup das suas pastas e prompts no **seu próprio Google Drive**. Esta transferência ocorre diretamente entre o seu navegador e os servidores da Google. Não temos acesso a estes dados e nunca são enviados para qualquer servidor que operemos. ## Permissões A extensão solicita as permissões mínimas necessárias para funcionar: - **Storage (Armazenamento)**: Para guardar as suas preferências, pastas, prompts, mensagens favoritas e opções de personalização da interface localmente e entre dispositivos. - **Identity (Identidade)**: Para a autenticação Google da funcionalidade opcional de sincronização com o Google Drive. Usado apenas quando ativa explicitamente a sincronização na nuvem. - **Scripting (Scripts)**: Para injetar dinamicamente scripts de conteúdo nas páginas do Gemini e em sites personalizados especificados pelo utilizador para a funcionalidade Gestor de Prompts. Apenas scripts incluídos na própria extensão são injetados — nenhum código remoto é obtido ou executado. - **Host Permissions (Permissões de host)** (gemini.google.com, aistudio.google.com, etc.): Para injetar scripts de conteúdo que melhoram a interface do Gemini com funcionalidades como pastas, exportação, linha do tempo e citação de resposta. Os domínios adicionais da Google (googleapis.com, accounts.google.com) são necessários para a autenticação da sincronização com o Google Drive. - **Optional Host Permissions (Permissões de host opcionais)** (todos os URLs): Apenas solicitadas em tempo de execução quando adiciona explicitamente sites personalizados para o Gestor de Prompts. Nunca ativadas sem a sua ação. ## Serviços de Terceiros O Voyager não partilha nenhuns dados com serviços de terceiros, anunciantes ou fornecedores de análises. ## Alterações a Esta Política Podemos atualizar a nossa Política de Privacidade ocasionalmente. Iremos notificá-lo de quaisquer alterações publicando a nova Política de Privacidade nesta página. ## Contacte-nos Se tiver alguma dúvida sobre esta Política de Privacidade, por favor contacte-nos através do nosso [Repositório GitHub](https://github.com/Nagi-ovo/gemini-voyager). ================================================ FILE: docs/public/google79cf501ea29c5eb1.html ================================================ google-site-verification: google79cf501ea29c5eb1.html ================================================ FILE: docs/ru/guide/batch-delete.md ================================================ # Пакетное удаление Удаляйте несколько разговоров одновременно, больше не нужно удалять по одному. ## Особенности - **Режим множественного выбора**: Длительное нажатие на любой разговор, чтобы войти в режим множественного выбора и выбрать несколько разговоров для удаления. - **Очистка в один клик**: После выбора нажмите кнопку удаления, чтобы удалить все выбранные разговоры сразу. - **Обратная связь о прогрессе**: Прогресс отображается в реальном времени во время удаления, чтобы вы знали текущий статус. - **Безопасное подтверждение**: Диалоговое окно подтверждения появляется перед удалением, чтобы предотвратить случайные операции.
Пакетное удаление
## Как использовать 1. В списке разговоров на боковой панели **длительно нажмите** на любой элемент разговора. 2. После входа в режим множественного выбора слева от каждого разговора появятся чекбоксы. 3. Отметьте разговоры, которые вы хотите удалить (до 50 за раз). 4. Нажмите появившуюся **Кнопку удаления**. 5. Нажмите "Подтвердить" в красной области подтверждения, которая появится **над списком папок**, чтобы начать удаление. ::: tip Примечание Панель подтверждения перекрывает область папок, чтобы не блокировать список разговоров. Операции пакетного удаления нельзя отменить, поэтому, пожалуйста, будьте осторожны. ::: ================================================ FILE: docs/ru/guide/cloud-sync.md ================================================ # Облачная синхронизация Синхронизируйте свои папки, библиотеку промптов и другие данные с Google Диском, чтобы ваш опыт оставался одинаковым на всех устройствах. ## Возможности - **Синхронизация между устройствами**: Синхронизируйте свои конфигурации на нескольких компьютерах с помощью Google Диска. - **Конфиденциальность данных**: Данные хранятся непосредственно в вашем хранилище Google Диска, что обеспечивает конфиденциальность без использования сторонних серверов. - **Гибкая синхронизация**: Поддержка ручной загрузки и скачивания/объединения данных. ::: info **Скоро**: Следующая версия будет поддерживать синхронизацию избранных диалогов. ::: ## Как использовать 1. Нажмите на значок расширения в правом нижнем углу страницы Gemini™, чтобы открыть панель настроек. 2. Найдите раздел **Облачная синхронизация**. 3. Нажмите **Войти через Google** и завершите авторизацию. 4. После авторизации нажмите **Загрузить в облако**, чтобы синхронизировать локальные данные с облаком, или **Скачать и объединить**, чтобы перенести облачные данные на свой компьютер. ### 💡 Быстрая синхронизация Самый простой способ — нажать кнопки **«Загрузить в облако»** или **«Скачать и объединить»** в верхней части области папок в левой боковой панели. Кнопки быстрой облачной синхронизации ::: warning **Рекомендация по безопасности: Двойная защита** Хотя облачная синхронизация обеспечивает большое удобство, мы настоятельно рекомендуем вам также периодически создавать резервные копии основных данных с помощью **локальных файлов**. 1. **Полный экспорт**: Экспортируйте полный пакет, содержащий все настройки, папки и промпты в разделе «Резервное копирование и восстановление» в нижней части панели. Полный экспорт 2. **Экспорт всех папок**: Нажмите «Экспорт» в разделе «Папки», чтобы сохранить все папки и диалоги, исключая промпты. Экспорт всех папок ::: ================================================ FILE: docs/ru/guide/community.md ================================================ # Сообщество и Обратная связь Мы ценим голос каждого пользователя. Если вы нашли ошибку, у вас есть предложение по функции или вы хотите поделиться своим хранилищем промптов, есть несколько способов связаться с нами. ## 📢 Следите за обновлениями Подписывайтесь на нас в X (Twitter), чтобы получать последние новости разработки. - **Новые релизы**: Будьте первыми, кто узнает об обновлениях. - **Предпросмотр функций**: Узнавайте о предстоящих функциях заранее. ## 💬 Сообщество Discord Присоединяйтесь к нашему серверу Discord, чтобы общаться с другими Voyagers! - **Чат в реальном времени**: Общайтесь напрямую с другими пользователями и разработчиками. - **Обмен промптами**: Смотрите, как другие используют Gemini™, и делитесь своими лучшими промптами. - **Новости разработки**: Получайте последние новости о предстоящих функциях и релизах. ## 🐙 GitHub Issues Если вы нашли ошибку или у вас есть конкретный запрос на функцию, пожалуйста, откройте issue на GitHub: - [Сообщить об ошибке](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=bug_report.yml) - [Предложить функцию](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=feature_request.yml) Спасибо за поддержку Voyager! ❤️ ================================================ FILE: docs/ru/guide/context-sync.md ================================================ # Транспортировка памяти: Синхронизация контекста (Экспериментально) **Разные измерения, бесшовный обмен** Прорабатывайте логику в вебе, а код реализуйте в IDE. Voyager разрушает барьеры между измерениями, мгновенно передавая вашему IDE «мыслительный процесс» из веба. ## Хватит прыгать между вкладками Главная боль разработчиков: после детального обсуждения решения в вебе вы возвращаетесь в VS Code/Trae/Cursor, только чтобы заново объяснять требования, как незнакомцу. Из-за квот и скорости ответа веб — это «мозг», а IDE — «руки». Voyager позволяет им разделить одну душу. ## Три простых шага для синхронизации 1. **Установите и запустите CoBridge**: Установите расширение **CoBridge** в VS Code. Оно служит основным мостом, соединяющим веб-интерфейс и вашу локальную IDE. - **[Установить через VS Code Marketplace](https://open-vsx.org/extension/windfall/co-bridge)** ![Расширение CoBridge](/assets/CoBridge-extension.png) После установки, **откройте любой рабочий каталог**, нажмите на иконку справа и запустите сервер. ![Сервер CoBridge включен](/assets/CoBridge-on.png) 2. **Рукопожатие**: - Включите «Синхронизацию контекста» в настройках Voyager. - Совместите номера портов. Надпись «IDE Online» означает, что соединение установлено. ![Панель синхронизации контекста](/assets/context-sync-console.png) 3. **Синхронизация в один клик**: Нажмите **"Sync to IDE"**. Будь то сложные **таблицы данных** или наглядные **изображения**, всё будет мгновенно синхронизировано с вашим IDE. ![Синхронизация завершена](/assets/sync-done.png) ## Укоренение После завершения синхронизации в рабочем каталоге вашей IDE появится файл `.cobridge/AI_CONTEXT.md`. Будь то Trae, Cursor или Copilot, они будут автоматически считывать эту «память» через свои соответствующие файлы Rule. ``` your-project/ ├── .cobridge/ │ ├── images/ │ │ ├── context_img_1_1.png │ │ └── context_img_1_2.png │ └── AI_CONTEXT.md ├── .github/ │ └── copilot-instructions.md ├── .gitignore ├── .traerules └── .cursorrules ``` ## Принципы - **Чистота**: CoBridge автоматически правит `.gitignore`, чтобы ваши приватные диалоги не попали в Git-репозиторий. - **Профессионализм**: Полный формат Markdown, благодаря чему ИИ в IDE читает контекст так же легко, как инструкцию. - **Совет**: Если диалог был давно, сначала прокрутите его вверх с помощью [Таймлайна], чтобы веб-версия «вспомнила» контекست — тогда результат синхронизации будет лучше. --- ## В путь **Мысль уже готова в облаке, теперь дайте ей пустить корни локально.** - **[Установить плагин CoBridge](https://open-vsx.org/extension/windfall/co-bridge)**: Найдите свой портал между измерениями и включите «синхронное дыхание» одним кликом. - **[Посетить репозиторий на GitHub](https://github.com/Winddfall/CoBridge)**: Узнайте больше о логике CoBridge или поддержите проект «синхронизации душ» звездой. > **Большие модели больше не теряют память — готовы к делу здесь и сейчас.** ================================================ FILE: docs/ru/guide/deep-research.md ================================================ # Экспорт Deep Research Экспортируйте финальный отчет, созданный Deep Research, или сохраните весь процесс «мышления» в виде файла Markdown. ## 1. Экспорт отчетов (PDF / Изображение) Отчеты, созданные Deep Research, можно экспортировать в виде красиво оформленных PDF-файлов или отдельных изображений для удобного обмена (также поддерживаются форматы Markdown и JSON). ![Экспорт отчетов](/assets/deep-research-report-export.png) ## 2. Экспорт процесса мышления (Markdown) Помимо финального отчета, вы также можете экспортировать полное содержимое «мышления» из диалогов Deep Research. ### Особенности - **Экспорт в один клик**: Кнопка загрузки появляется в меню разговора (⋮) - **Структурированный формат**: Сохраняет этапы мышления, элементы мыслей и исследованные веб-сайты в их исходном порядке - **Двуязычные заголовки**: Файлы Markdown включают заголовки разделов на английском и вашем текущем языке - **Автоматическое именование**: Файлы имеют отметку времени для легкой организации (например, `deep-research-thinking-20240128-153045.md`) ### Как использовать 1. Откройте разговор Deep Research в Gemini™ 2. Нажмите кнопку **Поделиться и экспортировать** в разговоре 3. Выберите "Скачать содержимое мыслей" (Download thinking content) 4. Файл Markdown будет автоматически загружен ![Экспорт мышления Deep Research](/assets/deepresearch_download_thinking.png) ### Формат экспортированного файла Экспортированный файл Markdown включает: - **Заголовок**: Заголовок разговора - **Метаданные**: Отметка времени экспорта и общее количество этапов мышления - **Этапы мышления**: Каждый этап содержит: - Элементы мыслей (с заголовками и содержимым) - Исследованные веб-сайты (со ссылками и заголовками) #### Пример структуры ```markdown # Заголовок разговора Deep Research **导出时间 / Exported At:** 2025-12-28 17:25:35 **总思考阶段 / Total Phases:** 3 --- ## 思考阶段 1 / Thinking Phase 1 ### Заголовок мысли 1 Содержимое мысли... ### Заголовок мысли 2 Содержимое мысли... #### 研究网站 / Researched Websites - [domain.com](https://example.com) - Заголовок страницы - [another.com](https://another.com) - Другой заголовок --- ## 思考阶段 2 / Thinking Phase 2 ... ``` ## Конфиденциальность Всё извлечение и форматирование происходит на 100% локально в вашем браузере. Данные не отправляются на внешние серверы. ================================================ FILE: docs/ru/guide/default-model.md ================================================ # Модель по умолчанию ::: info **Примечание**: Эта функция поддерживается в версии 1.1.9 и более поздних. ::: Установите предпочитаемую модель Gemini™ в качестве модели по умолчанию, чтобы избежать ручного переключения при каждом новом диалоге.
## Возможности - **Интерактивная настройка**: добавляет кнопку «Звезда» прямо в стандартное меню выбора модели Gemini. - **Автоматическое переключение**: автоматически переключается на выбранную модель при каждом запуске нового чата. - **Сохранение настроек**: ваш выбор сохраняется и синхронизируется между вашими устройствами. - **Оптимизация для SPA**: точно срабатывает при нажатии кнопки «Новый чат», использовании горячих клавиш или возврате на главную страницу. ## Как использовать 1. Нажмите на **селектор моделей** над полем ввода Gemini. 2. Наведите курсор на нужную модель и нажмите на **иконку звезды**. 3. Когда звезда станет **закрашенной**, модель будет установлена по умолчанию. 4. Расширение будет автоматически выбирать эту модель для всех новых чатов. 5. Чтобы отменить выбор, просто снова нажмите на закрашенную иконку звезды. ================================================ FILE: docs/ru/guide/export.md ================================================ # Полная свобода Привязка к данным — это враг. Мы верим, что если вы создали это, вы владеете этим. ## Экспортируйте все Voyager позволяет вам извлечь ваши данные из облака и взять их в свои руки. ### Форматы - **Markdown**: Для вашего хранилища Obsidian или Notion. Чистый, отформатированный текст. (Пользователи Safari: изображения не могут быть извлечены из-за ограничений браузера, используйте экспорт в PDF) - **PDF**: Для обмена или печати. Красивая верстка, изображения включены. - **JSON**: Сырые данные. Для разработчиков, которые хотят строить поверх своей истории. ### Как экспортировать 1. Наведите курсор на логотип Gemini, чтобы увидеть **Значок экспорта**. 2. Выберите формат. 3. Готово. Это ваши данные. Делайте с ними то, что хотите.

Шаг 1: Наведите на логотип

Руководство по экспорту шаг 1

Шаг 2: Выбор

Руководство по экспорту шаг 2
### Примечание по экспорту в PDF для Safari Экспорт в PDF в Safari требует немного другого процесса (ручная печать): 1. Нажмите кнопку **Экспорт** и выберите формат PDF. 2. **Подождите около секунды** (чтобы страница подготовила стили для печати). 3. Нажмите `Command + P`, чтобы открыть диалоговое окно печати. 4. Выберите **"Сохранить как PDF"** (Save to PDF) в диалоговом окне печати. Safari Export PDF ================================================ FILE: docs/ru/guide/folders.md ================================================ # Папки, какими они должны быть Почему организовывать чаты с ИИ так сложно? Мы это исправили. Мы создали файловую систему для ваших мыслей.

Gemini™

Папки Gemini

AI Studio

Папки AI Studio
## Физика организации Это просто удобно. - **Перетаскивание**: Возьмите чат. Перетащите его в папку. Тактильное ощущение порядка. - **Вложенная иерархия**: У проектов есть подпроекты. Создавайте папки внутри папок. Структурируйте так, как удобно _вам_. - **Расстояние между папками**: Свободно настраивайте плотность боковой панели. > _Примечание: В Mac Safari изменения могут не отображаться в реальном времени; обновите страницу, чтобы увидеть эффект._ - **Мгновенная синхронизация**: Организуйте на компьютере. Используйте на ноутбуке. ## Профессиональные приемы - **Множественный выбор**: Длительное нажатие на разговор, чтобы войти в режим множественного выбора, затем выберите несколько чатов и переместите их все сразу. - **Переименование**: Дважды щелкните по любой папке, чтобы переименовать её. - **Значки**: Мы автоматически определяем тип Gem (Кодинг, Творчество и т.д.) и назначаем правильный значок. Вам ничего не нужно делать. ## Различия возможностей по платформам ### Общие функции - **Базовое управление**: Перетаскивание, переименование, множественный выбор. - **Умное распознавание**: Автоматическое определение типа чата и назначение значка. - **Вложенная иерархия**: Поддержка вложенности папок. - **Адаптация для AI Studio**: Продвинутые функции скоро появятся в AI Studio. - **Синхронизация с Google Drive**: Синхронизация структуры папок с Google Drive. ### Эксклюзивно для Gemini #### Пользовательские цвета Нажмите на иконку папки, чтобы настроить её цвет. Выберите один из 7 стандартных цветов или используйте палитру для выбора любого цвета. Цвета папок #### Изоляция аккаунтов Нажмите на иконку «человек» в заголовке, чтобы мгновенно скрыть чаты из других аккаунтов Google. Поддерживайте чистоту рабочего пространства при использовании нескольких аккаунтов. Изоляция аккаунтов #### Автоматическая организация с ИИ Слишком много чатов, лень сортировать? Пусть Gemini подумает за вас. Один клик копирует вашу текущую структуру разговоров, вставьте её в Gemini — и он сгенерирует готовый к импорту план папок. Мгновенный порядок. **Шаг 1: Скопируйте структуру разговоров** Внизу раздела папок во всплывающем окне расширения нажмите кнопку **AI Organize**. Он автоматически соберёт все ваши неотсортированные разговоры и текущую структуру папок, сгенерирует промпт и скопирует его в буфер обмена. AI Organize Button **Шаг 2: Пусть Gemini разберётся** Вставьте содержимое буфера обмена в разговор с Gemini. Он проанализирует заголовки ваших чатов и выдаст JSON-план папок. **Шаг 3: Импортируйте результат** Нажмите **Импорт папок** в меню панели папок, выберите **Или вставить JSON напрямую**, вставьте JSON, который вернул Gemini, и нажмите **Импорт**.
Import Menu
Paste JSON Import
- **Инкрементальное слияние**: По умолчанию используется стратегия «Слияние» — добавляются только новые папки и назначения, существующая организация никогда не разрушается. - **Многоязычность**: Промпт автоматически использует ваш настроенный язык, и названия папок тоже генерируются на этом языке. ### Эксклюзивно для AI Studio - **Регулировка боковой панели**: Изменение ширины боковой панели перетаскиванием. - **Интеграция с Library**: Перетаскивание проектов напрямую из Library в папки. ================================================ FILE: docs/ru/guide/fork.md ================================================ # Ветвление разговора (Экспериментально) Мышление не должно быть улицей с односторонним движением. При сложных исследованиях часто возникает необходимость вернуться к ключевой точке и опробовать различные варианты. С помощью функции **Ветвления**, Voyager позволяет вам расширять ход мыслей и исследовать параллельные вселенные вашего чата. ## Как это работает > **⚠️ Примечание**: Это экспериментальная функция. Сперва вам нужно включить ее, нажав на значок расширения на панели инструментов браузера, чтобы открыть всплывающее окно настроек, и активировав переключатель **«Включить ветвление разговора»**. Для того чтобы пойти по иному пути, просто наведите курсор на ваш вопрос и нажмите кнопку **Ветвление**: ![Ветвление](/assets/branching.png) Voyager мгновенно скопирует весь контекст с самого начала до этой точки и **начнет совершенно новый разговор** для вас. В этой новой ветке вы можете свободно изменять свой вопрос и исследовать другие направления, не беспокоясь о том, что разрушите оригинальную историю чата. Дайте волю своей креативности и любопытству! ================================================ FILE: docs/ru/guide/formula-copy.md ================================================ # Копирование формул Voyager позволяет легко копировать математические формулы и научные символы. Поддерживается копирование исходного кода LaTeX и формата MathML, совместимого с Microsoft Word, в один клик. ## Описание функции Когда вы просите Gemini вывести формулу или написать математическое выражение, он обычно использует LaTeX для рендеринга. Несмотря на эстетичный вид, извлечение исходного кода для использования в ваших статьях, документах или редакторах часто требует ручного труда. Voyager предоставляет удобное решение: 1. **Автоматическое распознавание**: Voyager автоматически находит отрендеренные формулы LaTeX на странице. 2. **Кнопка копирования**: При наведении курсора на формулу справа появляется значок копирования. 3. **Выбор формата**: Нажмите на значок, чтобы выбрать: - **Copy LaTeX**: Копирует стандартный исходный код LaTeX, подходящий для Overleaf, редакторов Markdown и т. д. - **Copy MathML**: Копирует код MathML — это лучший формат для прямой вставки в **Microsoft Word**. ![Копирование формул](/assets/gemini-math-copy.png) ## Особенности - **Полная совместимость с Word**: Благодаря поддержке MathML вы можете вставлять сложные формулы, созданные ИИ, прямо в документы Word, сохраняя при этом идеальный редактируемый формат формул. - **Сохранение контекста**: Копируется не только сама формула, но и сохраняется ее математический контекст. - **Мгновенный отклик**: Обработка происходит полностью локально, результат доступен мгновенно. ## Советы по использованию - **Написание научных работ**: При написании статьи в Word попросите Gemini вывести формулу, а затем используйте копирование MathML, чтобы не вводить ее вручную в редакторе формул Word. - **Заметки**: При ведении заметок в Obsidian или Notion просто копируйте исходный код LaTeX напрямую. ================================================ FILE: docs/ru/guide/getting-started.md ================================================ # Добро пожаловать на борт Поздравляем. Вы только что улучшили свой интеллект. Voyager — это не просто утилита, это рабочий процесс. Вот как извлечь из него максимум пользы за первые 5 минут. ## 1. Настройка Если вы еще не установили его, перейдите к [Руководству по установке](/ru/guide/installation). После установки обновите вкладку Gemini. Вы сразу увидите разницу. ## 2. Таймлайн Начните разговор. Длинный. Спросите об истории типографики или физике черных дыр. Посмотрите направо. **Эта полоса точек? Это ваша карта.** - **Наведите курсор**, чтобы посмотреть, что вы сказали. - **Нажмите**, чтобы телепортироваться туда. - **Длительное нажатие**, чтобы добавить в избранное момент, который вы хотите сохранить. Больше никакой бесконечной прокрутки. Теперь вы перемещаетесь со скоростью мысли. ## 3. Организация Посмотрите на свой список чатов слева. Заметили что-то новое? **Папки.** Возьмите чат. Перетащите его. Бросьте его в папку. Это кажется естественным, не так ли? Потому что так и есть. Вы можете вкладывать их, переименовывать и, наконец, очистить свой разум от беспорядка. ## 4. Хранилище Вы только что написали идеальный промпт. Не дайте ему исчезнуть в пустоте. Нажмите **Значок Искры** (✨) в поле ввода. Сохраните его. Добавьте тег. В следующий раз? Просто нажмите значок, чтобы найти и вставить его. Вы больше не просто болтаете. Вы создаете хранилище своего собственного гения. --- **Вы готовы.** Изучите конкретные руководства для глубокого погружения: - [Мастерство таймлайна](/ru/guide/timeline) - [Управление папками](/ru/guide/folders) - [Промпт-инжиниринг](/ru/guide/prompts) - [Экспорт данных](/ru/guide/export) ================================================ FILE: docs/ru/guide/input-collapse.md ================================================ # Сворачивание ввода Сворачивайте поле ввода, когда оно пустое, чтобы получить больше пространства для чтения. Нажмите на свернутую панель, чтобы развернуть и начать печатать.
Сворачивание ввода
## Как использовать 1. Когда поле ввода пустое и теряет фокус, оно автоматически сворачивается в компактную кнопку-таблетку 2. Нажмите на кнопку-таблетку, чтобы развернуть поле ввода и начать печатать 3. Также можно нажать Ctrl/+I для быстрого развертывания поля ввода 4. Вы можете включить или отключить эту функцию в панели настроек (отключено по умолчанию) ================================================ FILE: docs/ru/guide/installation.md ================================================ # Установка ::: info Новости 🍎 **Нативное расширение для Safari уже вышло!** Оно совершенно бесплатно и поддерживает установку в один клик. ::: Выберите способ установки. > ⚠️ Примечание: Менеджер промптов — единственная функция, поддерживающая Gemini™ для Enterprise. ## 1. Магазины расширений (Рекомендуется) Самый простой способ начать. Обновления происходят автоматически. **Chrome / Brave / Opera / Vivaldi:** [Установить из Chrome Web Store](https://chromewebstore.google.com/detail/kjdpnimcnfinmilocccippmododhceol?utm_source=github&utm_medium=docs&utm_campaign=organic_growth&utm_content=ru) ::: warning ⚠️ Chrome Web Store временно недоступен Расширение официально переименовано в **Voyager** из-за проблем с товарными знаками. Обновление названия в Chrome Web Store ожидает проверки. Подробности в [этом посте](https://x.com/Nag1ovo/status/2031561180213313944). Пока что используйте **Edge / Firefox** или **ручную установку**. ::: **Microsoft Edge:** [Установить из Microsoft Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/gemini-voyager/gibmkggjijalcjinbdhcpklodjkhhlne) **Firefox:** [Установить из Firefox Add-ons](https://addons.mozilla.org/firefox/addon/gemini-voyager/) ## 2. Ручной способ (Новейшие функции) Процесс проверки в Web Store может быть медленным. Если вы хотите получить самую свежую версию немедленно, установите её вручную. **Для Chrome / Edge / Brave / Opera:** 1. Скачайте последний `gemini-voyager-chrome-vX.Y.Z.zip` из [GitHub Releases](https://github.com/Nagi-ovo/gemini-voyager/releases). 2. Распакуйте файл. 3. Откройте страницу Расширений вашего браузера (`chrome://extensions`). 4. Включите **Режим разработчика** (вверху справа). 5. Нажмите **Загрузить распакованное расширение** и выберите папку, которую вы только что распаковали. **Для Firefox:** 1. Скачайте последний `gemini-voyager-firefox-vX.Y.Z.xpi` из [Releases](https://github.com/Nagi-ovo/gemini-voyager/releases). 2. Откройте Менеджер дополнений (`about:addons`). 3. Перетащите файл `.xpi` для установки (или нажмите значок шестеренки ⚙️ -> **Установить дополнение из файла**). > 💡 Файл XPI официально подписан Mozilla и может быть постоянно установлен во всех версиях Firefox. ## 3. Safari (macOS) Safari теперь поддерживает прямое распространение! Скачайте предварительно подписанное приложение: 1. Скачайте последнюю версию Safari (.dmg). 2. Откройте файл и следуйте инструкциям по установке. 3. Дважды кликните для запуска приложения. 4. Включите расширение в **Настройки Safari > Расширения**. > 💡 Версия Safari теперь непосредственно подписана для распространения — конвертация в Xcode не требуется! > > ⚠️ **Ограничения**: Из-за особенностей Safari (a) удаление водяных знаков (b) экспорт изображений (рекомендуется PDF) не поддерживаются. --- _Настройка для разработки? Если вы разработчик и хотите внести свой вклад, ознакомьтесь с нашим [Руководством по участию](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/CONTRIBUTING.md)._ ================================================ FILE: docs/ru/guide/markdown-fix.md ================================================ # Исправление рендеринга Markdown Веб-интерфейс Gemini™ иногда вставляет HTML-элементы (такие как источники цитат или маркеры выделения) внутрь текста, что может нарушить синтаксис жирного шрифта Markdown (`**текст**`), в результате чего текст не отображается жирным шрифтом правильно. Voyager имеет встроенную функцию автоматического исправления, которая интеллектуально идентифицирует и восстанавливает эти поврежденные теги жирного шрифта, обеспечивая чистое и точное отображение ваших документов. > [!INFO] > Эта функция включается автоматически и не требует дополнительной настройки. ================================================ FILE: docs/ru/guide/mermaid.md ================================================ # Рендеринг диаграмм Mermaid Автоматически рендерит код Mermaid в визуальные диаграммы. ## Обзор Когда Gemini™ выдает блоки кода Mermaid (блок-схемы, диаграммы последовательности, диаграммы Ганта и т.д.), Voyager автоматически обнаруживает и рендерит их как интерактивные диаграммы. ### Ключевые особенности - **Авто-обнаружение**: Поддерживает `graph`, `flowchart`, `sequenceDiagram`, `gantt`, `pie`, `classDiagram` и все основные типы диаграмм Mermaid - **Переключение вида**: Переключайтесь между отрендеренной диаграммой и исходным кодом одним кликом - **Полноэкранный режим**: Нажмите на диаграмму, чтобы войти в полноэкранный режим с поддержкой масштабирования и панорамирования - **Темный режим**: Автоматически адаптируется к теме страницы ## Как использовать 1. Попросите Gemini сгенерировать любой код диаграммы Mermaid 2. Блок кода автоматически заменяется отрендеренной диаграммой 3. Нажмите кнопку ** Code** для просмотра исходного кода 4. Нажмите кнопку **📊 Diagram** для переключения обратно в режим диаграммы 5. Нажмите на область диаграммы, чтобы войти в полноэкранный режим ## Управление в полноэкранном режиме - **Колесо прокрутки**: Масштабирование - **Перетаскивание**: Панорамирование диаграммы - **+/-**: Кнопки масштабирования на панели инструментов - **⊙**: Сбросить вид - **✕ / ESC**: Закрыть полноэкранный режим ## Совместимость и устранение неполадок ::: warning Примечание - **Ограничения Firefox**: Из-за ограничений среды Firefox использует версию 9.2.2 и не поддерживает новые функции, такие как **Timeline** или **Sankey**. - **Ошибки синтаксиса**: Ошибки рендеринга часто связаны с синтаксическими ошибками в коде Gemini. Мы собираем "bad cases" для внедрения автоматических исправлений в будущих обновлениях. :::
Рендеринг диаграмм Mermaid
================================================ FILE: docs/ru/guide/nanobanana.md ================================================ # Опция NanoBanana ::: warning Совместимость с браузерами В настоящее время функция **NanoBanana** **не поддерживается в Safari** из-за ограничений API браузера. Мы рекомендуем использовать **Chrome** или **Firefox**, если вам нужно использовать эту функцию. Пользователи Safari могут вручную загружать скачанные изображения на сайты-инструменты, такие как [banana.ovo.re](https://banana.ovo.re/), для обработки (однако успех не гарантируется для всех изображений из-за разного разрешения). ::: **Изображения ИИ, сохраняющие чистоту.** Изображения, сгенерированные Gemini™, по умолчанию имеют видимый водяной знак. Хотя это сделано в целях безопасности, существуют творческие сценарии, когда вам нужен идеально чистый холст. ## Реконструкция без потерь NanoBanana использует алгоритм **Обратного альфа-смешивания** (Reverse Alpha Blending). - **Не AI Inpainting**: Традиционное удаление водяных знаков часто использует ИИ для "размазывания" области, что уничтожает детали пикселей. - **Пиксельная точность**: Мы используем математические вычисления для точного удаления прозрачного слоя водяного знака, восстанавливая 100% исходных пикселей. - **Нулевая потеря качества**: Обработанное изображение остается идентичным оригиналу во всех областях без водяных знаков. ## Как использовать 1. **Включите**: Найдите "Опция NanoBanana" в конце панели настроек Voyager и включите её. 2. **Авто-обработка**: Каждое сгенерированное вами изображение теперь будет автоматически обрабатываться в фоновом режиме. 3. **Скачивайте напрямую**: - Наведите курсор на обработанное изображение, и вы увидите кнопку 🍌. - **Кнопка 🍌 полностью заменяет** родную кнопку загрузки, чтобы гарантировать, что вы всегда получаете изображение без водяного знака напрямую.
Демонстрация NanoBanana
## Благодарность Эта функция основана на проекте [gemini-watermark-remover](https://github.com/journey-ad/gemini-watermark-remover) от [journey-ad (Jad)](https://github.com/journey-ad), который является портом на JavaScript [оригинальной реализации на C++](https://github.com/allenk/GeminiWatermarkTool) от [allenk](https://github.com/allenk). Мы благодарны за их вклад в сообщество. 🧡 ## Конфиденциальность и безопасность Вся обработка происходит **локально в вашем браузере**. Ваши изображения никогда не загружаются на сторонние серверы, что обеспечивает вашу конфиденциальность и безопасность творчества. ================================================ FILE: docs/ru/guide/prevent-auto-scroll.md ================================================ # Предотвращение автопрокрутки Когда вы читаете прошлые беседы, отправка нового сообщения (Prompt) заставит Gemini™ принудительно прокрутить страницу до конца, чтобы показать новый сгенерированный ответ. Это может сильно мешать чтению. Функция **Предотвращение автопрокрутки** блокирует этот нежелательный прыжок страницы: - Когда вы прокрутили страницу вверх, чтобы перечитать историю, система запрещает возвращение и пролистывание вниз. - Эта функция по умолчанию **отключена**. Вы можете включить её вручную в параметрах расширения в разделе "Timeline Options". ## Как включить 1. Щелкните по иконке расширения Voyager в браузере. 2. Найдите раздел "Timeline Options" (Опции таймлайна). 3. Включите параметр "Prevent auto-scroll to bottom" (Предотвращать автопрокрутку). ================================================ FILE: docs/ru/guide/prompts.md ================================================ # Ваши интеллектуальные активы: Библиотека промптов Вы создаете идеальный промпт. Он решает сложную задачу кодирования или пишет прекрасное электронное письмо. Вы выбрасываете его? Нет. Вы сохраняете его. ## Хранилище промптов Это ваш личный репозиторий гения. ### 1. Захват Когда вы пишете что-то замечательное, нажмите значок **Менеджер промптов** (плавающий рядом с полем ввода). Теперь это часть вашего хранилища. ### 2. Категоризация Добавляйте теги, такие как `#coding`, `#email` или `#research`. Держите свои инструменты заточенными и отсортированными. ### 3. Развертывание В следующий раз, когда он вам понадобится, не печатайте его снова. Откройте менеджер, найдите по тегу или ключевому слову и нажмите, чтобы вставить. Один клик. Бесконечный рычаг. ![Менеджер промптов](/assets/gemini-prompt-manager.png) ## Доступно везде Менеджер промптов теперь можно использовать на любом веб-сайте по вашему выбору, а не только в Gemini™ и AI Studio. ### Как включить 1. Нажмите на значок Voyager на панели инструментов вашего браузера. 2. Прокрутите до раздела **Менеджер промптов**. 3. Введите URL веб-сайта (например, `chatgpt.com` или `claude.ai`). 4. Нажмите **Добавить сайт** и предоставьте разрешение. 5. **Перезагрузите целевую страницу**, чтобы увидеть плавающую кнопку. ### Популярные сайты ИИ - `chatgpt.com` - ChatGPT - `claude.ai` - Claude - `copilot.microsoft.com` - Microsoft Copilot - `poe.com` - Poe ::: tip На пользовательских сайтах активируется **только** функция Менеджера промптов. Другие функции, такие как Таймлайн и Папки, специально разработаны для Gemini и не будут загружаться. ::: ================================================ FILE: docs/ru/guide/quote-reply.md ================================================ # Ответ с цитированием Voyager предлагает удобную функцию "Ответ с цитированием", делающую ответы на конкретный контент более точными и эффективными. ## Введение В ежедневных разговорах нам часто нужно продолжить или опровергнуть определенную часть ответа ИИ. Традиционный метод включает копирование этого текста и ручной ввод символа `> ` в поле ввода, что утомительно. Voyager упрощает этот процесс: 1. **Выделите для цитирования**: Используйте мышь, чтобы выделить любой текст на странице разговора (будь то ваш вопрос или ответ Gemini). 2. **Плавающая кнопка**: Кнопка "Цитировать" автоматически появится рядом с выделенным текстом. 3. **Вставка в один клик**: Нажмите кнопку, и выделенный текст будет автоматически вставлен в ваше поле ввода в стандартном формате цитирования Markdown (`> контент`). ![Quote Reply](/assets/quote-reply.png) ## Особенности - **Контекстно-зависимая**: Интеллектуально определяет контент разговора, чтобы избежать случайного срабатывания в несвязанных областях (например, в самом поле ввода). - **Стандартный формат**: Использует универсальный синтаксис Markdown, который Gemini прекрасно понимает, что приводит к более точным ответам. - **Поддержка многострочности**: Если выделено несколько строк текста, Voyager автоматически добавляет символы цитирования к каждой строке, чтобы сохранить чистоту формата. ## Советы - **Уточняйте детали**: Выделите непонятное понятие в ответе Gemini, нажмите цитировать, а затем введите "Пожалуйста, объясните это понятие подробно." - **Исправляйте ошибки**: Выделите неправильный код или факты в ответе, процитируйте их и укажите "Это неверно, должно быть..." ================================================ FILE: docs/ru/guide/recents-hider.md ================================================ # Скрытие недавних элементов и Gems ::: info **Примечание**: Эта функция поддерживается в версии 1.1.9 и более поздних. ::: Добавьте элегантный переключатель для скрытия раздела «Недавние сохранения» на главной странице Gemini™ для более чистого интерфейса. Теперь также поддерживается скрытие списка Gems на боковой панели!

Скрыть недавние сохранения

Скрыть список Gems

## Особенности - **Контекстный переключатель**: Ненавязчивая кнопка скрытия появляется только при наведении курсора на раздел недавних элементов. - **Минималистичное состояние**: В скрытом состоянии раздел заменяется на едва заметную полоску в нижней части. - **Восстановление в один клик**: Просто наведите курсор на полоску и нажмите, чтобы мгновенно вернуть недавние элементы. - **Защита конфиденциальности**: Предотвращает просмотр ваших последних действий окружающими, идеально для общественных мест. - **Сохранение настроек**: Ваш выбор сохраняется и применяется автоматически при следующем посещении. ## Как использовать 1. Наведите курсор на раздел «Недавние» на главной странице Gemini. 2. Нажмите на иконку перечеркнутого глаза, которая появится в правом верхнем углу, чтобы скрыть раздел. 3. Чтобы восстановить его, наведите курсор на тонкую линию в нижней части области и нажмите на нее. ================================================ FILE: docs/ru/guide/settings.md ================================================ # Сделайте его своим Стандартный опыт великолепен. Но вы можете захотеть, чтобы он был идеальным. Настройте каждый пиксель. ## Режим кинотеатра Зачем смотреть в будущее через крошечную замочную скважину? Voyager позволяет расширить ширину чата. - **Широкий**: 1400px для кодирования и сложных таблиц. - **Сфокусированный**: 800px для чтения. - **Решать вам**: Используйте ползунок, чтобы найти свою золотую середину. ## Управление Нажмите значок расширения, чтобы получить доступ к центру управления. - **Режим прокрутки**: Естественный или классический. - **Позиция таймлайна**: Поместите его там, где вам удобно. - **Визуальные эффекты**: Выберите `Снег`, `Сакура` или `Дождь` для сезонной атмосферы. ## Пользовательский порядок Слишком много секций в попапе, а нужные оказались внизу? Наведите курсор на любую карточку настроек — в правом верхнем углу появятся кнопки ▲/▼. Нажмите, чтобы переместить карточку вверх или вниз. Порядок сохраняется автоматически. ## Атмосфера Voyager не ограничивается утилитарными улучшениями. Вы также можете изменить настроение страницы. - **Снег**: Мягкие снежинки для спокойной зимней атмосферы. - **Сакура**: Парящие лепестки вишни для лёгкого весеннего настроения. - **Дождь**: Кинематографический дождь с косыми каплями и лёгкими брызгами. - **Плавное переключение**: При отключении или смене эффекта частицы плавно исчезают.

Открыть настройки

Руководство по открытию настроек

Настройка ширины

Настройка ширины чата
================================================ FILE: docs/ru/guide/sidebar-auto-hide.md ================================================ # Автоматическое скрытие боковой панели Хотите более глубокого погружения в чат? Мы предлагаем функцию **Автоматическое скрытие боковой панели**. Если она включена, боковая панель автоматически сворачивается, когда мышь покидает ее область, и автоматически разворачивается, когда вы наводите на нее курсор. ### Демонстрация
### Как включить 1. Откройте панель настроек Voyager. 2. Найдите переключатель **Авто-скрытие боковой панели** в **Общих настройках**. 3. Включите его для активации. _Примечание: Эта функция в настоящее время поддерживает только Google Gemini._ ================================================ FILE: docs/ru/guide/sidebar.md ================================================ # Ширина боковой панели Имена папок слишком длинные? Или боковая панель занимает слишком много места? Теперь вы можете свободно регулировать ширину боковой панели. ## Как настроить 1. Откройте панель настроек Voyager (нажмите на значок расширения в правом верхнем углу браузера). Как открыть панель настроек 2. Найдите опцию **Ширина боковой панели**. 3. Перетащите ползунок, чтобы выбрать удобную ширину. - **Узкая**: Экономьте место и сосредоточьтесь на беседе. - **Широкая**: Видите полные имена папок с первого взгляда. ## Поддерживаемые платформы Эта функция поддерживается на: - **Google Gemini** - **Google AI Studio** Ваши настройки сохраняются автоматически. ================================================ FILE: docs/ru/guide/sponsor.md ================================================ # Поддержать > [!NOTE] > Если Voyager вам полезен, поделитесь им в X, Reddit, YouTube и т.д. Каждый репост помогает большему числу людей узнать о проекте и улучшать опыт использования Gemini. Спасибо. Поддержка проектов с открытым исходным кодом в основном движется энтузиазмом (и кофе) ☕ **[Voyager](https://github.com/Nagi-ovo/gemini-voyager)** — это полностью бесплатное расширение браузера с открытым исходным кодом, разработанное для улучшения вашего опыта работы с Gemini. Если это расширение помогает вам использовать Gemini более эффективно, пожалуйста, рассмотрите возможность поддержки дальнейшей разработки и обслуживания этого проекта. --- ## Онлайн-платформы Afdian ### 🎙️ Рекомендуемый инструмент: Typeless Я настоятельно рекомендую **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)**, инструмент преобразования голоса в текст с использованием ИИ, который я широко использовал во время разработки Voyager. Интеграция его в мой ежедневный рабочий процесс сэкономила мне огромное количество времени и значительно повысила мою продуктивность. > 🎁 **[Присоединяйтесь по моей реферальной ссылке](https://www.typeless.com/?via=gemini-voyager)** (Код: _`gemini-voyager`_), чтобы получить **$5 бесплатных кредитов**. Это также дает мне кредиты для поддержания этого проекта — бесплатный способ поддержать мою работу! ❤️ --- ## Купить мне кофе (QR) 🍵
WeChat Pay WeChat Pay
Alipay Alipay
--- Спасибо за вашу поддержку! Каждый вклад является огромным стимулом для меня ❤️ ================================================ FILE: docs/ru/guide/tab-title.md ================================================ # Синхронизация заголовка вкладки Автоматически синхронизирует заголовок вкладки браузера с текущим заголовком чата Gemini™. ## Особенности - **Синхронизация в реальном времени**: Когда заголовок чата меняется (например, ИИ генерирует новый заголовок или вы вручную переименовываете его), заголовок вкладки браузера мгновенно обновляется с "Gemini" на конкретную тему разговора. - **Универсальная поддержка**: Отлично работает со стандартными страницами чата, разговорами Gem и мульти-аккаунтными средами. - **Управление переключением**: Если вы предпочитаете стандартное поведение, вы можете легко отключить эту функцию в разделе "Общие настройки" панели настроек.
Синхронизация заголовка вкладки
## Как использовать 1. Эта функция включена по умолчанию после установки. 2. Откройте любой разговор Gemini и обратите внимание на заголовок вкладки браузера; он автоматически обновится в соответствии с заголовком чата. 3. Чтобы отключить: - Нажмите на значок расширения, чтобы открыть панель настроек. - Найдите "Общие настройки". - Выключите "Обновлять заголовок вкладки". ================================================ FILE: docs/ru/guide/timeline.md ================================================ # Путешествие во времени Длинные разговоры могут быть запутанными. Вы прокручиваете вверх, прокручиваете вниз, теряете место. Voyager превращает ваш разговор в таймлайн. ## Увидьте форму вашего чата Посмотрите на правую часть экрана. Каждый узел представляет сообщение. Таймлайн визуализирует ритм вашего диалога. ## Навигация решена. - **Телепортация**: Нажмите на узел, чтобы мгновенно перейти к этому сообщению. - **Предпросмотр**: Наведите курсор, чтобы увидеть содержимое, не двигаясь. - **Закладка**: Длительное нажатие на узел, чтобы **пометить его звездочкой**. Это как закладка для вашего мозга. - **Уровни (Экспериментально)**: Щелкните правой кнопкой мыши по узлу, чтобы установить различные уровни (1-3) или свернуть дочерние элементы. Идеально подходит для того, чтобы сделать разветвленные разговоры понятными. - **Клавиатура**: Перемещайтесь со скоростью мысли. По умолчанию `j`/`k`, настройте на любые клавиши. ![Timeline Navigation](/assets/teaser.png) ## Еще быстрее с клавишами Не хотите использовать мышь? Используйте клавиатуру. **Это как включить режим Vim в Gemini.** ### Горячие клавиши по умолчанию - `k` - Перейти к предыдущему узлу - `j` - Перейти к следующему узлу ### Настройте это Откройте настройки расширения, нажмите на поле горячей клавиши, нажмите любую клавишу, которую хотите. Любая клавиша, любая комбинация. `n`/`p`? `,`/`.`? Решать вам. **Режим потока**: Быстрые нажатия выстраиваются в очередь плавно. **Режим прыжка**: Мгновенный отклик, максимальная скорость. ================================================ FILE: docs/ru/index.md ================================================ --- layout: home hero: name: 'Voyager' text: 'Недостающая ОС для Gemini.' tagline: 'Мы любим Gemini. Мы просто хотели, чтобы он был идеальным.' image: src: /logo.png alt: Логотип Voyager actions: - theme: brand text: Скачать link: ./guide/installation - theme: alt text: Начать путешествие link: ./guide/getting-started teaser: title: 'Это просто работает.' description: 'Мы не хотели создавать очередное расширение. Мы хотели создать лучший способ мышления.
Когда вы используете Voyager, вы перестаете бороться с интерфейсом и начинаете плыть вместе с ним.' image: '/assets/teaser.png' features: - title: 'Таймлайн' details: 'Не прокручивайте. Летайте. Мгновенно переходите к любой точке вашего разговора.' - title: 'Папки' details: 'Наконец-то, файловая система для вашего ИИ. Нативная, интуитивная, мощная.' - title: 'Свобода' details: 'Ваши данные принадлежат вам. Экспорт в JSON, Markdown или PDF одним кликом.' features: - icon: 🧭 title: Таймлайн details: Карта для вашего разума. Визуальная навигация по разговорам. - icon: 🗂️ title: Папки details: Порядок из хаоса. Перетащите, отпустите, готово. - icon: ✨ title: Хранилище промптов details: Ваш гений, сохраненный. Сохраняйте и используйте повторно ваши лучшие промпты. - icon: 💬 title: Ответ с цитированием details: Цитирование выделенного текста при ответе для эффективного общения. - icon: ↔️ title: Ширина чата details: Шире взгляд. Свободно регулируйте ширину чата для удобного просмотра. - icon: 💾 title: Экспорт чата details: Суверенитет данных. Архивация в нескольких форматах, чтобы знания никогда не терялись. - icon: 🌦️ title: Визуальные Эффекты details: Задайте настроение. Переключайте снег, дождь и лепестки сакуры из всплывающего окна. - icon: 🍌 title: Удаление водяных знаков NanoBanana details: Удаление водяных знаков без потерь. Сохраняйте моменты ИИ чистыми. - icon: 📐 title: Копирование формул details: Копирование исходного кода LaTeX и MathML (Word) в один клик. - icon: 🧜‍♀️ title: Mermaid диаграммы details: Код в визуализацию. Блок-схемы, диаграммы последовательностей, диаграммы Ганта рендерятся мгновенно. - icon: 🏷️ title: Синхронизация заголовка вкладки details: Знайте с первого взгляда. Авто-синхронизация заголовка вкладки браузера с вашим чатом. - icon: 🔀 title: Ветвление разговора (экспериментально) details: Дивергентное мышление. Ветвление разговора в любом узле для изучения различных возможностей. - icon: 🗑️ title: Пакетное удаление details: Массовая очистка. Выберите несколько разговоров и удалите их все сразу. - icon: ☁️ title: Облачная синхронизация details: Всегда на связи. Резервное копирование папок и промптов в Google Drive на всех устройствах. - icon: ⚡️ title: Модель по умолчанию details: Хватит повторяться. Автопереключение на любимую модель в новых чатах. - icon: 🔬 title: Deep Research details: Откройте чёрный ящик. Извлеките процессы исследования и ссылки из сессий Deep Research. ---
⚠️ Уведомление о переименовании: В связи с проблемами товарных знаков и авторских прав это расширение официально переименовано в Voyager. Однако из-за крайне медленного процесса проверки Chrome Web Store обновление названия не было одобрено в течение 7 дней — расширение временно недоступно в Chrome Web Store.

Каждая установка — это голос доверия

Живые цифры из Chrome Web Store и GitHub. Спасибо, что путешествуете с нами, попутчики Voyagers.

GitHub Stars GitHub Forks Latest Release GitHub Downloads Chrome Web Store Users Chrome Web Store Rating Edge Add-ons Firefox Add-ons Users Firefox Add-ons Rating
Nagi-ovo%2Fgemini-voyager | Trendshift

Особая благодарность

✨ Мы на Product Hunt! Будем рады услышать ваши мысли и отзывы. ❤️

Voyager on Product Hunt

“Это не просто инструмент. Это велосипед для разума.”

Посмотрите, что возможно →

================================================ FILE: docs/ru/privacy.md ================================================ # Политика конфиденциальности Последнее обновление: 16 марта 2026 г. ## Введение Voyager ("мы", "наш" или "нас") стремится защищать вашу конфиденциальность. Эта Политика конфиденциальности объясняет, как наше расширение браузера собирает, использует и защищает вашу информацию. ## Сбор и использование данных **Мы не собираем никакой личной информации.** Voyager работает полностью в вашем браузере. Все данные, генерируемые или управляемые расширением (такие как папки, шаблоны промптов, избранные сообщения и настройки), хранятся: 1. Локально на вашем устройстве (`chrome.storage.local`) 2. В синхронизированном хранилище вашего браузера (`chrome.storage.sync`), если доступно, для синхронизации настроек между вашими устройствами. Мы не имеем доступа к вашим личным данным, истории чатов или любой другой частной информации. Мы не отслеживаем вашу историю просмотра. ## Синхронизация с Google Диском (опционально) Если вы явно включите функцию синхронизации с Google Диском, расширение использует Chrome Identity API для получения токена OAuth2 (только с областью `drive.file`) для резервного копирования ваших папок и промптов на **ваш собственный Google Диск**. Эта передача происходит непосредственно между вашим браузером и серверами Google. Мы не имеем доступа к этим данным, и они никогда не отправляются на какой-либо сервер, который мы эксплуатируем. ## Разрешения Расширение запрашивает минимально необходимые разрешения для функционирования: - **Storage (Хранилище)**: Для сохранения ваших предпочтений, папок, промптов, избранных сообщений и настроек интерфейса локально и между устройствами. - **Identity (Идентификация)**: Для аутентификации Google при использовании опциональной функции синхронизации с Google Диском. Используется только когда вы явно включаете облачную синхронизацию. - **Scripting (Скрипты)**: Для динамического внедрения контентных скриптов на страницы Gemini и на пользовательские веб-сайты, указанные пользователем для функции Менеджера промптов. Внедряются только скрипты, входящие в комплект расширения — удалённый код не загружается и не выполняется. - **Host Permissions (Разрешения хоста)** (gemini.google.com, aistudio.google.com и др.): Для внедрения контентных скриптов, улучшающих интерфейс Gemini функциями, такими как папки, экспорт, временная шкала и цитирование ответов. Дополнительные домены Google (googleapis.com, accounts.google.com) необходимы для аутентификации синхронизации с Google Диском. - **Optional Host Permissions (Опциональные разрешения хоста)** (все URL): Запрашиваются только во время выполнения, когда вы явно добавляете пользовательские веб-сайты для Менеджера промптов. Никогда не активируются без вашего действия. ## Сторонние сервисы Voyager не передает никакие данные сторонним сервисам, рекламодателям или поставщикам аналитики. ## Изменения в этой политике Мы можем время от времени обновлять нашу Политику конфиденциальности. Мы уведомим вас о любых изменениях, опубликовав новую Политику конфиденциальности на этой странице. ## Свяжитесь с нами Если у вас есть какие-либо вопросы об этой Политике конфиденциальности, пожалуйста, свяжитесь с нами через наш [Репозиторий GitHub](https://github.com/Nagi-ovo/gemini-voyager). ================================================ FILE: docs/zh_TW/guide/batch-delete.md ================================================ # 批次刪除 一次性刪除多個對話,告別逐個刪除的繁瑣操作。 ## 功能介紹 - **多選模式**:長按任意對話進入多選模式,可勾選多個要刪除的對話。 - **一鍵清理**:選中後點擊刪除按鈕,批次刪除所有選中的對話。 - **進度回饋**:刪除過程中顯示即時進度,讓你了解目前狀態。 - **安全確認**:刪除前會彈出確認對話框,防止誤操作。
批次刪除
## 如何使用 1. 在側邊欄的對話列表中,**長按**任意一個對話項。 2. 進入多選模式後,對話項左側會出現核取方塊。 3. 勾選你想要刪除的對話(一次最多可選 50 個)。 4. 點擊出現的 **刪除按鈕**。 5. 在**資料夾列表上方**出現的紅色確認區域中點擊「確定」,即可開始批次刪除。 ::: tip 提示 刪除確認面板會直接覆蓋在資料夾區域上方,以免遮擋對話列表。批次刪除操作無法撤銷,請謹慎操作。 ::: ================================================ FILE: docs/zh_TW/guide/cloud-sync.md ================================================ # 雲同步 將您的資料夾、靈感庫(Prompts)等數據同步到 Google Drive,在不同設備間保持一致。 ## 功能特點 - **多端同步**:利用 Google Drive 雲端存儲,在多台電腦上同步您的配置。 - **數據安全**:數據存儲在您自己的 Google Drive 空間中,不經過第三方服務器,確保隱私安全。 - **靈活同步**:支持手動上傳、下載合併數據。 ::: info **下個版本預告**:下一個版本將支持同步星標對話。 ::: ## 如何使用 1. 在 Gemini™ 頁面點擊右下角的擴展圖標,打開設置面板。 2. 找到 **雲同步** 區域。 3. 點擊 **使用 Google 登錄** 並完成授權。 4. 授權成功後,點擊 **上傳到雲端** 將本地數據同步到雲端,或點擊 **從雲端下載合併** 將雲端數據同步到本地。 ### 💡 極速同步 最簡單的方法是在左側側邊欄的**資料夾區域頂部**,直接點擊「上傳到雲端」或「下載並合併」按鈕。 雲同步快捷按鈕 ::: warning **安全建議:雙重保護** 雖然雲同步提供了極大的便利,但為了您的數據萬無一失,我們强烈建議您定期通過**本地文件方式**手動備份核心數據。 1. **匯出全量配置**:在設置面板底部的「備份與恢復」中匯出包含所有設置、資料夾和提示詞的完整備份。 匯出全量配置 2. **匯出所有資料夾**:在設置面板的「資料夾」區域點擊「匯出」,僅備份所有資料夾結構及對話,不包含提示詞。 匯出所有資料夾 ::: ================================================ FILE: docs/zh_TW/guide/community.md ================================================ # 交流與回饋 我們非常重視每一位使用者的聲音。無論你是遇到了 Bug、有功能建議,還是想分享你構建的指令寶庫,都可以通過以下方式與我們聯繫。 ## 📢 關注動態 關注我們的 X (Twitter) 帳號,獲取最新開發進展。 - **新版本發布**:第一時間了解更新內容。 - **功能預告**:提前知曉即將到來的功能。 ## 💬 Discord 社群 加入我們的 Discord 伺服器,與其他 Voyager 交流心得! - **即時聊天**:與其他使用者和開發者直接對話。 - **提示詞分享**:看看大家都在用什麼樣的 Prompts。 - **開發進展**:第一時間獲取新功能的開發動態。 ## 🐙 GitHub Issues 如果你發現了程式錯誤(Bug)或有明確的功能需求(Feature Request),建議在 GitHub 上提交 Issue: - [提交 Bug 報告](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=bug_report.yml) - [提交功能建議](https://github.com/Nagi-ovo/gemini-voyager/issues/new?template=feature_request.yml) 感謝你對 Voyager 的支持!❤️ ================================================ FILE: docs/zh_TW/guide/context-sync.md ================================================ # 記憶搬運:上下文同步(實驗性) **不同次元,絲滑共享** 在網頁端推演邏輯,在 IDE 裡落地程式碼。 Voyager 打通次元壁,讓您的 IDE 瞬間擁有網頁端的「思維過程」。 ## 告別反覆橫跳 開發者最煩的事:在網頁上聊透了方案,回到 VS Code/Trae/Cursor 卻要像面對陌生人一樣重新解釋需求。 由於額度和回應速度,網頁端是「大腦」,IDE 是「手」。 Voyager 讓它們共用一個靈魂。 ## 極簡三步,同頻呼吸 1. **安裝並喚醒橋接器**: 安裝 **CoBridge** 插件。它是連接網頁與本地 IDE 的核心橋梁。 - **[前往插件市場安裝](https://open-vsx.org/extension/windfall/co-bridge)** ![CoBridge 擴充功能](/assets/CoBridge-extension.png) 安裝完成後,**打開任意工作目錄**,點擊右側圖示並啟動伺服器。 ![CoBridge 伺服器開啟](/assets/CoBridge-on.png) 2. **握手對接**: - 在 Voyager 設定中開啟「上下文同步」。 - 對齊埠號。看到「IDE Online」,說明它們已經連上了。 ![上下文同步面板](/assets/context-sync-console.png) 3. **一鍵同步**:點擊 **「Sync to IDE」**。無論是複雜的**數據表格**,還是直觀的**參考圖片**,都能瞬間瞬移到您的 IDE 中。 ![同步完成](/assets/sync-done.png) ## 落地生根 同步完成後,您的 IDE 工作目錄會多出一個 `.cobridge/AI_CONTEXT.md`。 無論是 Trae、Cursor 還是 Copilot,它們會透過各自的 Rule 文件自動讀取這份「記憶」。 ``` your-project/ ├── .cobridge/ │ ├── images/ │ │ ├── context_img_1_1.png │ │ └── context_img_1_2.png │ └── AI_CONTEXT.md ├── .github/ │ └── copilot-instructions.md ├── .gitignore ├── .traerules └── .cursorrules ``` ## 它的原則 - **零污染**:CoBridge 自動操作 `.gitignore`,不會把您這些私密對話推到 Git 倉庫裡。 - **懂行**:全 Markdown 格式,IDE 裡的 AI 讀起來就像讀說明書一樣順暢。 - **小貼士**:如果對話太久遠,先用【時間線】向上劃一下,讓網頁把記憶「想起來」,再同步效果更佳。 --- ## 立刻起航 **思維已在雲端就緒,現在,讓他在本地落地生根。** - **[安裝 CoBridge 插件](https://open-vsx.org/extension/windfall/co-bridge)**:找到您的次元傳送門,一鍵開啟「同頻呼吸」。 - **[訪問 GitHub 倉庫](https://github.com/Winddfall/CoBridge)**:深入了解 CoBridge 的底層邏輯,或者為這個「同步靈魂」的項目點個 Star。 > **大模型從此不再失憶,上手即戰。** ================================================ FILE: docs/zh_TW/guide/deep-research.md ================================================ # Deep Research 匯出 匯出 Deep Research 生成的最終報告,或將其完整的「思考」過程保存為 Markdown 文件。 ## 1. 報告匯出 (PDF / 圖片) Deep Research 生成的報告支持匯出為格式精美的 PDF 或方便分享的單張圖片(同时也支持匯出為 Markdown 和 JSON 格式)。 ![報告匯出](/assets/deep-research-report-export.png) ## 2. 思考過程匯出 (Markdown) 除了最終報告,您還可以將對話中的完整「思考」內容一鍵匯出。 ### 功能特性 - **一鍵匯出**: 點擊分享和匯出按鈕即可下載 - **結構化格式**: 按原始順序保留思考階段、思考條目和研究網站 - **雙語標題**: Markdown 文件包含英文和當前語言的雙語章節標題 - **自動命名**: 文件使用時間戳命名,便於整理 (例如:`deep-research-thinking-20240128-153045.md`) ### 使用方法 1. 在 Gemini™ 上打開一個 Deep Research 對話 2. 點擊對話的**分享和匯出**按鈕 3. 選擇 "下載 Thinking 內容" (Download thinking content) 4. Markdown 文件將自動下載 ![Deep Research 思考內容匯出](/assets/deepresearch_download_thinking.png) ### 匯出文件格式 匯出的 Markdown 文件包含: - **標題**: 對話標題 - **元數據**: 匯出時間和思考階段總數 - **思考階段**: 每個階段包含: - 思考條目 (包含標題和內容) - 研究網站 (包含連結和標題) #### 示例結構 ```markdown # Deep Research 對話標題 **導出時間 / Exported At:** 2025-12-28 17:25:35 **總思考階段 / Total Phases:** 3 --- ## 思考階段 1 / Thinking Phase 1 ### 思考標題 1 思考內容... ### 思考標題 2 思考內容... #### 研究網站 / Researched Websites - [domain.com](https://example.com) - 頁面標題 - [another.com](https://another.com) - 另一個標題 --- ## 思考階段 2 / Thinking Phase 2 ... ``` ## 隱私保護 所有提取和格式化操作都 100% 在瀏覽器本地完成。不會向外部伺服器發送任何數據。 ================================================ FILE: docs/zh_TW/guide/default-model.md ================================================ # 預設模型 ::: info **注意**:該功能僅在 1.1.9 及後續版本中支援。 ::: 為 Gemini™ 添加設置預設模型的功能,避免每次開啟新對話時都需要手動切換。
## 功能特點 - **互動式設置**:在 Gemini 的模型選擇選單中直接注入「星標」按鈕。 - **自動切換**:開啟新對話時,外掛程式會自動為您切換到預設的模型。 - **持久化保存**:您的偏好會被保存,跨設備同步。 - **優化體驗**:針對單頁應用(SPA)優化,無論是點擊「新對話」按鈕、快捷鍵還是直接訪問首頁,均能準確觸發。 ## 如何使用 1. 點擊 Gemini 輸入框上方的**模型選擇器**。 2. 滑鼠懸停在您想要設為預設的模型上,點擊出現的**空心星標**。 3. 星標變為**實心**後,該模型即被設為預設。 4. 下次訪問首頁或發起新對話時,系統會自動為您選中該模型。 5. 如需取消,再次點擊實心星標即可。 ================================================ FILE: docs/zh_TW/guide/export.md ================================================ # 徹底自由 數據被鎖死,是最壞的體驗。 我們的信條很簡單:你創造的,就是你的。 ## 帶走一切 Voyager 幫你把數據從雲端拽回手心。 ### 格式隨你選 - **Markdown**:給 Obsidian 或 Notion 用。乾淨清爽。(Safari 使用者注意:由於瀏覽器限制無法提取圖片,建議使用 PDF 匯出) - **PDF**:發給別人或列印。排版精美,圖文並茂。 - **JSON**:給開發者。原始數據,怎麼玩隨你。 ### 怎麼導 1. 滑鼠懸停在 Gemini Logo 上,即可看到出現的 **匯出圖示**。 2. 選格式。 3. 拿走。 你的數據,聽你的。

1. 懸停 Logo

導出指南步驟 1

2. 選格式

導出指南步驟 2
### Safari PDF 匯出特別說明 在 Safari 上匯出 PDF 步驟略有不同(需手動列印): 1. 點擊 **匯出** 按鈕,選擇 PDF 格式。 2. **等待一秒左右**(讓頁面準備好列印樣式)。 3. 按 `Command + P` 呼叫列印介面。 4. 在列印介面中選擇 **"Save to PDF"**(或 "儲存為 PDF")。 Safari Export PDF ================================================ FILE: docs/zh_TW/guide/folders.md ================================================ # 資料夾,本該如此 整理 AI 聊天記錄,以前怎麼那麼難? 我們修好了。給你的思緒,裝個檔案系統。

Gemini™

Gemini 資料夾

AI Studio

AI Studio 資料夾
## 整理的直覺 手感對了,一切都對了。 - **拖拽**:抓起來,扔進去。真實物理回饋。 - **套娃**:大項目套小項目。無限層級,隨你怎麼。 - **間距**:自由調整側邊欄密度,從緊湊到寬鬆。 > _注:Mac Safari 上的調整可能不是即時的,重新整理頁面即可生效。_ - **同步**:電腦上理好,筆記本上就能用。 ## 絕招 - **多選**:長按對話項進入多選模式,批次操作,一次搞定。 - **改名**:雙擊資料夾,直接改。 - **識圖**:代碼、寫作、閒聊... 我們自動識別 Gem 類型,配上圖標。你只管用,剩下的交給我們。 ## 平台特性差異 ### 通用功能 - **基礎管理**:拖拽排序、重命名、多選操作。 - **智能識別**:自動識別對話類型並匹配圖標。 - **多級目錄**:支持資料夾嵌套,結構更深邃。 - **AI Studio 適配**:上述進階功能即將支持 AI Studio。 - **Google Drive 同步**:支持將資料夾結構同步到 Google Drive。 ### Gemini 專屬增強 #### 自定義顏色 點擊資料夾圖標自定義顏色。內置 7 種默認配色,亦支持通過調色盤選取你的專屬色彩。 資料夾配色 #### 帳號隔離 點擊頂欄的「人像」圖標,即可自動屏蔽其他 Google 帳號的對話。在多帳號共用瀏覽器時,讓你的工作區保持純淨。 帳號隔離模式 #### AI 自動整理 聊天太多,懶得分類?讓 Gemini 幫你動腦。 一鍵複製你現有的對話結構,貼進 Gemini,它就會生成一份可以直接匯入的資料夾方案——秒速整理。 **第一步:複製你的對話結構** 在擴充套件彈窗的資料夾區塊底部,點擊 **AI 整理** 按鈕。它會自動收集所有未歸類的對話和現有資料夾結構,生成提示詞並複製到剪貼簿。 AI Organize Button **第二步:讓 Gemini 來分類** 將剪貼簿內容貼進 Gemini 對話。它會分析你的聊天標題,然後輸出一份 JSON 資料夾方案。 **第三步:匯入結果** 在資料夾面板選單中點擊 **匯入資料夾**,選擇 **或直接貼上 JSON**,貼上 Gemini 回傳的 JSON,然後點擊 **匯入**。
Import Menu
Paste JSON Import
- **增量合併**:預設採用「合併」策略——只新增資料夾和分配,絕不破壞你現有的組織結構。 - **多語言支援**:提示詞會自動使用你設定的語言,資料夾名稱也會以該語言生成。 ### AI Studio 專屬增強 - **側邊欄調節**:鼠標拖拽邊緣,自由調整側邊欄寬度。 - **庫拖拽支持**:支持直接從 Library 列表中拖拽項目到資料夾。 ================================================ FILE: docs/zh_TW/guide/fork.md ================================================ # 對話分支 (實驗性) 思維不應是一條單行道。在複雜的探索中,我們常常需要回到某個關鍵節點,嘗試不同的可能性。 Voyager 帶來的 **對話分支** 功能,讓你能夠輕鬆發散思維,探索對話的平行宇宙。 ## 功能介紹 > **⚠️ 提示**:該功能目前處於實驗階段。你需要先點擊瀏覽器擴充功能圖示打開設定彈窗,並開啟 **啟用對話分支** 開關。 在任何你想要發散思緒的時刻,只需將滑鼠懸停在你的提問上,點擊 **對話分支** 按鈕: ![對話分支](/assets/branching.png) Voyager 會立刻截取從對話開頭到該節點的全部上下文,並為你 **開啟一段全新的對話**。 你可以在這個新分支中盡情修改提問,嘗試不同的方向,而不必擔心破壞原有的對話歷史。盡情釋放你的創造力與好奇心吧! ================================================ FILE: docs/zh_TW/guide/formula-copy.md ================================================ # 公式複製 Voyager 讓數學公式和科學符號的複用變得異常簡單。支持一鍵複製 LaTeX 源碼以及兼容 Microsoft Word 的 MathML 格式。 ## 功能介紹 當你要求 Gemini 推導公式或編寫數學表達式時,Gemini 通常會使用 LaTeX 渲染。雖然看起來很美觀,但如果你想將這些公式複製到自己的論文、文檔或編輯器中,往往需要手動提取源碼。 Voyager 為此提供了無縫支持: 1. **自動識別**:Voyager 會自動識別頁面中渲染出的 LaTeX 公式。 2. **複製按鈕**:當你將滑鼠懸停在公式上時,公式右側會出現複製圖標。 3. **格式選擇**:點擊複製圖標,你可以選擇: - **Copy LaTeX**: 複製標準的 LaTeX 源碼,適用於 Overleaf、Markdown 編輯器等。 - **Copy MathML**: 複製 MathML 源碼,這是最適合直接粘貼到 **Microsoft Word** 中的格式。 ![公式複製](/assets/gemini-math-copy.png) ## 特性 - **Word 完美兼容**:通過 MathML 支持,你可以將複雜的 AI 輸出公式直接粘貼進 Word 文檔,保持完美的可編輯公式格式。 - **上下文保留**:不僅複製公式本身,還保留了公式的數學語境。 - **極速響應**:完全在本地處理,點擊即得。 ## 使用技巧 - **論文寫作**:在 Word 中編寫論文時,讓 Gemini 推導公式,然後使用 MathML 複製並粘貼,省去手動在 Word 公式編輯器中輸入的煩惱。 - **代碼筆記**:在 Obsidian 或 Notion 中記筆記時,直接複製 LaTeX 源碼即可。 ================================================ FILE: docs/zh_TW/guide/getting-started.md ================================================ # 歡迎登船 恭喜。你的工作流剛剛升艙了。 Voyager 不只是工具,它是種習慣。給我 5 分鐘,帶你上手。 ## 1. 就位 還沒裝?去 [安裝指南](/zh_TW/guide/installation)。 裝好了?刷新 Gemini 頁面。變化立竿見影。 ## 2. 穿梭 聊個長的。比如聊聊漢字演變史,或者量子力學。 看右邊。 **那串點,就是你的導航圖。** - **指**:瞥一眼那會兒說了啥。 - **點**:瞬間穿越回去。 - **按**:長按加星,標記高光時刻。 別再滾輪滾到手酸。思維多快,你就多快。 ## 3. 歸檔 看左邊的聊天列表。 **資料夾來了。** 拎起一個聊天,拖進去,鬆手。 絲般順滑。嵌套、重命名,隨你心意。把腦子裡的雜亂清空,只留清爽。 ## 4. 珍藏 寫了個絕妙的提示詞?別讓它滑走。 點輸入框裡的 **✨ 圖標**。 存下來,打個標籤。 下次要用? 點一下圖標,搜一搜,插入。 這不是聊天,這是在沉澱你的數位資產。 --- **起飛。** 去深挖每個功能: - [玩轉時間軸](/zh_TW/guide/timeline) - [精通資料夾](/zh_TW/guide/folders) - [管理提示詞](/zh_TW/guide/prompts) - [掌握數據](/zh_TW/guide/export) ================================================ FILE: docs/zh_TW/guide/input-collapse.md ================================================ # 輸入框摺疊 輸入框為空時自動摺疊,獲得更多閱讀空間。點擊摺疊後的按鈕即可展開輸入。
輸入框摺疊
## 如何使用 1. 當輸入框為空且失去焦點時,會自動摺疊為一個簡潔的膠囊按鈕 2. 點擊膠囊按鈕即可展開輸入框,開始輸入 3. 也可以按 Ctrl/+I 快速展開輸入框 4. 在設置面板中可以開啟或關閉此功能(默認關閉) ================================================ FILE: docs/zh_TW/guide/installation.md ================================================ # 安裝 ::: info 新聞 🍎 **Safari 瀏覽器原生外掛已推出!** 現在支援完全免費且一鍵安裝。 ::: 選一條路。 > ⚠️ 提示詞管理器是唯一支持 Gemini™ 企業版的功能。 ## 1. 官方商店(推薦) 最簡單的方式,支持自動更新。 **Chrome / Brave / Opera / Vivaldi:** [從 Chrome 線上應用店安裝](https://chromewebstore.google.com/detail/kjdpnimcnfinmilocccippmododhceol?utm_source=github&utm_medium=docs&utm_campaign=organic_growth&utm_content=zh_tw) ::: warning ⚠️ Chrome Web Store 暫時不可用 由於商標版權問題,插件已正式改名為 **Voyager**,Chrome Web Store 審核仍在進行中,暫時無法使用。詳情見[此帖](https://x.com/Nag1ovo/status/2031561180213313944)。請使用下方 **Edge / Firefox** 或**手動安裝**。 ::: **Microsoft Edge:** [從 Microsoft Edge Add-ons 安裝](https://microsoftedge.microsoft.com/addons/detail/gemini-voyager/gibmkggjijalcjinbdhcpklodjkhhlne) **Firefox:** [從 Firefox Add-ons 安裝](https://addons.mozilla.org/firefox/addon/gemini-voyager/) ## 2. 手動(搶鮮版) 應用店審核慢。如果你追求最新功能,走這條路。 **Chrome / Edge / Brave / Opera:** 1. 去 [GitHub Releases](https://github.com/Nagi-ovo/gemini-voyager/releases) 下最新的 `gemini-voyager-chrome-vX.Y.Z.zip`。 2. 解壓。 3. 打開擴充功能頁 (`chrome://extensions`)。 4. 開 **開發者模式** (右上角)。 5. 點 **載入已解壓的擴充功能**,選剛才的資料夾。 **Firefox:** 1. 去 [Releases](https://github.com/Nagi-ovo/gemini-voyager/releases) 下最新的 `gemini-voyager-firefox-vX.Y.Z.xpi`。 2. 打開擴充功能管理頁 (`about:addons`)。 3. 把下載的 `.xpi` 文件拖進去安裝(或者點右上角齒輪 ⚙️ -> **從檔案安裝附加組件**)。 > 💡 XPI 文件已獲 Mozilla 官方簽名,可在所有 Firefox 版本中永久安裝。 ## 3. Safari (macOS) Safari 現在支持直接分發!下載預簽名的應用: 1. 下載 最新 Safari 版本 (.dmg)。 2. 雙擊打開後按提示安裝應用。 3. 雙擊啟動應用。 4. 在 **Safari 設置 > 擴充功能** 中啟用。 > 💡 Safari 版本現已直接簽名分發——不再需要 Xcode 轉換! > > ⚠️ **已知限制**:由於 Safari 特性,(a) 水印去除 (b) 圖片導出(推薦用 PDF)暫不支持。 --- _想貢獻代碼?開發者請移步 [貢獻指南](https://github.com/Nagi-ovo/gemini-voyager/blob/main/.github/CONTRIBUTING.md)。_ ================================================ FILE: docs/zh_TW/guide/markdown-fix.md ================================================ # Markdown 渲染修復 Gemini™ 的網頁介面有時會在文本中插入 HTML 元素(例如引用來源或高亮標記),這可能會破壞 Markdown 的加粗語法(`**text**`),導致文本無法正確加粗顯示。 Voyager 內置了自動修復功能,能夠智能識別並修復這些斷裂的加粗標籤,確保文檔渲染的整潔與準確。 > [!INFO] > 此功能為自動啟用,無需額外配置。 ================================================ FILE: docs/zh_TW/guide/mermaid.md ================================================ # Mermaid 圖表渲染 自動將 Mermaid 代碼渲染為可視化圖表。 ## 功能介紹 當 Gemini™ 輸出 Mermaid 代碼塊時(如流程圖、時序圖、甘特圖等),Voyager 會自動檢測並渲染為交互式圖表。 ### 主要特性 - **自動檢測**:支持 `graph`、`flowchart`、`sequenceDiagram`、`gantt`、`pie`、`classDiagram` 等所有主流 Mermaid 圖表類型 - **一鍵切換**:通過按鈕在渲染圖表和原始碼之間自由切換 - **全屏查看**:點擊圖表進入全屏模式,支持滾輪縮放和拖拽平移 - **深色模式**:自動適配頁面主題 ## 使用方法 1. 讓 Gemini 生成任意 Mermaid 圖表代碼 2. 代碼塊會自動替換為渲染後的圖表 3. 點擊 ** Code** 按鈕查看原始代碼 4. 點擊 **📊 Diagram** 按鈕切回圖表視圖 5. 點擊圖表區域進入全屏查看 ## 全屏模式操作 - **滾輪**:縮放圖表 - **拖拽**:移動圖表位置 - **+/-**:工具欄縮放按鈕 - **⊙**:重置視圖 - **✕ / ESC**:關閉全屏 ## 相容性與故障排除 ::: warning 說明 - **Firefox 限制**:由於環境限制,Firefox 使用 9.2.2 版本,暫不支援 **Timeline**、**Sankey** 等新特性。 - **語法錯誤**:渲染失敗通常是因為 Gemini 生成的代碼有語法錯誤。我們正在收集 Bad Case,後續將透過補丁自動修復常見的生成錯誤。 :::
Mermaid 圖表渲染
================================================ FILE: docs/zh_TW/guide/nanobanana.md ================================================ # NanoBanana 選項 ::: warning 瀏覽器相容性 目前 **NanoBanana** 去浮水印功能由於瀏覽器 API 限制,**暫不支持 Safari 瀏覽器**。如果您需要使用此功能,建議使用 **Chrome** 或 **Firefox**。 Safari 用戶可以將下載的圖片上傳到 [banana.ovo.re](https://banana.ovo.re/) 等工具網站進行手動去除(但由於 Gemini™ 圖片尺寸的多樣性,不能保證每張圖片都能成功還原)。 ::: **AI 圖片,本該純淨。** Gemini 生成的圖片默認帶有可見的水印。雖然這是出於安全考慮,但在某些創作場景下,你可能需要一張完全乾淨的底稿。 ## 無損還原 NanoBanana 採用的是 **反向 Alpha 混合算法 (Reverse Alpha Blending)**。 - **非 AI 重繪**:傳統的去水印往往使用 AI 塗抹,會破壞圖片細節。 - **像素級精度**:我們通過數學計算,將疊加在像素上的水印透明層精確移除,還原出 100% 原始的像素點。 - **零質量損失**:處理前後的圖片在非水印區域完全一致。 ## 如何使用 1. **開啟功能**:在 Voyager 設置面板最後方找到 「NanoBanana 選項」,開啟 「去除 NanoBanana 水印」。 2. **自動觸發**:此後你生成的每一張圖片,我們都會在後台自動完成去水印處理。 3. **直接下載**: - 懸停在處理後的圖片上,你會看到一個 🍌 按鈕。 - **🍌 按鈕已完全替代**了原生的下載按鈕,點擊即可直接下載 100% 無水印的圖片。
NanoBanana 示例
## 特別鳴謝 本功能基於 [journey-ad (Jad)](https://github.com/journey-ad) 開發的 [gemini-watermark-remover](https://github.com/journey-ad/gemini-watermark-remover) 項目。該項目是 [allenk](https://github.com/allenk) 開發的 [GeminiWatermarkTool C++ 版本](https://github.com/allenk/GeminiWatermarkTool) 的 JavaScript 移植版。感謝原作者們對開源社區的貢獻。🧡 ## 隱私與安全 所有的去水印處理均在你的 **瀏覽器本地** 完成。圖片不會被上傳到任何第三方伺服器,保護你的隱私和創作安全。 ================================================ FILE: docs/zh_TW/guide/prevent-auto-scroll.md ================================================ # 防自動跳轉 在查看過往對話時,如果您輸入了新問題並按下 Enter 鍵,Gemini™ 預設會將頁面強制滾動到最底部以顯示最新生成的回答。這可能會打斷您的閱讀體驗。 **防自動跳轉** 功能可以攔截這種不必要的滾動行為: - 當您向上滾動查看歷史紀錄時,系統會自動阻止頁面跳回底部。 - 此功能在擴充功能的「時間軸選項」設定中預設**關閉**,您可以手動前往擴充功能彈出視窗開啟。 ## 開啟方法 1. 點擊瀏覽器工具列的 Voyager 擴充功能圖示開啟彈出視窗。 2. 找到「時間軸選項(Timeline Options)」區域。 3. 開啟「防自動跳轉(Prevent Auto Scroll)」開關即可生效。 ================================================ FILE: docs/zh_TW/guide/prompts.md ================================================ # 你的數位資產:提示詞庫 磨了半天寫出個神級 Prompt,幫大忙了。 用完就丟? 不,存起來。 ## 指令寶庫 這是你的指令寶庫。 ### 1. 捕獲 寫出好東西了?點輸入框旁邊的 **浮窗圖標**。 存入庫中,落袋為安。 ### 2. 歸類 打上 `#代碼`、`#郵件`、`#學術` 的標籤。 工具要趁手,也要整潔。 ### 3. 調遣 下次要用,別再重敲。 打開庫,搜標籤,點一下插入。 一鍵調用,效率翻倍。 ![提示詞管理器](/assets/gemini-prompt-manager.png) ## 任何網站皆可用 提示詞管理器現在可以在您選擇的任何網站上使用,不僅限於 Gemini™ 和 AI Studio。 ### 如何啟用 1. 點擊瀏覽器擴充功能欄的 Voyager 圖標。 2. 滾動到 **提示詞管理器** 部分。 3. 輸入網站 URL(例如:`chatgpt.com` 或 `claude.ai`)。 4. 點擊 **添加網站** 並授予權限。 5. **刷新目標網頁**,即可看到懸浮球。 ### 常見 AI 網站示例 - `chatgpt.com` - ChatGPT - `claude.ai` - Claude - `copilot.microsoft.com` - Microsoft Copilot - `poe.com` - Poe ::: tip 在自定義網站上,**僅**激活提示詞管理器功能。時間線、資料夾等其他功能是專為 Gemini 設計的,不會加載。 ::: ================================================ FILE: docs/zh_TW/guide/quote-reply.md ================================================ # 引用回覆 Voyager 提供了便捷的「引用回覆」功能,讓針對特定內容的回覆更加精準高效。 ## 功能介紹 在日常對話中,我們經常需要針對 AI 輸出某一段具體內容進行追問或反駁。傳統的做法是複製那段話,然後在輸入框裡手打 `> ` 符號,非常繁瑣。 Voyager 簡化了這一流程: 1. **選中即引**:在對話頁面(無論是你的提問還是 Gemini 的回答)中,用滑鼠選中任意一段文字。 2. **懸浮按鈕**:選中文字附近會自動浮現一個「引用回覆」按鈕。 3. **一鍵插入**:點擊按鈕,選中的文字會自動以標準的 Markdown 引用格式(`> 內容`)插入到你的輸入框中。 ![引用回覆](/assets/quote-reply.png) ## 特性 - **上下文感知**:智能識別對話內容,避免在無關區域(如輸入框本身)誤觸發。 - **標準格式**:使用通用的 Markdown 語法,Gemini 可以完美理解這種引用結構,從而做出更精準的回應。 - **多行支持**:如果選中了多行文本,Voyager 會自動為每一行添加引用符號,保持格式整潔。 ## 使用技巧 - **追問細節**:選中 Gemini 回答中不清楚的某個概念,點擊引用,然後輸入「請詳細解釋一下這個概念」。 - **糾正錯誤**:選中回答中錯誤的代碼或事實,引用後指出「這裡不對,應該是...」。 ================================================ FILE: docs/zh_TW/guide/recents-hider.md ================================================ # 隱藏最近項目和 Gem ::: info **注意**:該功能僅在 1.1.9 及後續版本中支援。 ::: 為 Gemini™ 首頁的「最近保存」部分添加一個優雅的切換開關,讓界面更加簡潔。現在也支持隱藏側邊欄的 Gems 列表!

隱藏最近保存

隱藏 Gems 列表

## 功能特點 - **上下文切換**:僅在滑鼠懸停在「最近」區域時才顯示微妙的隱藏按鈕。 - **極簡狀態**:隱藏後,該區域會被底部的極簡「窺視條」取代。 - **一鍵恢復**:只需懸停在「窺視條」上並點擊即可立即恢復顯示。 - **隱私保護**:防止在公共场合或他人经过时泄露您最近的活动内容。 - **持久化**:您的偏好會被保存,並在下次訪問时自动应用。 ## 如何使用 1. 懸停在 Gemini 首頁的「最近」區域。 2. 點擊右上角出現的「隱藏」圖示(劃掉的眼睛)以折疊該區域。 3. 如需恢復,懸停在該區域底部留下的細線上並點擊。 ================================================ FILE: docs/zh_TW/guide/settings.md ================================================ # 隨心所欲 默認的已經很好。但我們要的是完美。 你的地盤,你做主。 ## 影院模式 為什麼要透過門縫看世界? 把聊天框拉大。 - **寬屏**:1400px。寫代碼、看大表,視野全開。 - **專注**:800px。沉浸閱讀,心無旁儐。 - **隨意**:拖動滑塊,你覺得多寬舒服,就多寬。 ## 掌控 點插件圖標,進控制台。 - **滾動**:自然順滑,還是經典手感? - **位置**:時間軸放哪順手,就放哪。 - **視覺特效**:可切換 `飄雪`、`櫻花`、`雨`,給頁面加一點氛圍感。 ## 自訂排序 控制台裡的功能區塊太多,常用的被埋在下面? 滑鼠懸停在任意功能卡片上,右上角會出現 ▲/▼ 按鈕。點一下,卡片就會上移或下移。調整後的順序自動保存,下次打開還是你的佈局。 ## 氛圍感 Voyager 不只是在做效率增強,也允許你順手把頁面氣質調對。 - **飄雪**:輕柔雪花緩慢飄落,適合安靜閱讀。 - **櫻花**:花瓣自然飄散,頁面會更輕盈。 - **雨**:電影感雨絲與細微水花,整體更有沉浸感。 - **平滑切換**:關閉特效或切換到另一種效果時,粒子會自然退場,不會突然消失。

打開設置

打開設置指南

調整視野

聊天寬度調整
================================================ FILE: docs/zh_TW/guide/sidebar-auto-hide.md ================================================ # 側邊欄自動收起 想要更加沉浸式的對話體驗? 我們提供了**自動收起側邊欄**的功能。開啟後,當您的滑鼠移出側邊欄區域時,它會自動收起;當您將滑鼠移入側邊欄區域時,它會自動展開。 ### 示範
### 如何開啟 1. 打開 Voyager 的設定面板。 2. 在 **通用設定** 中找到 **側邊欄自動收起** 開關。 3. 打開開關即可生效。 _注意:此功能目前僅支援 Google Gemini。_ ================================================ FILE: docs/zh_TW/guide/sidebar.md ================================================ # 側邊欄寬度 資料夾名稱太長,顯示不全? 或者覺得側邊欄太寬,佔用了寶貴的聊天空間? 現在,您可以自由調整側邊欄的寬度。 ## 如何調整 1. 打開 Voyager 的設定面板(點擊瀏覽器右上角的擴充功能圖示)。 如何打開設定面板 2. 在 **通用設定** 中找到 **側邊欄寬度** 選項。 3. 拖動滑桿,選擇您覺得最舒適的寬度。 - **窄**:節省空間,專注於對話。 - **寬**:完整顯示長資料夾名稱,一目瞭然。 ## 支援平台 此功能同時支援: - **Google Gemini** - **Google AI Studio** 您的設定會自動儲存,並在下次打開時生效。 ================================================ FILE: docs/zh_TW/guide/sponsor.md ================================================ # 贊助 > [!NOTE] > 如果 Voyager 有幫助,歡迎分享到 X、Facebook、YouTube、Threads、Dcard 等等。每一次分享都能讓更多人看見這個專案,從而改善 Gemini 的使用體驗。謝謝。 維護開源項目主要靠熱情(和咖啡)驅動 ☕ **[Voyager](https://github.com/Nagi-ovo/gemini-voyager)** 是一個完全免費且開源的瀏覽器擴充功能,旨在提升你的 Gemini 使用體驗。如果這個擴充功能幫助你更高效地使用 Gemini,歡迎通過以下方式支持我繼續開發和維護這個項目。 --- ## 在線平台 愛發電 ### 🎙️ 特別推薦: Typeless 我非常推薦 **[Typeless (typeless.com)](https://www.typeless.com/?via=gemini-voyager)** 這款 AI 語音輸入工具。在開發 Voyager 的過程中,我將其整合進了日常工作流,極大地節省了我的時間並顯著提升了整體開發效率。 > 🎁 **[點擊我的邀請連結註冊](https://www.typeless.com/?via=gemini-voyager)**(邀請碼 _`gemini-voyager`_)即可獲得 **5 美元免費額度**,同時也能支持本項目的開發。❤️ --- ## 掃碼投喂 🍵
微信支付 微信支付
支付寶 支付寶
--- 感謝你的支持!你的每一份貢獻都是對我最大的鼓勵 ❤️ ================================================ FILE: docs/zh_TW/guide/tab-title.md ================================================ # 標籤頁標題同步 自動將瀏覽器標籤頁標題同步為當前 Gemini™ 對話的標題。 ## 功能介紹 - **即時同步**:當對話標題發生變化時(例如 AI 生成了新標題或你手動重命名了對話),瀏覽器標籤頁標題不僅僅是 "Gemini",而是會立即更新為具體的對話內容。 - **多頁面支持**:完美支持普通的對話頁面、Gem 對話以及多帳戶環境。 - **開關控制**:如果你不喜歡這個功能,可以在設置面板的「通用選項」中隨時關閉。
標籤頁標題同步
## 如何使用 1. 安裝擴充功能後,該功能默認開啟。 2. 打開任意 Gemini 對話,觀察瀏覽器標籤頁標題,它會自動變為當前的對話標題。 3. 若要關閉: - 點擊擴充功能圖標打開設置面板。 - 找到「通用選項」 (General Options)。 - 關閉「同步標籤頁標題」 (Update Tab Title) 開關。 ================================================ FILE: docs/zh_TW/guide/timeline.md ================================================ # 時間旅行 長對話是災難。上上下下,找不著北。 Voyager 把對話變成一條線。 ## 看見節奏 看螢幕右側。 每個點都是一句話。那是你對話的脈搏。 ## 導航,一步到位 - **瞬移**:點哪去哪,絕不拖泥帶水。 - **偷看**:滑鼠放上去,不用跳轉也能看內容。 - **插眼**:長按節點 **加星**。給大腦打個書籤。 - **層級 (實驗性)**:右鍵點擊節點,設置不同層級(1-3 級)或摺疊子節點。讓深度分支對話一目了然。 - **快捷鍵**:用鍵盤飛速穿梭。默認 `j`/`k` 上下跳轉,想改就改。 ![時間軸導航](/assets/teaser.png) ## 鍵盤,更快 不想用滑鼠?用鍵盤。 **就像在 Gemini 裡開了 Vim Mode。** ### 默認快捷鍵 - `k` - 跳到上一個節點 - `j` - 跳到下一個節點 ### 自定義 打開擴充功能設置,點擊快捷鍵框,按下你想用的鍵。 任意鍵,任意組合。`n`/`p`?`,`/`.`?隨你。 **流動模式**下連按會排隊播放動畫。 **跳躍模式**下立即響應,速度拉滿。 ================================================ FILE: docs/zh_TW/index.md ================================================ --- layout: home hero: name: 'Voyager' text: '終於,它完整了。' tagline: '思維有形,萬物歸位。' image: src: /logo.png alt: Voyager Logo actions: - theme: brand text: 下載安裝 link: ./guide/installation - theme: alt text: 開始旅程 link: ./guide/getting-started teaser: title: '重新定義交互。' description: '我們不造擴充功能,我們重塑思考。
用 Voyager,不再是人適應介面,而是介面順應心流。' image: '/assets/teaser.png' features: - title: '時間軸' details: '看見對話的脈搏。
讓線性的時間,變成可觸摸的空間。' - title: '資料夾' details: '給思想安個家。
哪怕是一閃而過的念頭,也值得被鄭重對待。' - title: '掌控權' details: '數據歸你。
打破雲端的圍牆,讓知識真正屬於你。' features: - icon: 🧭 title: 時間軸 details: 別滾屏,去飛。瞬間抵達思維的任何落點。 - icon: 🗂️ title: 資料夾 details: 告別混沌。原生手感,直覺操作,井井有條。 - icon: ✨ title: 指令寶庫 details: 捕捉靈光。珍藏你的每一次神來之筆。 - icon: 💬 title: 引用回覆 details: 選中即引。上下文精確回覆,溝通更高效。 - icon: ↔️ title: 對話寬度 details: 視野全開。自由調節對話框寬度,程式碼表格完整呈現。 - icon: 💾 title: 對話導出 details: 數據歸你。多種格式一鍵存檔,知識不再流失。 - icon: 🌦️ title: 視覺特效 details: 頁面也有情緒。可在彈窗中切換飄雪、下雨與櫻花花瓣效果。 - icon: 🍌 title: NanoBanana 水印去除 details: 無損去水印。讓 AI 生成的瞬間回歸純淨。 - icon: 📐 title: 公式複製 details: 一鍵複製 LaTeX 和 MathML (Word) 源碼。 - icon: 🧜‍♀️ title: Mermaid 圖表 details: 代碼變圖表。流程圖、時序圖、甘特圖一鍵可視化。 - icon: 🏷️ title: 標籤頁標題同步 details: 一眼即知。自動將標籤頁標題同步為對話標題。 - icon: 🔀 title: 對話分支 (實驗性) details: 發散思維。在任意節點分叉對話,探索不同可能。 - icon: 🗑️ title: 批次刪除對話 details: 一鍵清理。選中多個對話,批次刪除,告別繁瑣。 - icon: ☁️ title: 雲同步 details: 永遠在線。資料夾與提示詞庫同步至 Google Drive,多裝置無縫銜接。 - icon: ⚡️ title: 預設模型 details: 拒絕重複勞動。新建對話自動切換至你最愛的模型。 - icon: 🔬 title: Deep Research details: 拆開黑箱。一鍵提取 Deep Research 的思考過程與研究連結。 ---
⚠️ 改名公告:由於商標版權問題,本插件已正式改名為 Voyager。但由於 Chrome Web Store 審核速度極慢,七天內未能完成名稱更新審核,暫時無法在 Chrome Web Store 使用。

每一次下載,都是信任的刻度

來自 Chrome Web Store 與 GitHub 的實時數據。致敬每一位與我們同行的 Voyager。

GitHub Star GitHub Fork 最新版本 GitHub 下載量 Chrome 商店用戶數 Chrome 商店評分 Edge 商店 Firefox 商店用戶數 Firefox 商店評分
Nagi-ovo%2Fgemini-voyager | Trendshift

特別鳴謝

✨ 我們已在 Product Hunt 上線!歡迎來分享你的想法和反饋。❤️

Voyager on Product Hunt

“它不只是工具,更是伴你思維遠航的夥伴。”

探索更多 →

================================================ FILE: docs/zh_TW/privacy.md ================================================ # 隱私政策 最後更新:2026年3月16日 ## 簡介 Voyager(以下簡稱「我們」)致力於保護您的隱私。本隱私政策說明了我們的瀏覽器擴充功能如何收集、使用和保護您的資訊。 ## 資料收集與使用 **我們不收集任何個人資訊。** Voyager 完全在您的瀏覽器本地運作。擴充功能產生或管理的所有資料(如資料夾、提示詞範本、星標訊息和設定)均儲存在: 1. 您的本地裝置上(`chrome.storage.local`) 2. 您的瀏覽器同步儲存空間中(`chrome.storage.sync`,如可用),以便在您的裝置間同步設定。 我們無法存取您的個人資料、聊天記錄或其他任何隱私資訊。我們也不會追蹤您的瀏覽歷史。 ## Google Drive 同步(選用) 如果您主動啟用 Google Drive 同步功能,擴充功能會使用 Chrome Identity API 取得 OAuth2 權杖(僅限 `drive.file` 範圍),將您的資料夾和提示詞備份到**您自己的 Google Drive**。此傳輸直接發生在您的瀏覽器和 Google 伺服器之間。我們無法存取此資料,且絕不會傳送到我們營運的任何伺服器。 ## 權限說明 本擴充功能僅申請維持功能所需的最小權限: - **Storage(儲存)**:用於在本地和跨裝置儲存您的偏好設定、資料夾、提示詞、星標訊息和介面自訂選項。 - **Identity(身分驗證)**:用於 Google Drive 同步功能的 Google 驗證。僅在您主動啟用雲端同步時使用。 - **Scripting(腳本注入)**:用於在 Gemini 頁面及使用者指定的自訂網站上動態注入內容腳本(提示詞管理器功能)。僅注入擴充功能自身打包的腳本,不會載入或執行任何遠端程式碼。 - **Host Permissions(主機權限)**(gemini.google.com、aistudio.google.com 等):用於注入增強 Gemini 介面的內容腳本,提供資料夾、匯出、時間線、引用回覆等功能。Google 相關網域(googleapis.com、accounts.google.com)用於 Google Drive 同步驗證。 - **Optional Host Permissions(選用主機權限)**(所有 URL):僅在您主動新增提示詞管理器的自訂網站時按需請求,不會在未經您操作的情況下啟用。 ## 第三方服務 Voyager 不會與任何第三方服務、廣告商或分析提供商共享資料。 ## 政策變更 我們可能會不時更新隱私政策。我們將透過在此頁面發佈新的隱私政策來通知您任何變更。 ## 聯絡我們 如果您對本隱私政策有任何疑問,請透過我們的 [GitHub 儲存庫](https://github.com/Nagi-ovo/gemini-voyager) 聯絡我們。 ================================================ FILE: eslint.config.js ================================================ import tsPlugin from '@typescript-eslint/eslint-plugin'; import tsParser from '@typescript-eslint/parser'; import prettierConfig from 'eslint-config-prettier'; import reactPlugin from 'eslint-plugin-react'; import reactHooks from 'eslint-plugin-react-hooks'; export default [ // Global ignores { ignores: [ 'dist_*/**', 'node_modules/**', 'docs/.vitepress/cache/**', 'docs/.vitepress/dist/**', 'coverage/**', 'gemini-voyager-sync/**', 'gemini-voyager-formal/**', '.github/sponsors/**', 'public/**', 'safari/Models/**', 'Gemini Voyager/**', ], }, // TypeScript/React files { files: ['**/*.{ts,tsx,js,jsx}'], languageOptions: { parser: tsParser, ecmaVersion: 'latest', sourceType: 'module', parserOptions: { ecmaFeatures: { jsx: true, }, }, }, plugins: { '@typescript-eslint': tsPlugin, react: reactPlugin, 'react-hooks': reactHooks, }, settings: { react: { version: 'detect' }, }, rules: { // React rules 'react/react-in-jsx-scope': 'off', 'react/prop-types': 'off', // React Hooks rules 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn', // TypeScript rules '@typescript-eslint/no-unused-vars': [ 'warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', }, ], '@typescript-eslint/no-explicit-any': 'warn', // General best practices 'no-console': ['warn', { allow: ['warn', 'error'] }], // NOTE: Import ordering is handled by Prettier's @trivago/prettier-plugin-sort-imports // Do NOT add 'import/order' rule here - it will conflict with Prettier! }, }, // Disable all formatting rules that conflict with Prettier // This MUST be the last config to override other rules prettierConfig, ]; ================================================ FILE: manifest.dev.json ================================================ { "action": { "default_icon": "public/dev-icon-32.png", "default_popup": "src/pages/popup/index.html" }, "icons": { "128": "public/dev-icon-128.png" }, "web_accessible_resources": [ { "resources": [ "contentStyle.css", "dev-icon-128.png", "dev-icon-32.png", "icon-32.png", "icon-128.png", "fetchInterceptor.js", "prevent-auto-scroll.js", "assets/*.js", "assets/*.png" ], "matches": [""] } ], "content_scripts": [ { "matches": [ "https://gemini.google.com/*", "https://business.gemini.google/*", "https://aistudio.google.com/*", "https://aistudio.google.cn/*" ], "js": ["src/pages/content/index.tsx"], "css": ["contentStyle.css"] } ], "host_permissions": [ "https://gemini.google.com/*", "https://business.gemini.google/*", "https://aistudio.google.com/*", "https://aistudio.google.cn/*", "https://*.googleapis.com/*", "https://accounts.google.com/*", "https://*.googleusercontent.com/*", "https://lh3.google.com/*", "https://*.ggpht.com/*" ], "optional_host_permissions": ["https://*/*", "http://*/*"], "background": { "service_worker": "src/pages/background/index.ts", "type": "module" }, "version": "1.3.6" } ================================================ FILE: manifest.json ================================================ { "manifest_version": 3, "default_locale": "en", "name": "__MSG_extName__", "description": "__MSG_extDescription__", "version": "1.3.6", "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqyGtKj1peaqzYlrf+cu2b9PKAapZJ7FCuIAh9N8ZQf0c9NKgt2R0G6t+QwXtmqNBFqnerqZrzVgH37cjK93Nt+/WCMCFksGH48nxKAGNpYzeALQnqa7s1fHVMleIGuHSQmKMqzT9YBy9hLqzK2DhX1jQPQBOiSLnhsqhGHTaoTEArerCopHmjfu3Ksl9paXFX/1ybi9HG3MnJKSY3X9m2+zbe370ntUEYxWTBN91ikKRveB1w6U5KqaMNFka2XblzN7nAajWjSLGUdZNpbcF1gC9MKnu3oZsABh65zFmiZeW21vUGUrsJt7mgkLcoV2/gjQCXEtsk23Ty/b+ZTNxWwIDAQAB", "action": { "default_popup": "src/pages/popup/index.html", "default_icon": { "32": "icon-32.png" } }, "browser_specific_settings": { "gecko": { "id": "gemini-voyager@nagi-ovo", "strict_min_version": "109.0" } }, "options_ui": { "page": "src/pages/options/index.html", "open_in_tab": true }, "icons": { "128": "icon-128.png" }, "permissions": ["storage", "identity", "scripting"], "oauth2": { "client_id": "462948120910-vvunu0k3b4vi37u23mqnh77mbgdjcg78.apps.googleusercontent.com", "scopes": ["https://www.googleapis.com/auth/drive.file"] }, "host_permissions": [ "https://gemini.google.com/*", "https://business.gemini.google/*", "https://aistudio.google.com/*", "https://aistudio.google.cn/*", "https://*.googleapis.com/*", "https://accounts.google.com/*", "https://*.googleusercontent.com/*", "https://lh3.google.com/*", "https://*.ggpht.com/*" ], "optional_host_permissions": ["https://*/*", "http://*/*"], "content_security_policy": { "extension_pages": "script-src 'self'; object-src 'self'; worker-src 'self'" }, "background": { "service_worker": "src/pages/background/index.ts", "type": "module" }, "content_scripts": [ { "matches": [ "https://gemini.google.com/*", "https://business.gemini.google/*", "https://aistudio.google.com/*", "https://aistudio.google.cn/*" ], "js": ["src/pages/content/index.tsx"], "css": ["contentStyle.css"] } ], "web_accessible_resources": [ { "resources": [ "contentStyle.css", "icon-128.png", "icon-32.png", "katex-config.js", "fetchInterceptor.js", "prevent-auto-scroll.js", "assets/*.js", "assets/*.png" ], "matches": [""] } ] } ================================================ FILE: nodemon.chrome.json ================================================ { "env": { "__DEV__": "true" }, "watch": [ "src", "utils", "vite.config.base.ts", "vite.config.chrome.ts", "manifest.json", "manifest.dev.json" ], "ext": "tsx,css,html,ts,json", "ignore": ["src/**/*.spec.ts"], "exec": "npx vite build --config vite.config.chrome.ts --mode development" } ================================================ FILE: nodemon.firefox.json ================================================ { "env": { "__DEV__": "true" }, "watch": [ "src", "utils", "vite.config.base.ts", "vite.config.firefox.ts", "manifest.json", "manifest.dev.json" ], "ext": "tsx,css,html,ts,json", "ignore": ["src/**/*.spec.ts"], "exec": "vite build --config vite.config.firefox.ts --mode development" } ================================================ FILE: nodemon.safari.json ================================================ { "watch": [ "src", "public", "vite.config.safari.ts", "vite.config.base.ts", "manifest.json", "manifest.dev.json" ], "ext": "ts,tsx,js,jsx,json,css,html", "exec": "vite build --config vite.config.safari.ts --mode development --watch", "env": { "__DEV__": "true" } } ================================================ FILE: package.json ================================================ { "name": "gemini-voyager", "version": "1.3.6", "description": "Supercharge your Gemini experience with timeline navigation, folder organization, prompt vault, and chat export.", "license": "GPL-3.0", "author": "Jesse Zhang", "repository": { "type": "git", "url": "https://github.com/Nagi-ovo/gemini-voyager.git" }, "scripts": { "bump": "bun scripts/bump-version.js", "build": "vite build --config vite.config.chrome.ts", "build:chrome": "vite build --config vite.config.chrome.ts", "build:edge": "bun scripts/build-edge.js", "build:firefox": "vite build --config vite.config.firefox.ts", "build:safari": "vite build --config vite.config.safari.ts", "build:all": "bun run build:chrome && bun run build:firefox && bun run build:safari", "dev": "nodemon --config nodemon.chrome.json", "dev:chrome": "nodemon --config nodemon.chrome.json", "dev:chrome-open": "bun scripts/launch-chrome.cjs", "dev:firefox": "nodemon --config nodemon.firefox.json", "dev:safari": "nodemon --config nodemon.safari.json", "test": "vitest run", "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", "test:watch": "vitest watch", "lint": "eslint . --fix", "format": "prettier --write .", "typecheck": "tsc --noEmit", "commitlint": "commitlint --edit $GIT_PARAMS", "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", "docs:preview": "vitepress preview docs", "sponsors:update": "bun run scripts/generate-sponsors.cjs" }, "type": "module", "dependencies": { "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "dompurify": "^3", "html-to-image": "^1.11.13", "jszip": "^3.10.1", "katex": "^0.16", "lucide-react": "^0.553.0", "marked": "16.4.1", "marked-katex-extension": "^4", "mermaid": "11.12.2", "mermaid-legacy": "npm:mermaid@9.2.2", "prettier": "^3.6.2", "react": "^19.1.0", "react-dom": "^19.1.0", "tailwind-merge": "^3.3.1", "temml": "^0.13.1", "webextension-polyfill": "^0.12.0" }, "devDependencies": { "@crxjs/vite-plugin": "2.2.1", "@nolebase/vitepress-plugin-git-changelog": "^2.18.2", "@tailwindcss/vite": "^4.1.15", "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/chrome": "^0.1.24", "@types/jsdom": "^27.0.0", "@types/jszip": "^3.4.1", "@types/node": "^24.9.0", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@types/webextension-polyfill": "^0.12.3", "@typescript-eslint/eslint-plugin": "8.46.2", "@typescript-eslint/parser": "^8.46.2", "@vitejs/plugin-react": "5.1.0", "@vitest/coverage-v8": "^4.0.6", "@vitest/ui": "^4.0.6", "eslint": "^9.38.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "7.0.1", "fs-extra": "^11.3.0", "jsdom": "^27.1.0", "nodemon": "^3.1.10", "prettier-plugin-tailwindcss": "^0.7.2", "tailwindcss": "^4.1.15", "ts-node": "^10.9.2", "typescript": "^5.8.3", "vite": "^7.1.11", "vite-tsconfig-paths": "^5.1.4", "vitepress": "^1.6.4", "vitest": "^4.0.6", "vue": "^3.5.24", "vue3-marquee": "^4.2.2", "web-ext-run": "^0.2.4" }, "overrides": { "rollup": "^4.24.0" } } ================================================ FILE: public/contentStyle.css ================================================ .gv-pm-panel, .gv-pm-trigger, .gv-pm-header, .gv-pm-list, .gv-pm-item, .gv-pm-chip, .gv-pm-tag, .gv-pm-footer, .gv-pm-search input, .gv-pm-input-text, .gv-pm-input-tags, .gv-pm-import-btn, .gv-pm-export-btn, .gv-pm-save, .gv-pm-cancel, .gv-pm-settings { -webkit-user-select: none; user-select: none; } .gv-pm-input-text, .gv-pm-input-tags { -webkit-user-select: text; user-select: text; box-sizing: border-box; width: 100%; } /* Gemini-like timeline styling with CSS variables and theme awareness */ :root { --timeline-dot-color: #94a3b8; --timeline-dot-active-color: oklch(0.55 0.17 155); --timeline-star-color: #f59e0b; --timeline-tooltip-bg: #ffffff; --timeline-tooltip-text: #0f172a; --timeline-tooltip-border: #e2e8f0; --timeline-tooltip-radius: 14px; --timeline-tooltip-shadow: 0 12px 36px rgba(2, 8, 23, 0.18), 0 3px 8px rgba(2, 8, 23, 0.08); --timeline-tooltip-lh: 18px; --timeline-tooltip-pad-y: 10px; --timeline-tooltip-pad-x: 12px; --timeline-tooltip-border-w: 1px; --timeline-tooltip-arrow-size: 8px; --timeline-tooltip-arrow-outside: 4px; --timeline-tooltip-anim-in: 140ms cubic-bezier(0.2, 0.8, 0.2, 1); --timeline-tooltip-anim-out: 100ms linear; --timeline-bar-bg: rgba(248, 250, 252, 0.88); --timeline-dot-size: 12px; --timeline-active-ring: 3px; --timeline-track-padding: 16px; --timeline-tooltip-max: 288px; --timeline-min-gap: 24px; --timeline-hit-size: 30px; --timeline-tooltip-gap-visual: 8px; --timeline-tooltip-gap-box: 4px; --timeline-hold-ms: 550ms; } @media (prefers-color-scheme: dark) { :root { --timeline-dot-color: #475569; --timeline-dot-active-color: oklch(0.7 0.16 155); --timeline-star-color: #f59e0b; --timeline-tooltip-bg: #0b1220; --timeline-tooltip-text: #e2e8f0; --timeline-tooltip-border: #1f2937; --timeline-bar-bg: rgba(2, 6, 23, 0.75); } } /* Gemini theme support - Overrides system preferences on Gemini site */ .theme-host.dark-theme { --timeline-dot-color: #475569; --timeline-dot-active-color: oklch(0.7 0.16 155); --timeline-star-color: #f59e0b; --timeline-tooltip-bg: #0b1220; --timeline-tooltip-text: #e2e8f0; --timeline-tooltip-border: #1f2937; --timeline-bar-bg: rgba(2, 6, 23, 0.75); } .theme-host.light-theme { --timeline-dot-color: #94a3b8; --timeline-dot-active-color: oklch(0.55 0.17 155); --timeline-star-color: #f59e0b; --timeline-tooltip-bg: #ffffff; --timeline-tooltip-text: #0f172a; --timeline-tooltip-border: #e2e8f0; --timeline-bar-bg: rgba(248, 250, 252, 0.88); } /* Gemini theme hosts — background moved to ::before pseudo-element */ .theme-host.dark-theme .gemini-timeline-bar:not(.timeline-no-container)::before { background-color: rgba(2, 6, 23, 0.72); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); } .theme-host.light-theme .gemini-timeline-bar:not(.timeline-no-container)::before { background-color: rgba(248, 250, 252, 0.85); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); } .gemini-timeline-bar { position: fixed; top: 60px; right: 15px; width: 24px; height: calc(100vh - 100px); z-index: 2147483646; display: flex; flex-direction: column; align-items: center; border-radius: 12px; overflow: visible; contain: layout; pointer-events: none; } /* Visual background layer — width adjustable via edge drag, dots unaffected */ .gemini-timeline-bar::before { content: ''; position: absolute; top: 0; bottom: 0; left: 50%; transform: translateX(-50%); width: var(--timeline-bar-width, 24px); border-radius: calc(var(--timeline-bar-width, 24px) / 2); background-color: var(--timeline-bar-bg); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); box-shadow: 0 2px 12px oklch(0 0 0 / 0.06); transition: background-color 0.3s ease, width 0.2s ease, border-radius 0.2s ease; pointer-events: auto; } /* Disable transitions during active resize for immediate feedback */ .gemini-timeline-bar.timeline-resizing::before { transition: none !important; } /* Prevent text selection during resize drag */ .gemini-timeline-bar.timeline-resizing { user-select: none; -webkit-user-select: none; } .timeline-track { position: relative; width: 100%; height: 100%; overflow-y: auto; overflow-x: visible; background: transparent; padding-left: 2px; padding-right: 2px; } .timeline-track-content { position: relative; width: 100%; height: 100%; } .timeline-dot { position: absolute; left: 50%; top: calc( var(--timeline-track-padding) + (100% - 2 * var(--timeline-track-padding)) * var(--n, 0) ); transform: translate(-50%, -50%); width: var(--timeline-hit-size); height: var(--timeline-hit-size); background: transparent; border: none; cursor: pointer; padding: 0; pointer-events: auto; } .timeline-dot::after { content: ''; position: absolute; left: 50%; top: 50%; width: var(--timeline-dot-size); height: var(--timeline-dot-size); transform: translate(-50%, -50%); border-radius: 50%; background-color: var(--timeline-dot-color); transition: transform 0.15s ease, box-shadow 0.15s ease; } /* true punch-through: remove filled dot and draw only inner stroke to make host page visible */ html.dark .timeline-track, [data-theme='dark'] .timeline-track, [data-color-scheme='dark'] .timeline-track { background: transparent; } html.dark .timeline-dot:not(.active):not(.starred)::after, [data-theme='dark'] .timeline-dot:not(.active):not(.starred)::after, [data-color-scheme='dark'] .timeline-dot:not(.active):not(.starred)::after { background: #000; box-shadow: none; } .timeline-dot:hover::after { transform: translate(-50%, -50%) scale(1.15); } .timeline-dot:focus-visible::after { box-shadow: 0 0 6px var(--timeline-dot-active-color); } .timeline-dot.active::after { box-shadow: 0 0 0 var(--timeline-active-ring) var(--timeline-dot-active-color), 0 0 14px oklch(0.55 0.17 155 / 0.5); } .timeline-dot.starred::after { background-color: var(--timeline-star-color); } /* ===== Timeline Marker Levels (shape-based: circle, triangle, square) ===== */ .timeline-dot[data-level='1']::after { width: var(--timeline-dot-size); height: var(--timeline-dot-size); border-radius: 50%; clip-path: none; } .timeline-dot[data-level='2']::after { width: var(--timeline-dot-size); height: var(--timeline-dot-size); border-radius: 0; clip-path: none; } .timeline-dot[data-level='3']::after { width: var(--timeline-dot-size); height: var(--timeline-dot-size); border-radius: 0; clip-path: polygon(50% 0%, 0% 100%, 100% 100%); } /* ===== Timeline Context Menu ===== */ .timeline-context-menu { position: fixed; background-color: var(--timeline-tooltip-bg); border: 1px solid var(--timeline-tooltip-border); border-radius: 8px; box-shadow: var(--timeline-tooltip-shadow); padding: 4px 0; z-index: 2147483647; min-width: 160px; animation: timeline-menu-in 0.12s ease-out; } @keyframes timeline-menu-in { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } .timeline-context-menu-title { padding: 8px 12px 4px 12px; font-size: 11px; font-weight: 600; color: var(--timeline-tooltip-text); opacity: 0.6; text-transform: uppercase; letter-spacing: 0.5px; border-bottom: 1px solid var(--timeline-tooltip-border); margin-bottom: 4px; } .timeline-context-menu-item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 8px 12px; border: none; background: transparent; color: var(--timeline-tooltip-text); font-size: 13px; cursor: pointer; text-align: left; transition: background-color 0.1s ease; } .timeline-context-menu-item:hover { background-color: var(--timeline-dot-active-color); } .timeline-context-menu-item.active { background-color: var(--timeline-dot-active-color); font-weight: 500; } .timeline-context-menu-item .level-indicator { width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; } .timeline-context-menu-item .level-dot { width: 10px; height: 10px; background-color: var(--timeline-dot-color); } /* Level 1: Circle */ .timeline-context-menu-item[data-level='1'] .level-dot { border-radius: 50%; clip-path: none; } /* Level 2: Square */ .timeline-context-menu-item[data-level='2'] .level-dot { border-radius: 0; clip-path: none; } /* Level 3: Triangle */ .timeline-context-menu-item[data-level='3'] .level-dot { border-radius: 0; clip-path: polygon(50% 0%, 0% 100%, 100% 100%); } .timeline-context-menu-item .check-icon { margin-left: auto; color: var(--timeline-dot-active-color); font-size: 14px; } /* Context menu separator */ .timeline-context-menu-separator { height: 1px; background-color: var(--timeline-tooltip-border); margin: 4px 0; } /* Collapse menu item */ .timeline-context-menu-item.collapse-item { margin-top: 2px; } .timeline-context-menu-item .collapse-icon { font-size: 12px; color: var(--timeline-dot-color); transition: transform 0.2s ease; } /* Collapsed dot style - visual indicator */ .timeline-dot.collapsed::before { content: ''; position: absolute; left: 50%; top: 50%; width: calc(var(--timeline-dot-size) + 10px); height: calc(var(--timeline-dot-size) + 10px); transform: translate(-50%, -50%); border-radius: 50%; border: 2px dashed var(--timeline-dot-active-color); opacity: 0.5; pointer-events: none; } .timeline-dot.holding::before { content: ''; position: absolute; left: 50%; top: 50%; width: calc(var(--timeline-dot-size) + 8px); height: calc(var(--timeline-dot-size) + 8px); transform: translate(-50%, -50%); border-radius: 50%; box-shadow: 0 0 0 2px var(--timeline-dot-active-color) inset; opacity: 0.15; animation: timeline-hold-fade var(--timeline-hold-ms) linear forwards; pointer-events: none; } @keyframes timeline-hold-fade { from { opacity: 0.15; } to { opacity: 0.85; } } .timeline-tooltip { position: fixed; max-width: var(--timeline-tooltip-max); background-color: var(--timeline-tooltip-bg); color: var(--timeline-tooltip-text); padding: var(--timeline-tooltip-pad-y) var(--timeline-tooltip-pad-x); border-radius: var(--timeline-tooltip-radius); border: var(--timeline-tooltip-border-w) solid var(--timeline-tooltip-border); font-size: 13px; font-family: 'Google Sans', Roboto, Arial, sans-serif; line-height: var(--timeline-tooltip-lh); max-height: calc( 3 * var(--timeline-tooltip-lh) + 2 * var(--timeline-tooltip-pad-y) + 2 * var(--timeline-tooltip-border-w) ); box-shadow: var(--timeline-tooltip-shadow); pointer-events: none; z-index: 2147483647; display: -webkit-box; -webkit-line-clamp: 3; line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; word-break: break-word; white-space: pre-line; text-align: start; unicode-bidi: plaintext; opacity: 0; will-change: opacity, transform; transition: opacity var(--timeline-tooltip-anim-in); } .timeline-tooltip.visible { opacity: 1; animation: timeline-tooltip-in var(--timeline-tooltip-anim-in); } @media (prefers-reduced-motion: reduce) { .timeline-tooltip, .timeline-tooltip.visible { transition: opacity 120ms linear; transform: none !important; } } .timeline-tooltip[data-placement='left'] { transform-origin: right center; } .timeline-tooltip[data-placement='right'] { transform-origin: left center; } @keyframes timeline-tooltip-in { from { transform: scale(0.96); } to { transform: scale(1); } } .timeline-tooltip::after { content: ''; position: absolute; width: var(--timeline-tooltip-arrow-size); height: var(--timeline-tooltip-arrow-size); background: var(--timeline-tooltip-bg); border: var(--timeline-tooltip-border-w) solid var(--timeline-tooltip-border); transform: rotate(45deg); } .timeline-tooltip[data-placement='left']::after { right: calc(-1 * var(--timeline-tooltip-arrow-outside)); top: 50%; transform: translateY(-50%) rotate(45deg); border-left: none; border-bottom: none; } .timeline-tooltip[data-placement='right']::after { left: calc(-1 * var(--timeline-tooltip-arrow-outside)); top: 50%; transform: translateY(-50%) rotate(45deg); border-right: none; border-top: none; } .timeline-track::-webkit-scrollbar { width: 0; height: 0; } .timeline-track { scrollbar-width: none; } .timeline-left-slider { position: fixed; top: 0; width: 12px; height: 160px; opacity: 0; transition: opacity 180ms ease; z-index: 2147483646; pointer-events: none; } .timeline-left-slider.visible { opacity: 1; pointer-events: auto; } .timeline-left-slider::before { content: ''; position: absolute; left: 5px; top: 0; bottom: 0; width: 2px; background: rgba(0, 0, 0, 0.08); border-radius: 9999px; } html.dark .timeline-left-slider::before { background: rgba(255, 255, 255, 0.1); } .timeline-left-handle { position: absolute; left: 2px; width: 8px; height: 22px; background: rgba(16, 163, 127, 0.28); border-radius: 9999px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); pointer-events: auto; cursor: grab; transition: background-color 120ms ease; } .timeline-left-handle:hover { background: rgba(16, 163, 127, 0.45); } .timeline-left-handle:active { cursor: grabbing; } .timeline-runner-ring { will-change: top, opacity; } .gemini-timeline-bar.timeline-no-container { contain: none; } .gemini-timeline-bar.timeline-no-container::before { opacity: 0 !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; box-shadow: none !important; } /* ── Timeline Preview Panel ── */ .timeline-preview-toggle { position: fixed; width: 24px; height: 24px; display: inline-flex; align-items: center; justify-content: center; background: var(--timeline-bar-bg); border: 1px solid var(--timeline-tooltip-border); cursor: pointer; padding: 0; color: var(--timeline-dot-color); border-radius: 6px; transition: color 0.15s ease, background-color 0.15s ease, opacity 0.15s ease; z-index: 2147483646; opacity: 0; } .gemini-timeline-bar:hover ~ .timeline-preview-toggle, .timeline-preview-toggle:hover, .timeline-preview-toggle.active { opacity: 1; } .timeline-preview-toggle:hover { color: var(--timeline-dot-active-color); background-color: var(--timeline-tooltip-bg); } .timeline-preview-toggle.active { color: var(--timeline-dot-active-color); background-color: var(--timeline-tooltip-bg); } .timeline-preview-panel { position: fixed; width: 320px; direction: ltr; font-family: 'Google Sans', Roboto, Arial, sans-serif; background-color: var(--timeline-tooltip-bg); border: 1px solid var(--timeline-tooltip-border); border-radius: var(--timeline-tooltip-radius); box-shadow: var(--timeline-tooltip-shadow); z-index: 2147483645; display: flex; flex-direction: column; opacity: 0; transform: scale(0.96) translateX(8px); transition: opacity var(--timeline-tooltip-anim-in), transform var(--timeline-tooltip-anim-in); pointer-events: none; overflow: hidden; } .timeline-preview-panel.visible { opacity: 1; transform: scale(1) translateX(0); pointer-events: auto; } .timeline-preview-search { padding: 8px 10px; border-bottom: 1px solid var(--timeline-tooltip-border); flex-shrink: 0; } .timeline-preview-search input { width: 100%; box-sizing: border-box; border: 1px solid var(--timeline-tooltip-border); border-radius: 6px; padding: 5px 8px; font-family: inherit; font-size: 13px; line-height: 1.4; background: transparent; color: var(--timeline-tooltip-text); text-align: start; outline: none; transition: border-color 0.15s ease; } .timeline-preview-search input::placeholder { color: var(--timeline-dot-color); opacity: 0.7; } .timeline-preview-search input:focus { border-color: var(--timeline-dot-active-color); } .timeline-preview-list { flex: 1; overflow-y: auto; overscroll-behavior: contain; padding: 4px 0; max-height: calc(100% - 42px); } .timeline-preview-item { padding: 6px 10px 6px 6px; cursor: pointer; color: var(--timeline-tooltip-text); font-size: 13px; line-height: 1.4; border-left: 3px solid transparent; display: flex; align-items: baseline; gap: 6px; transition: background-color 0.1s ease; } .timeline-preview-item:hover { background-color: rgba(59, 130, 246, 0.08); } .timeline-preview-item.active { border-left-color: var(--timeline-dot-active-color); background-color: rgba(59, 130, 246, 0.1); } .timeline-preview-item.starred .timeline-preview-index::after { content: '\2605'; margin-inline-start: 2px; color: var(--timeline-star-color); font-size: 11px; } .timeline-preview-starred-time { flex-shrink: 0; font-size: 10px; color: var(--timeline-star-color); margin-inline-start: 6px; white-space: nowrap; opacity: 0.8; } .timeline-preview-index { display: inline-flex; align-items: center; justify-content: flex-start; flex-shrink: 0; font-size: 11px; color: var(--timeline-dot-color); min-width: 14px; text-align: left; } .timeline-preview-text { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: start; unicode-bidi: plaintext; } .timeline-preview-empty { padding: 16px 12px; text-align: center; color: var(--timeline-dot-color); font-size: 13px; } /* Search highlights — preview panel */ .timeline-preview-highlight { background-color: rgba(59, 130, 246, 0.2); color: inherit; border-radius: 2px; padding: 0; pointer-events: none; } /* Search highlights — SPA conversation page */ mark.timeline-search-highlight { background-color: oklch(0.55 0.17 155 / 0.3); color: inherit; border-radius: 3px; padding: 0 1px; } /* Dark theme adjustments for preview panel */ .theme-host.dark-theme .timeline-preview-panel { background-color: rgba(11, 18, 32, 0.95); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); } .theme-host.dark-theme .timeline-preview-item:hover { background-color: rgba(96, 165, 250, 0.08); } .theme-host.dark-theme .timeline-preview-item.active { background-color: rgba(96, 165, 250, 0.12); } .theme-host.dark-theme .timeline-preview-highlight { background-color: rgba(96, 165, 250, 0.25); } .theme-host.dark-theme mark.timeline-search-highlight { background-color: oklch(0.7729 0.1535 163.2231 / 0.3); } .theme-host.light-theme .timeline-preview-panel { background-color: rgba(255, 255, 255, 0.95); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); } /* Prompt Manager styles (scoped) */ .gv-pm-trigger { position: fixed; right: 18px; bottom: 18px; width: 46px; height: 46px; border-radius: 9999px; display: inline-flex; align-items: center; justify-content: center; background: linear-gradient(135deg, oklch(0.55 0.17 155), oklch(0.58 0.18 162)); border: 1.5px solid oklch(0.55 0.17 155 / 0.6); box-shadow: 0 6px 24px oklch(0.55 0.17 155 / 0.35), 0 2px 8px oklch(0.55 0.17 155 / 0.2), inset 0 1px 0 oklch(1 0 0 / 0.15); color: #fff; z-index: 998; cursor: pointer; transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .gv-pm-trigger:hover { transform: scale(1.08) translateY(-1px); box-shadow: 0 10px 32px oklch(0.55 0.17 155 / 0.45), 0 4px 12px oklch(0.55 0.17 155 / 0.3), inset 0 1px 0 oklch(1 0 0 / 0.2); } .gv-pm-trigger:active { transform: scale(0.94); } .theme-host.light-theme .gv-pm-trigger { background: linear-gradient(135deg, oklch(0.55 0.17 155), oklch(0.58 0.18 162)); border-color: oklch(0.55 0.17 155 / 0.6); } .theme-host.dark-theme .gv-pm-trigger { background: linear-gradient(135deg, oklch(0.7 0.16 155), oklch(0.55 0.17 155)); border-color: oklch(0.7 0.16 155 / 0.6); } /* AI Studio body theme classes */ body.light-theme .gv-pm-trigger, html.light-theme .gv-pm-trigger { background: rgba(248, 250, 252, 0.9); color: #111827; border-color: rgba(0, 0, 0, 0.15); } body.dark-theme .gv-pm-trigger, html.dark-theme .gv-pm-trigger { background: rgba(17, 24, 39, 0.75); color: #fff; border-color: rgba(255, 255, 255, 0.15); } .gv-pm-trigger img { pointer-events: none; } /* Changelog badge on trigger */ .gv-pm-trigger-new::after { content: 'NEW'; position: absolute; top: -8px; right: -6px; padding: 2px 6px; border-radius: 8px; font-size: 9px; font-weight: 800; letter-spacing: 0.06em; line-height: 1.3; color: oklch(0.95 0.02 95); background: linear-gradient(120deg, oklch(0.76 0.18 50), oklch(0.68 0.2 30)); box-shadow: 0 4px 12px oklch(0 0 0 / 0.16); animation: gv-pm-float 1.8s ease-in-out infinite; pointer-events: none; white-space: nowrap; z-index: 1; } @media (prefers-color-scheme: dark) { .gv-pm-trigger-new::after { background: linear-gradient(120deg, oklch(0.72 0.18 45), oklch(0.62 0.2 28)); color: oklch(0.98 0.01 96); box-shadow: 0 6px 16px oklch(0 0 0 / 0.24); } } /* Logo hover dropdown for export */ .gv-logo-dropdown-wrapper { position: relative; display: inline-flex; align-items: center; width: fit-content; max-width: max-content; pointer-events: none; } .gv-logo-dropdown-wrapper [data-test-id='logo'], .gv-logo-dropdown-wrapper .logo { pointer-events: auto; } /* Invisible bridge between logo and dropdown so hover doesn't break in the gap */ .gv-logo-dropdown-wrapper::after { content: ''; position: absolute; top: 100%; left: 0; right: 0; height: 12px; pointer-events: none; } .gv-logo-dropdown-wrapper:hover::after { pointer-events: auto; } .gv-logo-dropdown { position: absolute; top: 100%; left: 0; margin-top: 4px; padding: 4px; min-width: 140px; background: rgba(255, 255, 255, 0.95); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid rgba(0, 0, 0, 0.08); border-radius: 12px; box-shadow: 0 4px 24px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08); opacity: 0; visibility: hidden; transform: translateY(-8px) scale(0.96); transform-origin: top left; transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), visibility 0.2s cubic-bezier(0.4, 0, 0.2, 1), transform 0.2s cubic-bezier(0.4, 0, 0.2, 1); transition-delay: 0.12s; z-index: 9999; pointer-events: none; } .gv-logo-dropdown-wrapper:hover .gv-logo-dropdown, .gv-logo-dropdown:hover { opacity: 1; visibility: visible; transform: translateY(0) scale(1); pointer-events: auto; transition-delay: 0.05s; } .gv-export-dropdown-btn { display: flex; align-items: center; gap: 10px; width: 100%; padding: 10px 14px; border: none; border-radius: 8px; cursor: pointer; background: transparent; color: #1f2937; font-size: 14px; font-weight: 500; font-family: inherit; text-align: left; transition: background-color 0.15s ease, color 0.15s ease; } .gv-export-dropdown-btn:hover { background: oklch(0.55 0.17 155 / 0.1); } .gv-export-dropdown-btn:active { background: oklch(0.55 0.17 155 / 0.16); } .gv-export-dropdown-icon { width: 18px; height: 18px; display: block; flex-shrink: 0; background: currentColor; -webkit-mask: url('data:image/svg+xml,%3csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22%3e%3cpath fill=%22%23000%22 d=%22M12 3a1 1 0 011 1v8.586l2.293-2.293a1 1 0 111.414 1.414l-4.007 4.007a1 1 0 01-1.414 0L7.279 11.707a1 1 0 011.414-1.414L11 12.586V4a1 1 0 011-1zm-7 14a1 1 0 011-1h12a1 1 0 011 1v2a2 2 0 01-2 2H7a2 2 0 01-2-2v-2z%22/%3e%3c/svg%3e') center / contain no-repeat; mask: url('data:image/svg+xml,%3csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22%3e%3cpath fill=%22%23000%22 d=%22M12 3a1 1 0 011 1v8.586l2.293-2.293a1 1 0 111.414 1.414l-4.007 4.007a1 1 0 01-1.414 0L7.279 11.707a1 1 0 011.414-1.414L11 12.586V4a1 1 0 011-1zm-7 14a1 1 0 011-1h12a1 1 0 011 1v2a2 2 0 01-2 2H7a2 2 0 01-2-2v-2z%22/%3e%3c/svg%3e') center / contain no-repeat; } .gv-export-dropdown-label { white-space: nowrap; } /* Dark theme support */ html.dark-theme .gv-logo-dropdown, body.dark-theme .gv-logo-dropdown, .theme-host.dark-theme .gv-logo-dropdown { background: rgba(30, 30, 30, 0.95); border-color: rgba(255, 255, 255, 0.1); box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.3); } html.dark-theme .gv-export-dropdown-btn, body.dark-theme .gv-export-dropdown-btn, .theme-host.dark-theme .gv-export-dropdown-btn { color: #e5e7eb; } html.dark-theme .gv-export-dropdown-btn:hover, body.dark-theme .gv-export-dropdown-btn:hover, .theme-host.dark-theme .gv-export-dropdown-btn:hover { background: oklch(0.7 0.16 155 / 0.14); } /* Add subtle indicator on logo when hovering */ .gv-logo-dropdown-wrapper [data-test-id='logo']::after { content: ''; display: inline-block; width: 0; height: 0; margin-left: 4px; border-left: 4px solid transparent; border-right: 4px solid transparent; border-top: 4px solid currentColor; opacity: 0; transform: translateY(-2px); transition: opacity 0.2s ease, transform 0.2s ease; vertical-align: middle; } .gv-logo-dropdown-wrapper:hover [data-test-id='logo']::after { opacity: 0.5; transform: translateY(0); } .gv-pm-panel { position: fixed; display: flex; flex-direction: column; width: 440px; max-width: calc(100vw - 20px); max-height: min(75vh, 600px); overflow: hidden; --gv-pm-surface: oklch(0.995 0.002 250); border-radius: 18px; background: oklch(0.995 0.002 250); border: 1px solid oklch(0.92 0.004 250 / 0.7); box-shadow: 0 16px 48px oklch(0 0 0 / 0.12), 0 6px 20px oklch(0 0 0 / 0.06); z-index: 999; color: oklch(0.14 0.004 285); font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji'; } @media (prefers-color-scheme: dark) { .gv-pm-panel { --gv-pm-surface: oklch(0.2 0.008 285); background: oklch(0.2 0.008 285); color: oklch(0.92 0.004 250); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 16px 48px oklch(0 0 0 / 0.4), 0 6px 20px oklch(0 0 0 / 0.25); } } .theme-host.dark-theme .gv-pm-panel, body.dark-theme .gv-pm-panel { --gv-pm-surface: oklch(0.2 0.008 285); background: oklch(0.2 0.008 285); color: oklch(0.92 0.004 250); border-color: oklch(0.3 0.008 285 / 0.7); } .theme-host.light-theme .gv-pm-panel, body.light-theme .gv-pm-panel { --gv-pm-surface: oklch(0.995 0.002 250); background: oklch(0.995 0.002 250); color: oklch(0.14 0.004 285); border-color: oklch(0.92 0.004 250 / 0.7); } .gv-hidden { display: none !important; } .gv-pm-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 18px; gap: 6px; border-bottom: 1px solid oklch(0.92 0.004 250 / 0.5); cursor: default; } @media (prefers-color-scheme: dark) { .gv-pm-header { border-bottom-color: oklch(0.3 0.008 285 / 0.5); } } .gv-pm-title { font-weight: 800; font-size: 17px; letter-spacing: -0.02em; color: oklch(0.14 0.004 285); flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; position: relative; z-index: 1; } @media (prefers-color-scheme: dark) { .gv-pm-title { color: oklch(0.92 0.004 250); } } .theme-host.dark-theme .gv-pm-title, body.dark-theme .gv-pm-title { color: oklch(0.92 0.004 250); } .theme-host.light-theme .gv-pm-title, body.light-theme .gv-pm-title { color: oklch(0.14 0.004 285); } .gv-pm-title-row { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; } .gv-pm-version { display: inline-flex; align-items: center; gap: 4px; padding: 3px 9px; flex-shrink: 0; position: relative; border-radius: 999px; background: oklch(0.95 0.004 250 / 0.6); color: oklch(0.4 0.006 250); font-size: 12px; font-weight: 700; letter-spacing: 0.01em; text-decoration: none; border: 1px solid oklch(0.92 0.004 250 / 0.5); box-shadow: 0 1px 4px oklch(0 0 0 / 0.04); transition: transform 120ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 160ms ease, background 160ms ease, border-color 160ms ease; white-space: nowrap; } .gv-pm-version:hover { transform: translateY(-1px); box-shadow: 0 4px 12px oklch(0 0 0 / 0.08); border-color: oklch(0.55 0.17 155 / 0.4); background: oklch(0.95 0.004 250 / 0.8); } .gv-pm-version-outdated { border-color: oklch(0.55 0.17 155 / 0.6); } .gv-pm-version-outdated::after { content: 'NEW'; position: absolute; top: -14px; right: -2px; transform: translateX(35%); padding: 3px 7px; border-radius: 10px; font-size: 10px; font-weight: 800; letter-spacing: 0.06em; color: oklch(0.95 0.02 95); background: linear-gradient(120deg, oklch(0.76 0.18 50), oklch(0.68 0.2 30)); box-shadow: 0 8px 18px oklch(0 0 0 / 0.16); animation: gv-pm-float 1.8s ease-in-out infinite; pointer-events: none; white-space: nowrap; } @keyframes gv-pm-float { 0%, 100% { transform: translateY(0); opacity: 1; } 50% { transform: translateY(-2px); opacity: 0.92; } } @media (prefers-color-scheme: dark) { .gv-pm-title-row { color: oklch(0.92 0.004 250); } .gv-pm-version { background: oklch(0.26 0.008 285 / 0.7); color: oklch(0.72 0.006 250); border-color: oklch(0.3 0.008 285 / 0.6); box-shadow: 0 1px 4px oklch(0 0 0 / 0.2); } .gv-pm-version:hover { border-color: oklch(0.7 0.16 155 / 0.5); background: oklch(0.28 0.008 285 / 0.8); } .gv-pm-version-outdated::after { background: linear-gradient(120deg, oklch(0.72 0.18 45), oklch(0.62 0.2 28)); color: oklch(0.98 0.01 96); box-shadow: 0 6px 16px oklch(0 0 0 / 0.3); } } .theme-host.dark-theme .gv-pm-version, body.dark-theme .gv-pm-version { background: oklch(0.26 0.008 285 / 0.7); color: oklch(0.72 0.006 250); border-color: oklch(0.3 0.008 285 / 0.6); box-shadow: 0 1px 4px oklch(0 0 0 / 0.2); } .theme-host.dark-theme .gv-pm-version:hover, body.dark-theme .gv-pm-version:hover { border-color: oklch(0.7 0.16 155 / 0.5); background: oklch(0.28 0.008 285 / 0.8); } .gv-pm-header .gv-pm-controls { margin-left: auto; } .gv-pm-drag { margin-left: 4px; margin-right: 8px; } .gv-pm-controls { display: inline-flex; gap: 6px; align-items: center; } .gv-pm-lang { background: oklch(0.995 0.002 250); color: oklch(0.38 0.006 250); border: 1px solid oklch(0.92 0.004 250); border-radius: 10px; padding: 6px 10px; font-size: 12px; font-weight: 500; box-shadow: 0 1px 3px oklch(0 0 0 / 0.05); transition: all 0.2s ease; } .gv-pm-lang:hover { border-color: oklch(0.55 0.17 155 / 0.4); box-shadow: 0 2px 6px oklch(0 0 0 / 0.06); } .theme-host.light-theme .gv-pm-lang, body.light-theme .gv-pm-lang { background: oklch(0.995 0.002 250); color: oklch(0.38 0.006 250); border-color: oklch(0.92 0.004 250); } .theme-host.light-theme .gv-pm-lang:hover, body.light-theme .gv-pm-lang:hover { border-color: oklch(0.55 0.17 155 / 0.4); box-shadow: 0 2px 6px oklch(0 0 0 / 0.06); } .theme-host.dark-theme .gv-pm-lang, body.dark-theme .gv-pm-lang { background: oklch(0.24 0.008 285); color: oklch(0.72 0.006 250); border-color: oklch(0.3 0.008 285); } .theme-host.dark-theme .gv-pm-lang:hover, body.dark-theme .gv-pm-lang:hover { border-color: oklch(0.7 0.16 155 / 0.4); } @media (prefers-color-scheme: dark) { .gv-pm-lang { background: oklch(0.24 0.008 285); color: oklch(0.72 0.006 250); border-color: oklch(0.3 0.008 285); } .gv-pm-lang:hover { border-color: oklch(0.7 0.16 155 / 0.4); } } .gv-pm-lock { width: 32px; height: 32px; border-radius: 10px; background: oklch(0.995 0.002 250); border: 1px solid oklch(0.92 0.004 250); position: relative; box-shadow: 0 1px 3px oklch(0 0 0 / 0.05); transition: all 0.2s ease; } .gv-pm-lock::before { content: attr(data-icon); position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; } .gv-pm-lock:hover { background: oklch(0.96 0.003 250); border-color: oklch(0.55 0.17 155 / 0.3); } .gv-pm-lock.active { background: oklch(0.94 0.015 155); border-color: oklch(0.55 0.17 155); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.1); } .theme-host.light-theme .gv-pm-lock, body.light-theme .gv-pm-lock { background: oklch(0.995 0.002 250); border-color: oklch(0.92 0.004 250); } .theme-host.light-theme .gv-pm-lock:hover, body.light-theme .gv-pm-lock:hover { background: oklch(0.96 0.003 250); border-color: oklch(0.55 0.17 155 / 0.3); } .theme-host.light-theme .gv-pm-lock.active, body.light-theme .gv-pm-lock.active { background: oklch(0.94 0.015 155); border-color: oklch(0.55 0.17 155); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.1); } .theme-host.dark-theme .gv-pm-lock, body.dark-theme .gv-pm-lock { background: oklch(0.24 0.008 285); border-color: oklch(0.3 0.008 285); } .theme-host.dark-theme .gv-pm-lock:hover, body.dark-theme .gv-pm-lock:hover { background: oklch(0.28 0.008 285); border-color: oklch(0.7 0.16 155 / 0.3); } .theme-host.dark-theme .gv-pm-lock.active, body.dark-theme .gv-pm-lock.active { background: oklch(0.28 0.008 285); border-color: oklch(0.7 0.16 155); box-shadow: 0 0 0 3px oklch(0.7 0.16 155 / 0.1); } @media (prefers-color-scheme: dark) { .gv-pm-lock { background: oklch(0.24 0.008 285); border-color: oklch(0.3 0.008 285); } .gv-pm-lock:hover { background: oklch(0.28 0.008 285); border-color: oklch(0.7 0.16 155 / 0.3); } .gv-pm-lock.active { background: oklch(0.28 0.008 285); border-color: oklch(0.7 0.16 155); box-shadow: 0 0 0 3px oklch(0.7 0.16 155 / 0.1); } } .gv-pm-add { height: 33px; border-radius: 10px; padding: 0 16px; background: oklch(0.55 0.17 155); color: oklch(0.99 0.01 155); border: none; font-weight: 700; box-shadow: 0 3px 10px oklch(0.55 0.17 155 / 0.35); transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); position: relative; overflow: hidden; } .gv-pm-add::before { content: ''; position: absolute; top: 50%; left: 50%; width: 0; height: 0; border-radius: 50%; background: rgba(255, 255, 255, 0.5); transform: translate(-50%, -50%); transition: width 0.6s, height 0.6s; } .gv-pm-add:active::before { width: 300px; height: 300px; transition: width 0s, height 0s; } .gv-pm-add:hover { background: oklch(0.6 0.2 158); box-shadow: 0 6px 18px oklch(0.55 0.17 155 / 0.45); transform: translateY(-2px); } .gv-pm-add:active { transform: translateY(0); } @media (prefers-color-scheme: dark) { .gv-pm-add { background: oklch(0.7 0.16 155); color: oklch(0.15 0.025 160); } .gv-pm-add:hover { background: oklch(0.7 0.2 155); } } .gv-pm-search { padding: 10px 16px; } .gv-pm-search input[type='search'] { width: 100%; border-radius: 10px; background: rgba(31, 41, 55, 0.5); color: #e5e7eb; border: 1.5px solid rgba(255, 255, 255, 0.08); padding: 9px 12px; font-size: 13px; box-sizing: border-box; transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease; outline: none; } .gv-pm-search input[type='search']:focus { border-color: oklch(0.55 0.17 155 / 0.5); background: rgba(31, 41, 55, 0.7); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.1); } .theme-host.light-theme .gv-pm-search input[type='search'], body.light-theme .gv-pm-search input[type='search'] { background: rgba(0, 0, 0, 0.04); color: #1f2937; border: 1.5px solid rgba(0, 0, 0, 0.08); } .theme-host.light-theme .gv-pm-search input[type='search']:focus, body.light-theme .gv-pm-search input[type='search']:focus { border-color: oklch(0.55 0.17 155 / 0.5); background: rgba(0, 0, 0, 0.02); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.08); } .theme-host.light-theme .gv-pm-search input[type='search']::placeholder, body.light-theme .gv-pm-search input[type='search']::placeholder { color: #6b7280; opacity: 0.7; } .theme-host.dark-theme .gv-pm-search input[type='search'], body.dark-theme .gv-pm-search input[type='search'] { background: rgba(31, 41, 55, 0.5); color: #e5e7eb; border: 1.5px solid rgba(255, 255, 255, 0.08); } .theme-host.dark-theme .gv-pm-search input[type='search']:focus, body.dark-theme .gv-pm-search input[type='search']:focus { border-color: oklch(0.7 0.16 155 / 0.5); background: rgba(31, 41, 55, 0.7); box-shadow: 0 0 0 3px oklch(0.7 0.16 155 / 0.1); } .theme-host.dark-theme .gv-pm-search input[type='search']::placeholder, body.dark-theme .gv-pm-search input[type='search']::placeholder { color: #9ca3af; opacity: 0.7; } .gv-pm-tags-wrap { position: relative; padding: 0 16px 8px 16px; } .gv-pm-tags-wrap::before { content: ''; position: absolute; left: 12px; right: 12px; bottom: 8px; height: 22px; background: linear-gradient(to bottom, oklch(0 0 0 / 0), var(--gv-pm-surface)); pointer-events: none; opacity: 0; transition: opacity 0.2s ease; } .gv-pm-tags-wrap.gv-pm-tags-scrollable:not(.gv-pm-tags-scroll-end)::before { opacity: 1; } .gv-pm-tags { display: flex; flex-wrap: wrap; gap: 6px; max-height: min(24vh, 180px); overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; } .gv-pm-tags-scroll-hint { position: absolute; right: 18px; bottom: 10px; width: 20px; height: 20px; border-radius: 9999px; display: grid; place-items: center; font-size: 12px; line-height: 1; background: oklch(0.2 0.008 285 / 0.72); color: oklch(0.92 0.004 250); box-shadow: 0 4px 10px oklch(0 0 0 / 0.2); pointer-events: none; opacity: 0; transform: translateY(2px); transition: opacity 0.2s ease, transform 0.2s ease; } .gv-pm-tags-wrap.gv-pm-tags-scrollable:not(.gv-pm-tags-scroll-end) .gv-pm-tags-scroll-hint { opacity: 0.9; transform: translateY(0); } .gv-pm-tag { border-radius: 9999px; padding: 4px 10px; font-size: 12px; font-weight: 500; background: rgba(55, 65, 81, 0.4); color: rgba(229, 231, 235, 0.8); border: none; transition: all 0.15s ease; } .gv-pm-tag:hover { background: rgba(55, 65, 81, 0.6); color: #e5e7eb; } .gv-pm-tag.active { background: oklch(0.55 0.17 155 / 0.18); color: oklch(0.85 0.1 155); font-weight: 600; } .theme-host.light-theme .gv-pm-tag, body.light-theme .gv-pm-tag { background: rgba(0, 0, 0, 0.05); color: rgba(31, 41, 55, 0.7); border: none; } .theme-host.light-theme .gv-pm-tag:hover, body.light-theme .gv-pm-tag:hover { background: rgba(0, 0, 0, 0.08); color: #1f2937; } .theme-host.light-theme .gv-pm-tag.active, body.light-theme .gv-pm-tag.active { background: oklch(0.55 0.17 155 / 0.12); color: oklch(0.4 0.15 155); } .theme-host.dark-theme .gv-pm-tag, body.dark-theme .gv-pm-tag { background: rgba(55, 65, 81, 0.4); color: rgba(229, 231, 235, 0.8); border: none; } .theme-host.dark-theme .gv-pm-tag:hover, body.dark-theme .gv-pm-tag:hover { background: rgba(55, 65, 81, 0.6); color: #e5e7eb; } .theme-host.dark-theme .gv-pm-tag.active, body.dark-theme .gv-pm-tag.active { background: oklch(0.7 0.16 155 / 0.18); color: oklch(0.85 0.1 155); } .gv-pm-add-form { padding: 10px 16px 14px 16px; display: grid; gap: 8px; } .gv-pm-input-text { width: 100%; resize: vertical; min-height: 68px; max-height: 200px; border-radius: 10px; background: rgba(31, 41, 55, 0.5); color: #e5e7eb; border: 1.5px solid rgba(255, 255, 255, 0.08); padding: 9px 12px; font-size: 13px; line-height: 1.5; outline: none; transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease; } .gv-pm-input-text:focus { border-color: oklch(0.55 0.17 155 / 0.5); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.1); } .gv-pm-input-tags { width: 100%; border-radius: 10px; background: rgba(31, 41, 55, 0.5); color: #e5e7eb; border: 1.5px solid rgba(255, 255, 255, 0.08); padding: 9px 12px; font-size: 13px; outline: none; transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease; } .gv-pm-input-tags:focus { border-color: oklch(0.55 0.17 155 / 0.5); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.1); } .theme-host.light-theme .gv-pm-input-text, .theme-host.light-theme .gv-pm-input-tags, body.light-theme .gv-pm-input-text, body.light-theme .gv-pm-input-tags { background: rgba(0, 0, 0, 0.04); color: #1f2937; border: 1.5px solid rgba(0, 0, 0, 0.08); } .theme-host.light-theme .gv-pm-input-text:focus, .theme-host.light-theme .gv-pm-input-tags:focus, body.light-theme .gv-pm-input-text:focus, body.light-theme .gv-pm-input-tags:focus { border-color: oklch(0.55 0.17 155 / 0.5); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.08); } .theme-host.light-theme .gv-pm-input-text::placeholder, .theme-host.light-theme .gv-pm-input-tags::placeholder, body.light-theme .gv-pm-input-text::placeholder, body.light-theme .gv-pm-input-tags::placeholder { color: #6b7280; opacity: 0.7; } .theme-host.dark-theme .gv-pm-input-text, .theme-host.dark-theme .gv-pm-input-tags, body.dark-theme .gv-pm-input-text, body.dark-theme .gv-pm-input-tags { background: rgba(31, 41, 55, 0.5); color: #e5e7eb; border: 1.5px solid rgba(255, 255, 255, 0.08); } .theme-host.dark-theme .gv-pm-input-text:focus, .theme-host.dark-theme .gv-pm-input-tags:focus, body.dark-theme .gv-pm-input-text:focus, body.dark-theme .gv-pm-input-tags:focus { border-color: oklch(0.7 0.16 155 / 0.5); box-shadow: 0 0 0 3px oklch(0.7 0.16 155 / 0.1); } .theme-host.dark-theme .gv-pm-input-text::placeholder, .theme-host.dark-theme .gv-pm-input-tags::placeholder, body.dark-theme .gv-pm-input-text::placeholder, body.dark-theme .gv-pm-input-tags::placeholder { color: #9ca3af; opacity: 0.7; } .gv-pm-add-actions { display: flex; gap: 8px; justify-content: flex-end; } .gv-pm-inline-hint { margin-right: auto; font-size: 12px; color: #fca5a5; opacity: 0.95; } .gv-pm-inline-hint.ok { color: #86efac; } .gv-pm-save { background: oklch(0.55 0.17 155); color: oklch(0.99 0.01 155); border-radius: 9px; padding: 6px 12px; font-weight: 700; box-shadow: 0 2px 8px oklch(0.55 0.17 155 / 0.3); transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .gv-pm-save:hover { background: oklch(0.6 0.2 158); box-shadow: 0 4px 14px oklch(0.55 0.17 155 / 0.4); transform: translateY(-1px); } .theme-host.dark-theme .gv-pm-save, body.dark-theme .gv-pm-save { background: oklch(0.7 0.16 155); color: oklch(0.15 0.025 160); box-shadow: 0 2px 8px oklch(0.7 0.16 155 / 0.3); } .theme-host.dark-theme .gv-pm-save:hover, body.dark-theme .gv-pm-save:hover { background: oklch(0.7 0.2 155); box-shadow: 0 4px 14px oklch(0.7 0.16 155 / 0.4); } @media (prefers-color-scheme: dark) { .gv-pm-save { background: oklch(0.7 0.16 155); color: oklch(0.15 0.025 160); box-shadow: 0 2px 8px oklch(0.7 0.16 155 / 0.3); } .gv-pm-save:hover { background: oklch(0.7 0.2 155); box-shadow: 0 4px 14px oklch(0.7 0.16 155 / 0.4); } } .gv-pm-cancel { background: transparent; color: #e5e7eb; border-radius: 8px; padding: 6px 10px; border: 1px solid rgba(255, 255, 255, 0.12); } .gv-pm-cancel:hover { background: rgba(255, 255, 255, 0.06); } .theme-host.light-theme .gv-pm-cancel, body.light-theme .gv-pm-cancel { color: #1f2937; border: 1px solid rgba(0, 0, 0, 0.12); } .theme-host.light-theme .gv-pm-cancel:hover, body.light-theme .gv-pm-cancel:hover { background: rgba(0, 0, 0, 0.06); } .theme-host.dark-theme .gv-pm-cancel, body.dark-theme .gv-pm-cancel { color: #e5e7eb; border: 1px solid rgba(255, 255, 255, 0.12); } .theme-host.dark-theme .gv-pm-cancel:hover, body.dark-theme .gv-pm-cancel:hover { background: rgba(255, 255, 255, 0.06); } .gv-pm-list { padding: 6px 16px 12px 16px; min-height: 120px; flex: 1 1 auto; overflow: auto; } .gv-pm-empty { opacity: 0.5; font-size: 13px; padding: 24px 16px; text-align: center; line-height: 1.5; } .gv-pm-item { display: grid; grid-template-columns: 1fr; grid-template-rows: auto auto; gap: 6px; align-items: start; padding: 10px 12px; border-radius: 10px; border: none; background: rgba(255, 255, 255, 0.05); position: relative; transition: background 0.15s ease; } .gv-pm-item:hover { background: rgba(255, 255, 255, 0.09); } /* Hide action buttons by default, reveal on hover */ .gv-pm-item .gv-pm-actions { opacity: 0; transition: opacity 0.15s ease; } .gv-pm-item:hover .gv-pm-actions { opacity: 1; } .gv-pm-item-text-container { grid-column: 1; grid-row: 1; display: flex; align-items: flex-start; gap: 8px; width: 100%; } .gv-pm-item-text { background: transparent; border: none; padding: 0; color: #e5e7eb; text-align: left; white-space: normal; word-break: break-word; overflow-wrap: anywhere; flex: 1; min-width: 0; cursor: pointer; } .gv-pm-item-text:hover { opacity: 0.85; } .gv-md-collapsed { max-height: 7.5em; overflow: hidden; position: relative; display: -webkit-box; -webkit-line-clamp: 5; -webkit-box-orient: vertical; line-clamp: 5; } .gv-md-collapsed::after { content: '...'; position: absolute; right: 0; bottom: 0; padding-left: 1.5em; background: linear-gradient(to right, transparent, oklch(0.22 0.006 285) 50%); } /* Ensure markdown content overflow handling */ .gv-md { width: 100%; min-width: 0; } .gv-md pre, .gv-md code { white-space: pre-wrap; word-wrap: break-word; overflow-wrap: anywhere; max-width: 100%; } .gv-md pre { margin: 0; padding: 4px; background: rgba(0, 0, 0, 0.2); border-radius: 4px; } .theme-host.light-theme .gv-md pre, body.light-theme .gv-md pre { background: rgba(0, 0, 0, 0.05); } .theme-host.light-theme .gv-md-collapsed::after, body.light-theme .gv-md-collapsed::after { background: linear-gradient(to right, transparent, oklch(0.955 0.002 250) 50%); } .theme-host.dark-theme .gv-md-collapsed::after, body.dark-theme .gv-md-collapsed::after { background: linear-gradient(to right, transparent, oklch(0.22 0.006 285) 50%); } .gv-pm-expand-btn { background: transparent; border: none; color: rgba(156, 163, 175, 0.6); padding: 2px 4px; border-radius: 4px; font-size: 10px; cursor: pointer; flex-shrink: 0; transition: all 0.15s ease; line-height: 1; height: 20px; display: inline-flex; align-items: center; justify-content: center; } .gv-pm-expand-btn:hover { background: rgba(255, 255, 255, 0.06); color: #d1d5db; } .theme-host.light-theme .gv-pm-expand-btn, body.light-theme .gv-pm-expand-btn { border: none; color: rgba(107, 114, 128, 0.5); } .theme-host.light-theme .gv-pm-expand-btn:hover, body.light-theme .gv-pm-expand-btn:hover { background: rgba(0, 0, 0, 0.04); color: #374151; } .theme-host.dark-theme .gv-pm-expand-btn, body.dark-theme .gv-pm-expand-btn { border: none; color: rgba(156, 163, 175, 0.6); } .theme-host.dark-theme .gv-pm-expand-btn:hover, body.dark-theme .gv-pm-expand-btn:hover { background: rgba(255, 255, 255, 0.06); color: #d1d5db; } .theme-host.light-theme .gv-pm-item, body.light-theme .gv-pm-item { background: rgba(0, 0, 0, 0.04); border: none; } .theme-host.light-theme .gv-pm-item:hover, body.light-theme .gv-pm-item:hover { background: rgba(0, 0, 0, 0.07); } .theme-host.light-theme .gv-pm-item-text, body.light-theme .gv-pm-item-text { color: #1f2937; } .theme-host.dark-theme .gv-pm-item, body.dark-theme .gv-pm-item { background: rgba(255, 255, 255, 0.05); border: none; } .theme-host.dark-theme .gv-pm-item:hover, body.dark-theme .gv-pm-item:hover { background: rgba(255, 255, 255, 0.09); } .theme-host.dark-theme .gv-pm-item-text, body.dark-theme .gv-pm-item-text { color: #e5e7eb; } .gv-pm-edit, .gv-pm-del { width: 28px; height: 28px; border-radius: 8px; display: inline-flex; align-items: center; justify-content: center; padding: 0; border: none; transition: background 0.15s ease; } .gv-pm-edit { background: transparent; color: rgba(229, 231, 235, 0.5); } .gv-pm-edit:hover { background: rgba(255, 255, 255, 0.08); color: #e5e7eb; } .gv-pm-item + .gv-pm-item { margin-top: 4px; } .gv-pm-bottom { grid-row: 2; grid-column: 1; display: flex; align-items: center; justify-content: space-between; gap: 8px; } .gv-pm-item-meta { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; min-width: 0; } .gv-pm-chip { font-size: 10px; font-weight: 600; letter-spacing: 0.02em; border-radius: 999px; padding: 2px 8px; background: oklch(0.7 0.16 155 / 0.12); color: oklch(0.8 0.08 155); border: none; cursor: pointer; transition: all 0.15s ease; } .gv-pm-chip:hover { background: oklch(0.7 0.16 155 / 0.22); } .theme-host.light-theme .gv-pm-chip, body.light-theme .gv-pm-chip { background: oklch(0.55 0.17 155 / 0.08); color: oklch(0.4 0.12 155); border: none; } .theme-host.light-theme .gv-pm-chip:hover, body.light-theme .gv-pm-chip:hover { background: oklch(0.55 0.17 155 / 0.15); } .theme-host.dark-theme .gv-pm-chip, body.dark-theme .gv-pm-chip { background: oklch(0.7 0.16 155 / 0.12); color: oklch(0.8 0.08 155); border: none; } .gv-pm-actions { display: inline-flex; gap: 8px; } .gv-pm-del { background: transparent; color: rgba(229, 231, 235, 0.5); border: none; position: relative; } .gv-pm-del.armed { background: rgba(239, 68, 68, 0.2); color: #fca5a5; } .gv-pm-del:hover { background: rgba(239, 68, 68, 0.12); color: #fca5a5; } .theme-host.light-theme .gv-pm-edit, body.light-theme .gv-pm-edit { background: transparent; border: none; color: rgba(31, 41, 55, 0.4); } .theme-host.light-theme .gv-pm-edit:hover, body.light-theme .gv-pm-edit:hover { background: rgba(0, 0, 0, 0.06); color: #1f2937; } .theme-host.light-theme .gv-pm-del, body.light-theme .gv-pm-del { background: transparent; color: rgba(31, 41, 55, 0.4); border: none; } .theme-host.light-theme .gv-pm-del:hover, body.light-theme .gv-pm-del:hover { background: rgba(239, 68, 68, 0.08); color: #dc2626; } .theme-host.light-theme .gv-pm-del.armed, body.light-theme .gv-pm-del.armed { background: rgba(239, 68, 68, 0.15); color: #dc2626; } .theme-host.dark-theme .gv-pm-edit, body.dark-theme .gv-pm-edit { background: transparent; border: none; color: rgba(229, 231, 235, 0.5); } .theme-host.dark-theme .gv-pm-edit:hover, body.dark-theme .gv-pm-edit:hover { background: rgba(255, 255, 255, 0.08); color: #e5e7eb; } .theme-host.dark-theme .gv-pm-del, body.dark-theme .gv-pm-del { background: transparent; color: rgba(229, 231, 235, 0.5); border: none; } .theme-host.dark-theme .gv-pm-del:hover, body.dark-theme .gv-pm-del:hover { background: rgba(239, 68, 68, 0.12); color: #fca5a5; } .theme-host.dark-theme .gv-pm-del.armed, body.dark-theme .gv-pm-del.armed { background: rgba(239, 68, 68, 0.2); color: #fca5a5; } .gv-pm-edit::before, .gv-pm-del::before { content: ''; width: 16px; height: 16px; display: block; background: currentColor; -webkit-mask: var(--gv-icon) center / contain no-repeat; mask: var(--gv-icon) center / contain no-repeat; } .gv-pm-edit::before { --gv-icon: url('data:image/svg+xml,%3csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 16 16%22%3e%3cpath fill=%22%23000%22 d=%22M10.9 1.6l3.5 3.5-8.8 8.8H2v-3.6l8.9-8.7zM2 14h12v1H2z%22/%3e%3c/svg%3e'); } .gv-pm-del::before { --gv-icon: url('data:image/svg+xml,%3csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 16 16%22%3e%3cpath fill=%22%23000%22 d=%22M6 2h4l1 1h3v1H2V3h3l1-1zm-1 4h1v7H5V6zm3 0h1v7H8V6zm-2 0h1v7H6V6zm6 0l-1 8H5L4 6h8z%22/%3e%3c/svg%3e'); } .gv-pm-footer { display: flex; flex-direction: column; gap: 8px; padding: 12px 16px 14px 16px; border-top: 1px solid rgba(255, 255, 255, 0.06); } .theme-host.light-theme .gv-pm-footer, body.light-theme .gv-pm-footer { border-top: 1px solid rgba(0, 0, 0, 0.06); } .theme-host.dark-theme .gv-pm-footer, body.dark-theme .gv-pm-footer { border-top: 1px solid rgba(255, 255, 255, 0.06); } /* Footer button groups */ .gv-pm-footer-actions { display: flex; gap: 8px; width: 100%; } .gv-pm-footer-secondary { display: flex; align-items: center; gap: 8px; width: 100%; } .gv-pm-import-input { display: none; } /* Primary actions row (Backup & Docs) */ .gv-pm-backup-btn, .gv-pm-website-btn { height: 34px; border-radius: 9px; padding: 0 14px; background: oklch(0.55 0.17 155 / 0.1); border: none; color: oklch(0.55 0.17 155); flex: 1; font-size: 12px; font-weight: 600; white-space: nowrap; display: inline-flex; align-items: center; justify-content: center; gap: 6px; box-sizing: border-box; cursor: pointer; transition: all 0.15s ease; text-decoration: none; } .gv-pm-backup-btn:hover, .gv-pm-website-btn:hover { background: oklch(0.55 0.17 155 / 0.18); } .gv-pm-backup-btn:active, .gv-pm-website-btn:active { background: oklch(0.55 0.17 155 / 0.25); } .theme-host.dark-theme .gv-pm-backup-btn, .theme-host.dark-theme .gv-pm-website-btn, body.dark-theme .gv-pm-backup-btn, body.dark-theme .gv-pm-website-btn { background: oklch(0.7 0.16 155 / 0.1); color: oklch(0.7 0.16 155); } .theme-host.dark-theme .gv-pm-backup-btn:hover, .theme-host.dark-theme .gv-pm-website-btn:hover, body.dark-theme .gv-pm-backup-btn:hover, body.dark-theme .gv-pm-website-btn:hover { background: oklch(0.7 0.16 155 / 0.18); } /* Secondary buttons (Import/Export) */ .gv-pm-import-btn, .gv-pm-export-btn { height: 30px; border-radius: 8px; padding: 0 10px; background: transparent; border: none; color: rgba(229, 231, 235, 0.6); flex: 1 1 auto; min-width: 0; font-size: 11px; font-weight: 500; white-space: nowrap; display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box; cursor: pointer; transition: all 0.15s ease; overflow: hidden; text-overflow: ellipsis; } .gv-pm-import-btn:hover, .gv-pm-export-btn:hover { background: rgba(255, 255, 255, 0.06); color: #e5e7eb; } .theme-host.light-theme .gv-pm-import-btn, .theme-host.light-theme .gv-pm-export-btn, body.light-theme .gv-pm-import-btn, body.light-theme .gv-pm-export-btn { background: transparent; border: none; color: rgba(31, 41, 55, 0.5); } .theme-host.light-theme .gv-pm-import-btn:hover, .theme-host.light-theme .gv-pm-export-btn:hover, body.light-theme .gv-pm-import-btn:hover, body.light-theme .gv-pm-export-btn:hover { background: rgba(0, 0, 0, 0.04); color: #1f2937; } .theme-host.dark-theme .gv-pm-import-btn, .theme-host.dark-theme .gv-pm-export-btn, body.dark-theme .gv-pm-import-btn, body.dark-theme .gv-pm-export-btn { background: transparent; border: none; color: rgba(229, 231, 235, 0.6); } .theme-host.dark-theme .gv-pm-import-btn:hover, .theme-host.dark-theme .gv-pm-export-btn:hover, body.dark-theme .gv-pm-import-btn:hover, body.dark-theme .gv-pm-export-btn:hover { background: rgba(255, 255, 255, 0.06); color: #e5e7eb; } /* Settings button */ .gv-pm-settings { height: 30px; border-radius: 8px; padding: 0 10px; background: transparent; border: none; color: rgba(229, 231, 235, 0.6); flex: 1 1 auto; min-width: 0; font-size: 11px; font-weight: 500; white-space: nowrap; display: inline-flex; align-items: center; justify-content: center; gap: 4px; box-sizing: border-box; cursor: pointer; transition: all 0.15s ease; overflow: hidden; text-overflow: ellipsis; } .gv-pm-settings::before { content: '⚙'; font-size: 13px; } .gv-pm-settings:hover { background: rgba(255, 255, 255, 0.06); color: #e5e7eb; } .theme-host.light-theme .gv-pm-settings, body.light-theme .gv-pm-settings { background: transparent; border: none; color: rgba(31, 41, 55, 0.5); } .theme-host.light-theme .gv-pm-settings:hover, body.light-theme .gv-pm-settings:hover { background: rgba(0, 0, 0, 0.04); color: #1f2937; } .theme-host.dark-theme .gv-pm-settings, body.dark-theme .gv-pm-settings { background: transparent; border: none; color: rgba(229, 231, 235, 0.6); } .theme-host.dark-theme .gv-pm-settings:hover, body.dark-theme .gv-pm-settings:hover { background: rgba(255, 255, 255, 0.06); color: #e5e7eb; } /* GitHub link button */ .gv-pm-gh { height: 30px; border-radius: 8px; padding: 0 10px; border: none; background: transparent; display: inline-flex; align-items: center; justify-content: center; gap: 4px; cursor: pointer; transition: all 0.15s ease; text-decoration: none; font-size: 11px; font-weight: 500; color: rgba(229, 231, 235, 0.6); white-space: nowrap; flex: 1 1 auto; min-width: 0; box-sizing: border-box; overflow: hidden; } .gv-pm-gh:hover { background: rgba(255, 255, 255, 0.06); color: #e5e7eb; } .gv-pm-gh-icon { width: 14px; height: 14px; display: block; background: #e5e7eb; flex-shrink: 0; -webkit-mask: url('data:image/svg+xml,%3csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 16 16%22%3e%3cpath fill=%22%23000%22 d=%22M8 0C3.58 0 0 3.58 0 8a8 8 0 005.47 7.59c.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8 8 0 0016 8c0-4.42-3.58-8-8-8z%22/%3e%3c/svg%3e') center / contain no-repeat; mask: url('data:image/svg+xml,%3csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 16 16%22%3e%3cpath fill=%22%23000%22 d=%22M8 0C3.58 0 0 3.58 0 8a8 8 0 005.47 7.59c.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8 8 0 0016 8c0-4.42-3.58-8-8-8z%22/%3e%3c/svg%3e') center / contain no-repeat; } .gv-pm-gh-text { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; flex: 0 1 auto; text-align: center; } .theme-host.light-theme .gv-pm-gh, body.light-theme .gv-pm-gh { background: transparent; border: none; color: rgba(31, 41, 55, 0.5); } .theme-host.light-theme .gv-pm-gh:hover, body.light-theme .gv-pm-gh:hover { background: rgba(0, 0, 0, 0.04); color: #1f2937; } .theme-host.light-theme .gv-pm-gh-icon, body.light-theme .gv-pm-gh-icon { background: #1f2937; } .theme-host.dark-theme .gv-pm-gh, body.dark-theme .gv-pm-gh { background: transparent; border: none; color: rgba(229, 231, 235, 0.6); } .theme-host.dark-theme .gv-pm-gh:hover, body.dark-theme .gv-pm-gh:hover { background: rgba(255, 255, 255, 0.06); color: #e5e7eb; } .theme-host.dark-theme .gv-pm-gh-icon, body.dark-theme .gv-pm-gh-icon { background: #e5e7eb; } /* Notice message - floating toast style */ .gv-pm-notice { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); padding: 10px 20px; border-radius: 8px; font-size: 13px; font-weight: 500; line-height: 1.4; white-space: nowrap; pointer-events: none; z-index: 100; opacity: 0; transition: opacity 0.2s ease, transform 0.2s ease; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .gv-pm-notice:not(:empty) { opacity: 1; transform: translate(-50%, -50%) scale(1); } .gv-pm-notice:empty { transform: translate(-50%, -50%) scale(0.9); } .gv-pm-notice.ok { background: rgba(34, 197, 94, 0.95); color: #ffffff; } .gv-pm-notice.err { background: rgba(239, 68, 68, 0.95); color: #ffffff; } .theme-host.light-theme .gv-pm-notice.ok, body.light-theme .gv-pm-notice.ok { background: rgba(34, 197, 94, 0.95); color: #ffffff; } .theme-host.light-theme .gv-pm-notice.err, body.light-theme .gv-pm-notice.err { background: rgba(239, 68, 68, 0.95); color: #ffffff; } .theme-host.dark-theme .gv-pm-notice.ok, body.dark-theme .gv-pm-notice.ok { background: rgba(34, 197, 94, 0.95); color: #ffffff; } .theme-host.dark-theme .gv-pm-notice.err, body.dark-theme .gv-pm-notice.err { background: rgba(239, 68, 68, 0.95); color: #ffffff; } /* Inline confirm popover for delete (floating and responsive) */ .gv-pm-confirm { position: fixed; background: rgba(2, 6, 23, 0.96); color: #e5e7eb; border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 10px; padding: 6px 8px; display: inline-flex; gap: 8px; align-items: center; z-index: 2147483646; max-width: 280px; box-shadow: 0 8px 24px rgba(2, 6, 23, 0.4); } .gv-pm-confirm span { font-size: 12px; opacity: 0.95; line-height: 1.3; white-space: normal; flex: 1; } .gv-pm-confirm button { padding: 2px 8px; border-radius: 6px; border: 1px solid rgba(255, 255, 255, 0.18); background: rgba(31, 41, 55, 0.6); color: #e5e7eb; white-space: nowrap; font-size: 12px; } .gv-pm-confirm .gv-pm-confirm-yes { background: rgba(239, 68, 68, 0.18); border-color: rgba(239, 68, 68, 0.38); color: #fecaca; } .gv-pm-confirm button:hover { filter: brightness(1.05); } .gv-pm-confirm::after { content: ''; position: absolute; width: 10px; height: 10px; background: rgba(2, 6, 23, 0.96); border: 1px solid rgba(255, 255, 255, 0.12); transform: rotate(45deg); } .gv-pm-confirm[data-side='left']::after { right: -6px; top: 50%; transform: translateY(-50%) rotate(45deg); border-left: none; border-bottom: none; } .gv-pm-confirm[data-side='right']::after { left: -6px; top: 50%; transform: translateY(-50%) rotate(45deg); border-right: none; border-top: none; } .gv-pm-drag { width: 10px; height: 14px; margin-left: -6px; margin-right: 6px; position: relative; opacity: 0.7; cursor: move; } .gv-pm-drag::before { content: '⠿'; position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 10px; } .gv-locked .gv-pm-drag { cursor: default; opacity: 0.9; } /* ======================================== PM Theme Toggle ======================================== */ .gv-pm-theme-toggle { width: 38px; height: 20px; border-radius: 999px; position: relative; cursor: pointer; flex-shrink: 0; border: none; padding: 0; background: linear-gradient(135deg, oklch(0.82 0.12 80), oklch(0.72 0.15 50)); box-shadow: inset 0 1px 2px oklch(0 0 0 / 0.08), 0 1px 3px oklch(0 0 0 / 0.06); transition: background 0.4s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.3s ease; outline: none; } /* Thumb (white circle) */ .gv-pm-theme-toggle::before { content: ''; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: white; box-shadow: 0 1px 4px oklch(0 0 0 / 0.18); transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1), background 0.4s ease, box-shadow 0.4s ease; } /* Emoji on the thumb */ .gv-pm-theme-toggle::after { content: '☀️'; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; display: grid; place-items: center; font-size: 10px; line-height: 1; pointer-events: none; z-index: 1; transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); } .gv-pm-theme-toggle:hover { box-shadow: inset 0 1px 2px oklch(0 0 0 / 0.1), 0 2px 8px oklch(0 0 0 / 0.12); } .gv-pm-theme-toggle:focus-visible { box-shadow: 0 0 0 2px oklch(0.55 0.17 155 / 0.4), inset 0 1px 2px oklch(0 0 0 / 0.08); } /* Dark state — vibrant purple gradient */ .gv-pm-theme-toggle.gv-pm-theme-dark { background: linear-gradient(135deg, oklch(0.45 0.18 285), oklch(0.35 0.22 300)); } .gv-pm-theme-toggle.gv-pm-theme-dark::before { transform: translateX(18px); background: white; box-shadow: 0 1px 4px oklch(0 0 0 / 0.25); } .gv-pm-theme-toggle.gv-pm-theme-dark::after { content: '🌙'; transform: translateX(18px); } /* Smooth panel theme transition */ .gv-pm-panel.gv-pm-transitioning, .gv-pm-panel.gv-pm-transitioning * { transition: background 0.4s ease, color 0.4s ease, border-color 0.4s ease, box-shadow 0.4s ease !important; } /* ======================================== PM Theme Override: Dark (user forces dark on any page) ======================================== */ .gv-pm-panel.gv-pm-panel[data-gv-theme='dark'] { --gv-pm-surface: oklch(0.2 0.008 285); background: oklch(0.2 0.008 285); color: oklch(0.92 0.004 250); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 16px 48px oklch(0 0 0 / 0.4), 0 6px 20px oklch(0 0 0 / 0.25); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-header { border-bottom-color: oklch(0.3 0.008 285 / 0.5); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-title { color: oklch(0.92 0.004 250); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-version { background: oklch(0.26 0.008 285 / 0.7); color: oklch(0.72 0.006 250); border-color: oklch(0.3 0.008 285 / 0.6); box-shadow: 0 1px 4px oklch(0 0 0 / 0.2); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-version:hover { border-color: oklch(0.7 0.16 155 / 0.5); background: oklch(0.28 0.008 285 / 0.8); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-lang { background: oklch(0.24 0.008 285); color: oklch(0.72 0.006 250); border-color: oklch(0.3 0.008 285); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-lang:hover { border-color: oklch(0.7 0.16 155 / 0.4); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-add { background: oklch(0.7 0.16 155); color: oklch(0.15 0.025 160); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-add:hover { background: oklch(0.7 0.2 155); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-lock { background: oklch(0.24 0.008 285); border-color: oklch(0.3 0.008 285); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-lock:hover { background: oklch(0.28 0.008 285); border-color: oklch(0.7 0.16 155 / 0.3); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-lock.active { background: oklch(0.28 0.008 285); border-color: oklch(0.7 0.16 155); box-shadow: 0 0 0 3px oklch(0.7 0.16 155 / 0.1); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-search input[type='search'] { background: rgba(31, 41, 55, 0.5); color: #e5e7eb; border: 1.5px solid rgba(255, 255, 255, 0.08); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-search input[type='search']:focus { border-color: oklch(0.7 0.16 155 / 0.5); background: rgba(31, 41, 55, 0.7); box-shadow: 0 0 0 3px oklch(0.7 0.16 155 / 0.1); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-search input[type='search']::placeholder { color: #9ca3af; opacity: 0.7; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-tag { background: rgba(55, 65, 81, 0.4); color: rgba(229, 231, 235, 0.8); border: none; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-tag:hover { background: rgba(55, 65, 81, 0.6); color: #e5e7eb; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-tag.active { background: oklch(0.7 0.16 155 / 0.18); color: oklch(0.85 0.1 155); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-input-text, .gv-pm-panel[data-gv-theme='dark'] .gv-pm-input-tags { background: rgba(31, 41, 55, 0.5); color: #e5e7eb; border: 1.5px solid rgba(255, 255, 255, 0.08); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-input-text:focus, .gv-pm-panel[data-gv-theme='dark'] .gv-pm-input-tags:focus { border-color: oklch(0.7 0.16 155 / 0.5); box-shadow: 0 0 0 3px oklch(0.7 0.16 155 / 0.1); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-input-text::placeholder, .gv-pm-panel[data-gv-theme='dark'] .gv-pm-input-tags::placeholder { color: #9ca3af; opacity: 0.7; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-save { background: oklch(0.7 0.16 155); color: oklch(0.15 0.025 160); box-shadow: 0 2px 8px oklch(0.7 0.16 155 / 0.3); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-save:hover { background: oklch(0.7 0.2 155); box-shadow: 0 4px 14px oklch(0.7 0.16 155 / 0.4); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-cancel { color: #e5e7eb; border: 1px solid rgba(255, 255, 255, 0.12); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-cancel:hover { background: rgba(255, 255, 255, 0.06); } .gv-pm-panel[data-gv-theme='dark'] .gv-md-collapsed::after { background: linear-gradient(to right, transparent, oklch(0.22 0.006 285) 50%); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-expand-btn { border: none; color: rgba(156, 163, 175, 0.6); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-expand-btn:hover { background: rgba(255, 255, 255, 0.06); color: #d1d5db; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-item { background: rgba(255, 255, 255, 0.05); border: none; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-item:hover { background: rgba(255, 255, 255, 0.09); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-item-text { color: #e5e7eb; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-chip { background: oklch(0.7 0.16 155 / 0.12); color: oklch(0.8 0.08 155); border: none; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-edit { background: transparent; border: none; color: rgba(229, 231, 235, 0.5); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-edit:hover { background: rgba(255, 255, 255, 0.08); color: #e5e7eb; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-del { background: transparent; color: rgba(229, 231, 235, 0.5); border: none; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-del:hover { background: rgba(239, 68, 68, 0.12); color: #fca5a5; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-del.armed { background: rgba(239, 68, 68, 0.2); color: #fca5a5; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-footer { border-top: 1px solid rgba(255, 255, 255, 0.06); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-backup-btn, .gv-pm-panel[data-gv-theme='dark'] .gv-pm-website-btn { background: oklch(0.7 0.16 155 / 0.1); color: oklch(0.7 0.16 155); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-backup-btn:hover, .gv-pm-panel[data-gv-theme='dark'] .gv-pm-website-btn:hover { background: oklch(0.7 0.16 155 / 0.18); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-import-btn, .gv-pm-panel[data-gv-theme='dark'] .gv-pm-export-btn { background: transparent; border: none; color: rgba(229, 231, 235, 0.6); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-import-btn:hover, .gv-pm-panel[data-gv-theme='dark'] .gv-pm-export-btn:hover { background: rgba(255, 255, 255, 0.06); color: #e5e7eb; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-settings { background: transparent; border: none; color: rgba(229, 231, 235, 0.6); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-settings:hover { background: rgba(255, 255, 255, 0.06); color: #e5e7eb; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-gh { background: transparent; border: none; color: rgba(229, 231, 235, 0.6); } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-gh:hover { background: rgba(255, 255, 255, 0.06); color: #e5e7eb; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-gh-icon { background: #e5e7eb; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-notice.ok { background: rgba(34, 197, 94, 0.95); color: #ffffff; } .gv-pm-panel[data-gv-theme='dark'] .gv-pm-notice.err { background: rgba(239, 68, 68, 0.95); color: #ffffff; } /* ======================================== PM Theme Override: Light (user forces light on any page) ======================================== */ .gv-pm-panel.gv-pm-panel[data-gv-theme='light'] { --gv-pm-surface: oklch(0.995 0.002 250); background: oklch(0.995 0.002 250); color: oklch(0.14 0.004 285); border-color: oklch(0.92 0.004 250 / 0.7); box-shadow: 0 16px 48px oklch(0 0 0 / 0.12), 0 6px 20px oklch(0 0 0 / 0.06); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-header { border-bottom-color: oklch(0.92 0.004 250 / 0.5); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-title { color: oklch(0.14 0.004 285); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-version { background: oklch(0.95 0.004 250 / 0.6); color: oklch(0.4 0.006 250); border-color: oklch(0.92 0.004 250 / 0.5); box-shadow: 0 1px 4px oklch(0 0 0 / 0.04); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-version:hover { border-color: oklch(0.55 0.17 155 / 0.4); background: oklch(0.95 0.004 250 / 0.8); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-lang { background: oklch(0.995 0.002 250); color: oklch(0.38 0.006 250); border-color: oklch(0.92 0.004 250); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-lang:hover { border-color: oklch(0.55 0.17 155 / 0.4); box-shadow: 0 2px 6px oklch(0 0 0 / 0.06); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-add { background: oklch(0.55 0.17 155); color: oklch(0.99 0.01 155); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-add:hover { background: oklch(0.6 0.2 158); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-lock { background: oklch(0.995 0.002 250); border-color: oklch(0.92 0.004 250); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-lock:hover { background: oklch(0.96 0.003 250); border-color: oklch(0.55 0.17 155 / 0.3); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-lock.active { background: oklch(0.94 0.015 155); border-color: oklch(0.55 0.17 155); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.1); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-search input[type='search'] { background: rgba(0, 0, 0, 0.04); color: #1f2937; border: 1.5px solid rgba(0, 0, 0, 0.08); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-search input[type='search']:focus { border-color: oklch(0.55 0.17 155 / 0.5); background: rgba(0, 0, 0, 0.02); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.08); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-search input[type='search']::placeholder { color: #6b7280; opacity: 0.7; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-tag { background: rgba(0, 0, 0, 0.05); color: rgba(31, 41, 55, 0.7); border: none; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-tag:hover { background: rgba(0, 0, 0, 0.08); color: #1f2937; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-tag.active { background: oklch(0.55 0.17 155 / 0.12); color: oklch(0.4 0.15 155); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-input-text, .gv-pm-panel[data-gv-theme='light'] .gv-pm-input-tags { background: rgba(0, 0, 0, 0.04); color: #1f2937; border: 1.5px solid rgba(0, 0, 0, 0.08); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-input-text:focus, .gv-pm-panel[data-gv-theme='light'] .gv-pm-input-tags:focus { border-color: oklch(0.55 0.17 155 / 0.5); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.08); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-input-text::placeholder, .gv-pm-panel[data-gv-theme='light'] .gv-pm-input-tags::placeholder { color: #6b7280; opacity: 0.7; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-save { background: oklch(0.55 0.17 155); color: oklch(0.99 0.01 155); box-shadow: 0 2px 8px oklch(0.55 0.17 155 / 0.3); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-save:hover { background: oklch(0.6 0.2 158); box-shadow: 0 4px 14px oklch(0.55 0.17 155 / 0.4); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-cancel { color: #1f2937; border: 1px solid rgba(0, 0, 0, 0.12); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-cancel:hover { background: rgba(0, 0, 0, 0.06); } .gv-pm-panel[data-gv-theme='light'] .gv-md-collapsed::after { background: linear-gradient(to right, transparent, oklch(0.955 0.002 250) 50%); } .gv-pm-panel[data-gv-theme='light'] .gv-md pre { background: rgba(0, 0, 0, 0.05); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-expand-btn { border: none; color: rgba(107, 114, 128, 0.5); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-expand-btn:hover { background: rgba(0, 0, 0, 0.04); color: #374151; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-item { background: rgba(0, 0, 0, 0.04); border: none; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-item:hover { background: rgba(0, 0, 0, 0.07); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-item-text { color: #1f2937; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-chip { background: oklch(0.55 0.17 155 / 0.08); color: oklch(0.4 0.12 155); border: none; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-chip:hover { background: oklch(0.55 0.17 155 / 0.15); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-edit { background: transparent; border: none; color: rgba(31, 41, 55, 0.4); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-edit:hover { background: rgba(0, 0, 0, 0.06); color: #1f2937; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-del { background: transparent; color: rgba(31, 41, 55, 0.4); border: none; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-del:hover { background: rgba(239, 68, 68, 0.08); color: #dc2626; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-del.armed { background: rgba(239, 68, 68, 0.15); color: #dc2626; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-footer { border-top: 1px solid rgba(0, 0, 0, 0.06); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-backup-btn, .gv-pm-panel[data-gv-theme='light'] .gv-pm-website-btn { background: oklch(0.55 0.17 155 / 0.1); color: oklch(0.55 0.17 155); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-backup-btn:hover, .gv-pm-panel[data-gv-theme='light'] .gv-pm-website-btn:hover { background: oklch(0.55 0.17 155 / 0.18); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-import-btn, .gv-pm-panel[data-gv-theme='light'] .gv-pm-export-btn { background: transparent; border: none; color: rgba(31, 41, 55, 0.5); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-import-btn:hover, .gv-pm-panel[data-gv-theme='light'] .gv-pm-export-btn:hover { background: rgba(0, 0, 0, 0.04); color: #1f2937; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-settings { background: transparent; border: none; color: rgba(31, 41, 55, 0.5); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-settings:hover { background: rgba(0, 0, 0, 0.04); color: #1f2937; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-gh { background: transparent; border: none; color: rgba(31, 41, 55, 0.5); } .gv-pm-panel[data-gv-theme='light'] .gv-pm-gh:hover { background: rgba(0, 0, 0, 0.04); color: #1f2937; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-gh-icon { background: #1f2937; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-notice.ok { background: rgba(34, 197, 94, 0.95); color: #ffffff; } .gv-pm-panel[data-gv-theme='light'] .gv-pm-notice.err { background: rgba(239, 68, 68, 0.95); color: #ffffff; } /* ======================================== Folder Manager Styles ======================================== */ /* CSS Variables for folder theming */ :root { --folder-bg: #ffffff; --folder-text: #1f2937; --folder-border: #e5e7eb; --folder-hover-bg: #f3f4f6; --folder-active-bg: #e0e7ff; --folder-icon-color: #6b7280; --folder-menu-bg: #ffffff; --folder-menu-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); --folder-dragover-bg: #dbeafe; --folder-dragover-border: #3b82f6; /* Selection colors adapted to shadcn/ui primary (emerald/green) theme */ --folder-selected-bg-start: #f0fdf4; /* green-50 - subtle background */ --folder-selected-bg-end: #dcfce7; /* green-100 - slightly deeper */ --folder-selected-border: #10b981; /* emerald-500 - matches primary tone */ --folder-selected-accent: #34d399; /* emerald-400 - vibrant accent */ --folder-selected-glow: rgba(16, 185, 129, 0.12); /* emerald-500 with low opacity */ } /* ======================================== Dark Theme Variable Definitions NOTE: Dark theme variables are defined in TWO places for different scenarios: 1. @media (prefers-color-scheme: dark) - For system-level dark mode preference 2. .theme-host.dark-theme - For Gemini's theme system (higher specificity) ⚠️ IMPORTANT: Keep these values synchronized when updating dark theme colors. Changes to one should be reflected in the other to ensure consistent appearance. SSOT (Single Source of Truth) - Subtle Selection Colors (shadcn/ui emerald): Light Mode: - Accent Bar: #34d399 (emerald-400) - Background Glow: rgba(16, 185, 129, 0.12) - emerald-500 at 12% opacity Dark Mode: - Accent Bar: #6ee7b7 (emerald-300) - Background Glow: rgba(16, 185, 129, 0.10) - emerald-500 at 10% opacity ======================================== */ @media (prefers-color-scheme: dark) { :root { --folder-bg: #1f2937; --folder-text: #e5e7eb; --folder-border: #374151; --folder-hover-bg: #374151; --folder-active-bg: #1e40af; --folder-icon-color: #9ca3af; --folder-menu-bg: #1f2937; --folder-menu-shadow: 0 4px 12px rgba(0, 0, 0, 0.5); --folder-dragover-bg: #1e3a8a; --folder-dragover-border: #60a5fa; /* Subtle selection colors for dark mode (shadcn/ui emerald theme) */ --folder-selected-accent: #6ee7b7; /* emerald-300 - bright for dark bg */ --folder-selected-glow: rgba(16, 185, 129, 0.1); /* emerald-500 at 10% opacity */ --folder-selected-bg-start: #065f46; /* emerald-800 */ --folder-selected-bg-end: #064e3b; /* emerald-900 */ } } /* Theme support - Overrides system preferences on Gemini/AI Studio */ .theme-host.dark-theme, body.dark-theme { --folder-bg: #1f2937; --folder-text: #e5e7eb; --folder-border: #374151; --folder-hover-bg: #374151; --folder-active-bg: #1e40af; --folder-icon-color: #9ca3af; --folder-menu-bg: #1f2937; --folder-menu-shadow: 0 4px 12px rgba(0, 0, 0, 0.5); --folder-dragover-bg: #1e3a8a; --folder-dragover-border: #60a5fa; /* Subtle selection colors for dark theme (shadcn/ui emerald theme) */ --folder-selected-accent: #6ee7b7; /* emerald-300 - bright for dark bg */ --folder-selected-glow: rgba(16, 185, 129, 0.1); /* emerald-500 at 10% opacity */ --folder-selected-bg-start: #065f46; /* emerald-800 */ --folder-selected-bg-end: #064e3b; /* emerald-900 */ } .theme-host.light-theme, body.light-theme { --folder-bg: #ffffff; --folder-text: #1f2937; --folder-border: #e5e7eb; --folder-hover-bg: #f3f4f6; --folder-active-bg: #e0e7ff; --folder-icon-color: #6b7280; --folder-menu-bg: #ffffff; --folder-menu-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); --folder-dragover-bg: #dbeafe; --folder-dragover-border: #3b82f6; /* Subtle selection colors for light theme (shadcn/ui emerald theme) */ --folder-selected-accent: #34d399; /* emerald-400 - vibrant accent */ --folder-selected-glow: rgba(16, 185, 129, 0.12); /* emerald-500 at 12% opacity */ } /* Folder Container */ .gv-folder-container { margin-bottom: 16px; padding: 8px 8px 8px 12px; /* Ensure alignment with Recent section */ margin-left: 0; font-family: 'Google Sans', Roboto, Arial, sans-serif; } /* Folder Header */ .gv-folder-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 16px 8px 0; margin-bottom: 8px; border-radius: 8px; transition: background-color 0.2s, border 0.2s; } .gv-folder-header.gv-folder-list-dragover { background-color: var(--folder-dragover-bg); border: 2px dashed var(--folder-dragover-border); } .gv-folder-header .title-container { flex: 1; } /* Let native Gemini title styles take precedence - don't override */ .gv-folder-header .title { margin: 0; padding-left: 16px; /* Make the title darker/more subtle */ opacity: 0.7; color: var(--bard-color-on-surface-variant); } .gv-folder-add-btn { width: 32px; height: 32px; border-radius: 50%; border: none; background: transparent; color: var(--folder-icon-color); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background-color 0.2s, color 0.2s; } .gv-folder-add-btn:hover { background-color: var(--folder-hover-bg); color: var(--folder-text); } /* Folder List */ .gv-folder-list { display: flex; flex-direction: column; gap: 2px; min-height: 24px; /* Reduced min-height for better visual balance when empty */ padding: 4px; border-radius: 8px; transition: background-color 0.2s, border 0.2s; } .gv-folder-list-dragover { background-color: var(--folder-dragover-bg); border: 2px dashed var(--folder-dragover-border); } /* Empty state placeholder */ .gv-folder-empty { padding: 4px 16px; font-size: 12px; color: var(--folder-icon-color); opacity: 0.7; user-select: none; } /* Folder Item */ .gv-folder-item { display: flex; flex-direction: column; } .gv-folder-item-header { display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-radius: 8px; cursor: pointer; transition: background-color 0.2s; position: relative; } .gv-folder-item-header:hover { background-color: var(--folder-hover-bg); } .gv-folder-item-header.gv-folder-dragover { background-color: var(--folder-dragover-bg); border: 2px dashed var(--folder-dragover-border); } .gv-folder-item-header[draggable='true'] { cursor: grab; } .gv-folder-item-header[draggable='true']:active { cursor: grabbing; } /* Reorder indicator on conversation elements (top/bottom half detection) */ .gv-reorder-above { box-shadow: 0 -2px 0 0 #4285f4; } .gv-reorder-below { box-shadow: 0 2px 0 0 #4285f4; } /* Reorder gap between folder items for drag-and-drop sorting */ .gv-reorder-gap { height: 0; margin: 0 8px; border-radius: 1px; padding: 3px 0; transition: background-color 0.15s ease; } .gv-reorder-gap-active { background-color: #4285f4; } .gv-folder-expand-btn { width: 20px; height: 20px; border: none; background: transparent; color: var(--folder-icon-color); cursor: pointer; display: flex; align-items: center; justify-content: center; padding: 0; flex-shrink: 0; } .gv-folder-expand-btn .google-symbols { font-size: 20px; } .gv-folder-icon { font-size: 20px; color: var(--folder-icon-color); flex-shrink: 0; transition: color 0.2s ease; } .gv-folder-name { flex: 1; font-size: 14px; color: var(--folder-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; user-select: none; } .gv-folder-pin-btn { width: 24px; height: 24px; border: none; background: transparent; color: var(--folder-icon-color); cursor: pointer; display: flex; align-items: center; justify-content: center; border-radius: 4px; opacity: 0; transition: opacity 0.2s, background-color 0.2s; flex-shrink: 0; margin-left: auto; margin-right: 4px; } .gv-folder-item-header:hover .gv-folder-pin-btn { opacity: 1; } .gv-folder-pin-btn:hover { background-color: var(--folder-hover-bg); } .gv-folder-pin-btn .google-symbols { font-size: 18px; } .gv-folder-actions-btn { width: 24px; height: 24px; border: none; background: transparent; color: var(--folder-icon-color); cursor: pointer; display: flex; align-items: center; justify-content: center; border-radius: 4px; opacity: 0; transition: opacity 0.2s, background-color 0.2s; flex-shrink: 0; } .gv-folder-item-header:hover .gv-folder-actions-btn { opacity: 1; } .gv-folder-actions-btn:hover { background-color: var(--folder-hover-bg); } .gv-folder-actions-btn .google-symbols { font-size: 18px; } /* Folder Content (conversations and subfolders) */ .gv-folder-content { display: flex; flex-direction: column; gap: 2px; margin-top: 2px; margin-left: 12px; padding-left: 8px; border-left: 1px solid var(--folder-border); } /* Conversation Item in Folder */ .gv-folder-conversation { display: flex; align-items: center; gap: 4px; padding: 8px 6px; border-radius: 8px; cursor: pointer; transition: background-color 0.15s ease, opacity 0.2s; position: relative; } .gv-folder-conversation:hover { background-color: var(--folder-hover-bg); } /* Starred conversation - subtle gold accent on the left */ .gv-folder-conversation.gv-starred { background: linear-gradient(to right, rgba(251, 191, 36, 0.08) 0%, transparent 100%); } .gv-folder-conversation.gv-starred::before { content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 3px; height: 20px; background: linear-gradient(to bottom, #fbbf24, #f59e0b); border-radius: 0 2px 2px 0; opacity: 0.9; } /* ======================================== Multi-select Selection Styles Subtle design inspired by starred conversations ======================================== */ /* Shared selection base styles - subtle like starred items */ .gv-folder-conversation-selected, [data-test-id='conversation'].gv-conversation-selected { position: relative; /* Very subtle gradient background (similar opacity to starred: ~10%) */ background: linear-gradient( to right, var(--folder-selected-glow) 0%, transparent 100% ) !important; transition: background 200ms ease; } /* Folder conversation specific adjustments */ .gv-folder-conversation-selected { border-radius: 10px; } /* Native conversation specific adjustments */ [data-test-id='conversation'].gv-conversation-selected { border-radius: 12px !important; } /* Subtle left accent indicator (similar to starred dot) */ .gv-folder-conversation-selected::before, [data-test-id='conversation'].gv-conversation-selected::before { content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 3px; height: 60%; border-radius: 0 2px 2px 0; background-color: var(--folder-selected-accent); opacity: 0.9; pointer-events: none; } /* Ensure content is above the gradient overlay */ .gv-folder-conversation-selected > *, [data-test-id='conversation'].gv-conversation-selected > * { position: relative; z-index: 1; } /* Invalid selection feedback animation */ .gv-invalid-selection { animation: invalidShake 0.4s cubic-bezier(0.36, 0.07, 0.19, 0.97); } @keyframes invalidShake { 0%, 100% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-4px); } 20%, 40%, 60%, 80% { transform: translateX(4px); } } /* Hide archived conversations (conversations that are in folders) */ [data-test-id='conversation'].gv-conversation-archived { display: none !important; } /* Multi-select mode indicator */ .gv-multi-select-indicator { display: none; align-items: center; justify-content: space-between; padding: 12px 16px; margin: 8px 8px 0 12px; /* Elegant twilight gradient background matching selection */ background: linear-gradient( 135deg, var(--folder-selected-bg-start) 0%, var(--folder-selected-bg-end) 100% ); border: 1px solid var(--folder-selected-border); border-radius: 10px; box-shadow: 0 4px 12px var(--folder-selected-glow), 0 2px 4px rgba(0, 0, 0, 0.08), 0 0 0 1px var(--folder-selected-border); animation: slideDown 0.3s cubic-bezier(0.4, 0, 0.2, 1); } @keyframes slideDown { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } .gv-multi-select-mode .gv-multi-select-indicator { display: flex; } .gv-multi-select-indicator-content { display: flex; align-items: center; gap: 8px; } .gv-multi-select-indicator-content mat-icon { font-size: 20px !important; width: 20px !important; height: 20px !important; color: var(--folder-selected-border); } .gv-multi-select-indicator-text { font-size: 14px; font-weight: 500; color: var(--folder-text); } /* Multi-select actions container */ .gv-multi-select-actions { display: flex; align-items: center; gap: 4px; } /* Common styling for action buttons */ .gv-multi-select-action-btn { min-width: 32px; width: 32px; height: 32px; border: none; background: transparent; color: var(--folder-icon-color); cursor: pointer; display: flex; align-items: center; justify-content: center; border-radius: 6px; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .gv-multi-select-action-btn mat-icon { font-size: 20px !important; width: 20px !important; height: 20px !important; } /* Delete button specific styling */ .gv-multi-select-delete-btn { color: #ef4444; } .gv-multi-select-delete-btn:hover { background-color: rgba(239, 68, 68, 0.12); color: #dc2626; transform: scale(1.05); } .gv-multi-select-delete-btn:active { transform: scale(0.95); } /* Exit button specific styling */ .gv-multi-select-exit-btn:hover { background-color: rgba(0, 0, 0, 0.08); color: var(--folder-text); transform: scale(1.05); } .gv-multi-select-exit-btn:active { transform: scale(0.95); } /* Draggable conversations in folders */ .gv-folder-conversation[draggable='true'] { cursor: grab; } .gv-folder-conversation[draggable='true']:active { cursor: grabbing; } .gv-conversation-icon { font-size: 12px !important; width: 16px !important; height: 16px !important; margin-left: -2px; margin-right: -2px; margin-top: 3px; color: var(--folder-icon-color); flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; line-height: 1; overflow: hidden !important; font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 20; } .gv-conversation-icon::before, .gv-conversation-icon::after { display: none !important; content: none !important; } /* Firefox specific alignment */ @supports (-moz-appearance: none) { .gv-conversation-icon { /* 1px aligns better in Firefox */ margin-top: 1px !important; } } .gv-conversation-title { flex: 1; font-size: 14px; color: var(--folder-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* Action buttons container for proper layout */ .gv-conversation-actions { display: flex; align-items: center; gap: 0; margin-left: auto; flex-shrink: 0; } /* Star button - hidden by default, show on hover to save space */ .gv-conversation-star-btn { min-width: 24px; width: 24px; height: 24px; border: none; background: transparent; color: #9ca3af; cursor: pointer; display: flex; align-items: center; justify-content: center; border-radius: 6px; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); flex-shrink: 0; padding: 0; opacity: 0; } .gv-folder-conversation:hover .gv-conversation-star-btn { opacity: 1; } /* Starred state */ .gv-conversation-star-btn.starred { opacity: 1 !important; color: #fbbf24; } .gv-conversation-star-btn:hover { background-color: rgba(251, 191, 36, 0.12); color: #fbbf24; transform: scale(1.05); } .gv-conversation-star-btn.starred:hover { background-color: rgba(251, 191, 36, 0.15); } .gv-conversation-star-btn mat-icon { font-size: 18px !important; width: 18px !important; height: 18px !important; transition: transform 0.2s; } .gv-conversation-star-btn:active mat-icon { transform: scale(0.9); } /* Remove button - only visible on hover */ .gv-conversation-remove-btn { min-width: 24px; width: 24px; height: 24px; border: none; background: transparent; color: #9ca3af; cursor: pointer; display: flex; align-items: center; justify-content: center; border-radius: 6px; opacity: 0; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); flex-shrink: 0; padding: 0; } .gv-folder-conversation:hover .gv-conversation-remove-btn { opacity: 1; } .gv-conversation-remove-btn:hover { background-color: rgba(239, 68, 68, 0.12); color: #ef4444; transform: scale(1.05); } .gv-conversation-remove-btn mat-icon { font-size: 18px !important; width: 18px !important; height: 18px !important; display: flex !important; align-items: center !important; justify-content: center !important; line-height: 1 !important; transition: transform 0.2s; } .gv-conversation-remove-btn:active mat-icon { transform: scale(0.9); } /* Folder Context Menu */ /* ── Folder Context Menu ── */ .gv-folder-menu { background: oklch(0.995 0.002 250); border: 1px solid oklch(0.92 0.004 250 / 0.7); border-radius: 14px; box-shadow: 0 12px 40px oklch(0 0 0 / 0.1), 0 4px 16px oklch(0 0 0 / 0.05); padding: 6px; z-index: 2147483647; min-width: 170px; font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji'; animation: gv-folder-fadeIn 0.15s cubic-bezier(0.4, 0, 0.2, 1); } @media (prefers-color-scheme: dark) { .gv-folder-menu { background: oklch(0.2 0.008 285); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 12px 40px oklch(0 0 0 / 0.35), 0 4px 16px oklch(0 0 0 / 0.2); } } .theme-host.dark-theme .gv-folder-menu, body.dark-theme .gv-folder-menu { background: oklch(0.2 0.008 285); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 12px 40px oklch(0 0 0 / 0.35), 0 4px 16px oklch(0 0 0 / 0.2); } .theme-host.light-theme .gv-folder-menu, body.light-theme .gv-folder-menu { background: oklch(0.995 0.002 250); border-color: oklch(0.92 0.004 250 / 0.7); box-shadow: 0 12px 40px oklch(0 0 0 / 0.1), 0 4px 16px oklch(0 0 0 / 0.05); } .gv-folder-menu-item { display: flex; align-items: center; width: 100%; padding: 9px 14px; border: none; background: transparent; color: oklch(0.14 0.004 285); text-align: left; cursor: pointer; border-radius: 9px; font-size: 13px; font-weight: 500; transition: background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1); } .gv-folder-menu-item:hover { background: oklch(0.14 0.004 285 / 0.06); } @media (prefers-color-scheme: dark) { .gv-folder-menu-item { color: oklch(0.92 0.004 250); } .gv-folder-menu-item:hover { background: oklch(0.92 0.004 250 / 0.08); } } .theme-host.dark-theme .gv-folder-menu-item, body.dark-theme .gv-folder-menu-item { color: oklch(0.92 0.004 250); } .theme-host.dark-theme .gv-folder-menu-item:hover, body.dark-theme .gv-folder-menu-item:hover { background: oklch(0.92 0.004 250 / 0.08); } .theme-host.light-theme .gv-folder-menu-item, body.light-theme .gv-folder-menu-item { color: oklch(0.14 0.004 285); } .theme-host.light-theme .gv-folder-menu-item:hover, body.light-theme .gv-folder-menu-item:hover { background: oklch(0.14 0.004 285 / 0.06); } /* ── Color Picker Dialog ── */ .gv-color-picker-dialog { position: fixed; background: oklch(0.995 0.002 250); border: 1px solid oklch(0.92 0.004 250 / 0.7); border-radius: 14px; padding: 12px; box-shadow: 0 12px 40px oklch(0 0 0 / 0.1), 0 4px 16px oklch(0 0 0 / 0.05); z-index: 10001; display: grid; grid-template-columns: repeat(4, 36px); gap: 8px; animation: gv-folder-fadeIn 0.15s cubic-bezier(0.4, 0, 0.2, 1); } @keyframes gv-folder-fadeIn { from { opacity: 0; transform: scale(0.96) translateY(4px); } to { opacity: 1; transform: scale(1) translateY(0); } } @media (prefers-color-scheme: dark) { .gv-color-picker-dialog { background: oklch(0.2 0.008 285); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 12px 40px oklch(0 0 0 / 0.35), 0 4px 16px oklch(0 0 0 / 0.2); } } .theme-host.dark-theme .gv-color-picker-dialog, body.dark-theme .gv-color-picker-dialog { background: oklch(0.2 0.008 285); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 12px 40px oklch(0 0 0 / 0.35), 0 4px 16px oklch(0 0 0 / 0.2); } .theme-host.light-theme .gv-color-picker-dialog, body.light-theme .gv-color-picker-dialog { background: oklch(0.995 0.002 250); border-color: oklch(0.92 0.004 250 / 0.7); } .gv-color-picker-item { width: 36px; height: 36px; border: 2px solid transparent; border-radius: 10px; cursor: pointer; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); position: relative; padding: 0; box-shadow: 0 1px 4px oklch(0 0 0 / 0.08); } .gv-color-picker-item:hover { transform: scale(1.12); border-color: oklch(0.14 0.004 285 / 0.3); box-shadow: 0 3px 10px oklch(0 0 0 / 0.15); } @media (prefers-color-scheme: dark) { .gv-color-picker-item:hover { border-color: oklch(0.92 0.004 250 / 0.4); } } .gv-color-picker-item.selected { border-color: oklch(0.55 0.17 155); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.25); } @media (prefers-color-scheme: dark) { .gv-color-picker-item.selected { border-color: oklch(0.7 0.16 155); box-shadow: 0 0 0 3px oklch(0.7 0.16 155 / 0.25); } } .gv-color-picker-item.selected::after { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-size: 18px; font-weight: bold; text-shadow: 0 1px 2px oklch(0 0 0 / 0.3); } /* Drag cursor for original conversation elements */ [data-test-id='conversation'][draggable='true'] { cursor: grab; } [data-test-id='conversation'][draggable='true']:active { cursor: grabbing; } /* Inline Input/Rename Styles */ .gv-folder-inline-input { display: flex; align-items: center; gap: 8px; padding: 8px 12px; background-color: var(--folder-hover-bg); border-radius: 8px; margin: 4px 0; } .gv-folder-name-input, .gv-folder-rename-input { flex: 1; padding: 6px 8px; border: 1px solid var(--folder-border); border-radius: 4px; background-color: var(--folder-bg); color: var(--folder-text); font-size: 14px; outline: none; } .gv-folder-name-input:focus, .gv-folder-rename-input:focus { border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1); } .gv-folder-rename-inline { display: inline-flex; align-items: center; gap: 4px; flex: 1; } .gv-folder-inline-btn { width: 24px; height: 24px; border: none; background: transparent; color: var(--folder-icon-color); cursor: pointer; display: flex; align-items: center; justify-content: center; border-radius: 4px; padding: 0; transition: background-color 0.2s, color 0.2s; flex-shrink: 0; } .gv-folder-inline-btn:hover { background-color: var(--folder-hover-bg); } .gv-folder-inline-save:hover { color: #10b981; background-color: rgba(16, 185, 129, 0.1); } .gv-folder-inline-cancel:hover { color: #ef4444; background-color: rgba(239, 68, 68, 0.1); } .gv-folder-inline-btn mat-icon { font-size: 18px; width: 18px; height: 18px; } .gv-hidden { display: none !important; } /* Confirm Dialog */ /* ── Confirm Dialog (Delete Conversation / Delete Folder) ── */ .gv-folder-confirm-dialog { background: oklch(0.995 0.002 250); border: 1px solid oklch(0.92 0.004 250 / 0.7); border-radius: 16px; box-shadow: 0 12px 40px oklch(0 0 0 / 0.1), 0 4px 16px oklch(0 0 0 / 0.05); padding: 16px; z-index: 2147483647; min-width: 250px; max-width: 340px; font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji'; animation: gv-folder-fadeIn 0.15s cubic-bezier(0.4, 0, 0.2, 1); } @media (prefers-color-scheme: dark) { .gv-folder-confirm-dialog { background: oklch(0.2 0.008 285); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 12px 40px oklch(0 0 0 / 0.35), 0 4px 16px oklch(0 0 0 / 0.2); } } .theme-host.dark-theme .gv-folder-confirm-dialog, body.dark-theme .gv-folder-confirm-dialog { background: oklch(0.2 0.008 285); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 12px 40px oklch(0 0 0 / 0.35), 0 4px 16px oklch(0 0 0 / 0.2); } .theme-host.light-theme .gv-folder-confirm-dialog, body.light-theme .gv-folder-confirm-dialog { background: oklch(0.995 0.002 250); border-color: oklch(0.92 0.004 250 / 0.7); } .gv-folder-confirm-message { color: oklch(0.14 0.004 285); font-size: 13px; font-weight: 500; line-height: 1.55; margin-bottom: 14px; } @media (prefers-color-scheme: dark) { .gv-folder-confirm-message { color: oklch(0.92 0.004 250); } } .theme-host.dark-theme .gv-folder-confirm-message, body.dark-theme .gv-folder-confirm-message { color: oklch(0.92 0.004 250); } .theme-host.light-theme .gv-folder-confirm-message, body.light-theme .gv-folder-confirm-message { color: oklch(0.14 0.004 285); } .gv-folder-confirm-actions { display: flex; gap: 8px; justify-content: flex-end; } .gv-folder-confirm-btn { padding: 6px 14px; border-radius: 9px; border: 1px solid oklch(0.14 0.004 285 / 0.12); background: transparent; color: oklch(0.14 0.004 285); font-size: 13px; font-weight: 600; cursor: pointer; transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1); } .gv-folder-confirm-btn:hover { background: oklch(0.14 0.004 285 / 0.06); } @media (prefers-color-scheme: dark) { .gv-folder-confirm-btn { border-color: oklch(0.92 0.004 250 / 0.12); color: oklch(0.92 0.004 250); } .gv-folder-confirm-btn:hover { background: oklch(0.92 0.004 250 / 0.06); } } .theme-host.dark-theme .gv-folder-confirm-btn, body.dark-theme .gv-folder-confirm-btn { border-color: oklch(0.92 0.004 250 / 0.12); color: oklch(0.92 0.004 250); } .theme-host.dark-theme .gv-folder-confirm-btn:hover, body.dark-theme .gv-folder-confirm-btn:hover { background: oklch(0.92 0.004 250 / 0.06); } .theme-host.light-theme .gv-folder-confirm-btn, body.light-theme .gv-folder-confirm-btn { border-color: oklch(0.14 0.004 285 / 0.12); color: oklch(0.14 0.004 285); } .theme-host.light-theme .gv-folder-confirm-btn:hover, body.light-theme .gv-folder-confirm-btn:hover { background: oklch(0.14 0.004 285 / 0.06); } .gv-folder-confirm-yes { background: oklch(0.6 0.22 25 / 0.1); border-color: oklch(0.6 0.22 25 / 0.3); color: oklch(0.6 0.22 25); } .gv-folder-confirm-yes:hover { background: oklch(0.6 0.22 25 / 0.18); border-color: oklch(0.6 0.22 25 / 0.5); } /* ── Move to Folder Dialog ── */ .gv-folder-dialog-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: oklch(0 0 0 / 0.35); z-index: 2147483647; display: flex; align-items: center; justify-content: center; animation: gv-folder-overlayIn 0.2s cubic-bezier(0.4, 0, 0.2, 1); } @keyframes gv-folder-overlayIn { from { opacity: 0; } to { opacity: 1; } } .gv-folder-dialog { background: oklch(0.995 0.002 250); border: 1px solid oklch(0.92 0.004 250 / 0.7); border-radius: 18px; box-shadow: 0 16px 48px oklch(0 0 0 / 0.12), 0 6px 20px oklch(0 0 0 / 0.06); padding: 0; min-width: 340px; max-width: 420px; max-height: 80vh; display: flex; flex-direction: column; font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji'; animation: gv-folder-fadeIn 0.2s cubic-bezier(0.4, 0, 0.2, 1); } @media (prefers-color-scheme: dark) { .gv-folder-dialog { background: oklch(0.2 0.008 285); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 16px 48px oklch(0 0 0 / 0.4), 0 6px 20px oklch(0 0 0 / 0.25); } } .theme-host.dark-theme .gv-folder-dialog, body.dark-theme .gv-folder-dialog { background: oklch(0.2 0.008 285); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 16px 48px oklch(0 0 0 / 0.4), 0 6px 20px oklch(0 0 0 / 0.25); } .theme-host.light-theme .gv-folder-dialog, body.light-theme .gv-folder-dialog { background: oklch(0.995 0.002 250); border-color: oklch(0.92 0.004 250 / 0.7); } .gv-folder-dialog-title { color: oklch(0.14 0.004 285); font-size: 17px; font-weight: 800; letter-spacing: -0.02em; padding: 16px 18px 12px 18px; border-bottom: 1px solid oklch(0.92 0.004 250 / 0.5); } @media (prefers-color-scheme: dark) { .gv-folder-dialog-title { color: oklch(0.92 0.004 250); border-bottom-color: oklch(0.3 0.008 285 / 0.5); } } .theme-host.dark-theme .gv-folder-dialog-title, body.dark-theme .gv-folder-dialog-title { color: oklch(0.92 0.004 250); border-bottom-color: oklch(0.3 0.008 285 / 0.5); } .theme-host.light-theme .gv-folder-dialog-title, body.light-theme .gv-folder-dialog-title { color: oklch(0.14 0.004 285); border-bottom-color: oklch(0.92 0.004 250 / 0.5); } .gv-folder-dialog-list { flex: 1; overflow-y: auto; padding: 6px 8px; min-height: 200px; max-height: 400px; scrollbar-gutter: stable; } .gv-folder-dialog-item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 10px 12px; border: none; background: transparent; color: oklch(0.14 0.004 285); font-size: 13px; font-weight: 500; cursor: pointer; border-radius: 10px; transition: background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1); text-align: left; } .gv-folder-dialog-item:not(:disabled):hover { background: oklch(0.14 0.004 285 / 0.06); } @media (prefers-color-scheme: dark) { .gv-folder-dialog-item { color: oklch(0.92 0.004 250); } .gv-folder-dialog-item:not(:disabled):hover { background: oklch(0.92 0.004 250 / 0.08); } } .theme-host.dark-theme .gv-folder-dialog-item, body.dark-theme .gv-folder-dialog-item { color: oklch(0.92 0.004 250); } .theme-host.dark-theme .gv-folder-dialog-item:not(:disabled):hover, body.dark-theme .gv-folder-dialog-item:not(:disabled):hover { background: oklch(0.92 0.004 250 / 0.08); } .theme-host.light-theme .gv-folder-dialog-item, body.light-theme .gv-folder-dialog-item { color: oklch(0.14 0.004 285); } .theme-host.light-theme .gv-folder-dialog-item:not(:disabled):hover, body.light-theme .gv-folder-dialog-item:not(:disabled):hover { background: oklch(0.14 0.004 285 / 0.06); } .gv-folder-dialog-item:disabled { cursor: not-allowed; opacity: 0.4; } .gv-folder-dialog-item mat-icon { font-size: 16px !important; width: 16px !important; height: 16px !important; color: oklch(0.55 0.17 155); flex-shrink: 0; } @media (prefers-color-scheme: dark) { .gv-folder-dialog-item mat-icon { color: oklch(0.7 0.16 155); } } .gv-folder-dialog-item span { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .gv-folder-dialog-cancel { padding: 12px 18px; border: none; border-top: 1px solid oklch(0.92 0.004 250 / 0.5); background: transparent; color: oklch(0.14 0.004 285); font-size: 13px; font-weight: 600; cursor: pointer; transition: background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1); border-radius: 0 0 18px 18px; } .gv-folder-dialog-cancel:hover { background: oklch(0.14 0.004 285 / 0.06); } @media (prefers-color-scheme: dark) { .gv-folder-dialog-cancel { color: oklch(0.92 0.004 250); border-top-color: oklch(0.3 0.008 285 / 0.5); } .gv-folder-dialog-cancel:hover { background: oklch(0.92 0.004 250 / 0.06); } } .theme-host.dark-theme .gv-folder-dialog-cancel, body.dark-theme .gv-folder-dialog-cancel { color: oklch(0.92 0.004 250); border-top-color: oklch(0.3 0.008 285 / 0.5); } .theme-host.dark-theme .gv-folder-dialog-cancel:hover, body.dark-theme .gv-folder-dialog-cancel:hover { background: oklch(0.92 0.004 250 / 0.06); } .theme-host.light-theme .gv-folder-dialog-cancel, body.light-theme .gv-folder-dialog-cancel { color: oklch(0.14 0.004 285); border-top-color: oklch(0.92 0.004 250 / 0.5); } .theme-host.light-theme .gv-folder-dialog-cancel:hover, body.light-theme .gv-folder-dialog-cancel:hover { background: oklch(0.14 0.004 285 / 0.06); } /* Custom Tooltip Styles */ .gv-tooltip { position: fixed; background-color: rgba(0, 0, 0, 0.9); color: #fff; padding: 8px 12px; border-radius: 6px; font-size: 13px; font-weight: 500; max-width: 300px; word-wrap: break-word; z-index: 10000; pointer-events: none; opacity: 0; transition: opacity 0.15s ease-in-out; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); font-family: 'Google Sans', Roboto, Arial, sans-serif; } .gv-tooltip.show { opacity: 1; } /* Light theme tooltip */ html[data-color-scheme='light'] .gv-tooltip { background-color: rgba(0, 0, 0, 0.85); color: #fff; } /* ==================== Formula Copy Feature ==================== */ /* Math element hover effect - make formulas clickable */ .math-inline, .math-display, [data-math] { cursor: pointer !important; transition: all 0.2s ease; border-radius: 4px; padding: 2px 4px; margin: 0 2px; } .math-inline:hover, .math-display:hover, [data-math]:hover { background-color: rgba(66, 133, 244, 0.1) !important; box-shadow: 0 0 0 1px rgba(66, 133, 244, 0.3); } /* Light theme hover */ html[data-color-scheme='light'] .math-inline:hover, html[data-color-scheme='light'] .math-display:hover, html[data-color-scheme='light'] [data-math]:hover { background-color: rgba(66, 133, 244, 0.08) !important; } /* Copy toast notification */ .gv-copy-toast { position: fixed; color: white; padding: 10px 16px; border-radius: 8px; font-size: 14px; font-weight: 500; z-index: 100000; pointer-events: none; opacity: 0; transform: translateY(-10px) scale(0.9); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); white-space: nowrap; font-family: 'Google Sans', Roboto, Arial, sans-serif; } /* Success state */ .gv-copy-toast-success { background: linear-gradient(135deg, #34a853 0%, #1e8e3e 100%); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2), 0 2px 8px rgba(52, 168, 83, 0.3); } /* Error state */ .gv-copy-toast-error { background: linear-gradient(135deg, #ea4335 0%, #c5221f 100%); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2), 0 2px 8px rgba(234, 67, 53, 0.3); } .gv-copy-toast-show { opacity: 1; transform: translateY(0) scale(1); } /* Add slight pulse animation */ @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } .gv-copy-toast-show { animation: pulse 0.3s ease-out; } /* Light theme toast */ html[data-color-scheme='light'] .gv-copy-toast-success { box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15), 0 2px 8px rgba(52, 168, 83, 0.2); } html[data-color-scheme='light'] .gv-copy-toast-error { box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15), 0 2px 8px rgba(234, 67, 53, 0.2); } /* AI Studio formula hover effect - make ms-katex elements clickable */ ms-katex { cursor: pointer !important; transition: all 0.2s ease; border-radius: 4px; display: inline-block; } ms-katex:hover { background-color: rgba(66, 133, 244, 0.1) !important; box-shadow: 0 0 0 2px rgba(66, 133, 244, 0.2); } /* AI Studio: Also style .katex elements inside ms-katex for better hit area feedback */ ms-katex .katex { transition: opacity 0.2s ease; } ms-katex:hover .katex { opacity: 0.9; } /* AI Studio light theme formula hover - detect via body background or explicit theme */ html[data-color-scheme='light'] ms-katex:hover, body.light-theme ms-katex:hover { background-color: rgba(66, 133, 244, 0.08) !important; } /* ========================================================================== Folder Import/Export Styles ========================================================================== */ /* Header actions container */ .gv-folder-header-actions { display: flex; align-items: center; gap: 4px; } /* Action buttons (import/export) */ .gv-folder-action-btn { background: none; border: none; padding: 4px; cursor: pointer; border-radius: 50%; color: var(--folder-icon-color); display: flex; align-items: center; justify-content: center; transition: background-color 0.2s ease; opacity: 0.9; } .gv-folder-action-btn:hover { background-color: rgba(0, 0, 0, 0.05); opacity: 1; } html.dark .gv-folder-action-btn:hover, body.dark-theme .gv-folder-action-btn:hover, [data-theme='dark'] .gv-folder-action-btn:hover, [data-color-scheme='dark'] .gv-folder-action-btn:hover { background-color: rgba(255, 255, 255, 0.08); } .gv-folder-action-btn mat-icon { font-size: 18px; width: 18px; height: 18px; } /* Filter active state */ .gv-folder-action-btn.gv-filter-active { background-color: rgba(66, 133, 244, 0.15); opacity: 1; } .gv-folder-action-btn.gv-filter-active mat-icon { color: #4285f4; } html.dark .gv-folder-action-btn.gv-filter-active, body.dark-theme .gv-folder-action-btn.gv-filter-active, [data-theme='dark'] .gv-folder-action-btn.gv-filter-active, [data-color-scheme='dark'] .gv-folder-action-btn.gv-filter-active { background-color: rgba(138, 180, 248, 0.2); } html.dark .gv-folder-action-btn.gv-filter-active mat-icon, body.dark-theme .gv-folder-action-btn.gv-filter-active mat-icon, [data-theme='dark'] .gv-folder-action-btn.gv-filter-active mat-icon, [data-color-scheme='dark'] .gv-folder-action-btn.gv-filter-active mat-icon { color: #8ab4f8; } /* ========================== AI Studio specific tweaks - Compact spacing + icon fallbacks - Do NOT affect gemini.google UI - Let AI Studio manage sidebar width natively ========================== */ /* Allow folder container to adapt to native sidebar width */ .gv-aistudio-root ms-prompt-history-v3 { /* Ensure folder content doesn't overflow */ overflow-x: hidden; } .gv-aistudio-root .nav-content.v3-left-nav { /* Just add padding for folder icons, don't force width */ padding-right: 4px; } .gv-aistudio .gv-folder-header { padding: 6px 8px 6px 0; margin-bottom: 6px; } .gv-aistudio .gv-folder-title { font-size: 12px; opacity: 0.8; } .gv-aistudio .gv-folder-item-header { gap: 6px; padding: 6px 10px; /* Reserve space for more button only (pin is hidden by default) */ padding-right: 10px; overflow: visible; min-height: 28px; } .gv-aistudio .gv-folder-name { font-size: 12px; /* Allow a bit more width visually */ letter-spacing: 0.1px; /* Ensure folder name has minimum width to display at least a few characters */ min-width: 40px; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .gv-aistudio .gv-folder-expand-btn { width: 18px; height: 18px; } .gv-aistudio .gv-folder-icon { font-size: 16px; } /* Reduce container/list side paddings to utilize width */ .gv-aistudio.gv-folder-container { padding-left: 2px; padding-right: 2px; } .gv-aistudio .gv-folder-list { padding-left: 0; padding-right: 0; } /* Make action buttons absolute so they don’t steal inline space */ .gv-aistudio .gv-folder-pin-btn, .gv-aistudio .gv-folder-actions-btn { width: 24px; height: 24px; position: absolute; top: 50%; transform: translateY(-50%); margin: 0; overflow: visible; z-index: 1; } /* Pin button: hidden by default, show on hover to save space */ .gv-aistudio .gv-folder-pin-btn { opacity: 0; transition: opacity 0.15s ease; } /* More button: hidden by default, show on hover to save space */ .gv-aistudio .gv-folder-actions-btn { opacity: 0; transition: opacity 0.15s ease; } .gv-aistudio .gv-folder-item-header:hover .gv-folder-pin-btn, .gv-aistudio .gv-folder-item-header:hover .gv-folder-actions-btn { opacity: 1; } .gv-aistudio .gv-folder-actions-btn { right: 6px; } .gv-aistudio .gv-folder-pin-btn { right: 28px; } .gv-aistudio .gv-folder-header-actions .gv-folder-action-btn { padding: 2px; } /* Ensure pin/more icons are perfectly centered and not clipped */ .gv-aistudio .gv-folder-pin-btn .google-symbols, .gv-aistudio .gv-folder-actions-btn .google-symbols { display: inline-flex; align-items: center; justify-content: center; width: 24px; /* match button box */ height: 24px; line-height: 24px; overflow: visible !important; /* never clip emoji */ } .gv-aistudio .gv-folder-pin-btn .google-symbols::before, .gv-aistudio .gv-folder-actions-btn .google-symbols::before { width: 24px; height: 24px; line-height: 24px; text-align: center; font-size: 20px; /* slightly larger for better visual balance */ } /* Icon fallbacks: hide ligature text and use simple glyphs */ .gv-aistudio .gv-folder-pin-btn .google-symbols, .gv-aistudio .gv-folder-add-btn .google-symbols, .gv-aistudio .gv-folder-actions-btn .google-symbols, .gv-aistudio .gv-folder-expand-btn .google-symbols, .gv-aistudio .gv-folder-icon.google-symbols, .gv-aistudio .gv-conversation-icon.google-symbols, .gv-aistudio .gv-folder-action-btn .google-symbols, .gv-aistudio .gv-conversation-star-btn .google-symbols, .gv-aistudio .gv-conversation-remove-btn .google-symbols, .gv-aistudio .gv-folder-uncategorized-header .google-symbols { font-family: inherit !important; /* Don’t rely on Material Symbols in aistudio */ font-weight: 400; font-size: 0; /* Hide text like 'push_pin' */ line-height: 20px; display: inline-block; width: 20px; /* bigger box to avoid clipping */ height: 20px; overflow: hidden; vertical-align: middle; } .gv-aistudio .google-symbols::before { display: block; width: 20px; height: 20px; line-height: 20px; text-align: center; font-size: 18px; } /* Per-icon mappings */ .gv-aistudio .google-symbols[data-icon='expand_more']::before { content: '▾'; } .gv-aistudio .google-symbols[data-icon='chevron_right']::before { content: '▸'; } .gv-aistudio .google-symbols[data-icon='folder']::before { content: '📁'; font-size: 16px; } .gv-aistudio .google-symbols[data-icon='chat']::before { content: '💬'; font-size: 16px; } .gv-aistudio .google-symbols[data-icon='push_pin']::before { content: '📌'; font-size: 16px; } .gv-aistudio .gv-folder-pin-btn[data-state='unpinned'] .google-symbols::before { content: '📍'; font-size: 14px; } .gv-aistudio .gv-folder-item[data-pinned='true'] > .gv-folder-item-header .gv-folder-pin-btn .google-symbols::before { content: '📌'; color: #f59e0b; } /* Subtle highlight for pinned folders */ .gv-aistudio .gv-folder-item[data-pinned='true'] > .gv-folder-item-header { background-color: rgba(245, 158, 11, 0.08); } /* Aistudio conversation layout tweaks */ .gv-aistudio .gv-folder-conversation { overflow: visible; } /* AI Studio selected conversation style */ .gv-aistudio .gv-folder-conversation-selected { position: relative; background: linear-gradient( to right, var(--folder-selected-glow) 0%, transparent 100% ) !important; border-radius: 10px; transition: background 200ms ease; } .gv-aistudio .gv-folder-conversation-selected::before { content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 3px; height: 60%; border-radius: 0 2px 2px 0; background-color: var(--folder-selected-accent); opacity: 0.9; pointer-events: none; } .gv-aistudio .gv-folder-conversation-selected > * { position: relative; z-index: 1; } .gv-aistudio .gv-conversation-title { min-width: 0; } .gv-aistudio .gv-conversation-star-btn { margin-left: auto; } /* AI Studio: keep conversations readable with clear hierarchy */ .gv-aistudio .gv-folder-content { margin-left: 16px; padding-left: 10px; border-left: 1px solid var(--folder-border); } /* Root drop zone visuals */ .gv-aistudio .gv-folder-root-drop { margin: 4px 8px 0 8px; min-height: 28px; border-radius: 6px; border: 1px dashed var(--folder-border); color: var(--folder-icon-color); display: flex; align-items: center; justify-content: center; font-size: 11px; opacity: 0.7; } .gv-aistudio .gv-folder-root-drop.gv-folder-dragover { background-color: var(--folder-dragover-bg); border-color: var(--folder-dragover-border); opacity: 1; } /* Uncategorized section styles */ .gv-aistudio .gv-folder-uncategorized { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--folder-border); } .gv-aistudio .gv-folder-uncategorized-header { display: flex; align-items: center; padding: 6px 10px; font-size: 12px; color: var(--folder-icon-color); opacity: 0.7; } .gv-aistudio .gv-folder-uncategorized-content { padding-left: 8px; } .gv-aistudio .google-symbols[data-icon='inbox']::before { content: '📥'; font-size: 14px; } .gv-aistudio .google-symbols[data-icon='more_vert']::before { content: '⋮'; font-size: 16px; } .gv-aistudio .google-symbols[data-icon='add']::before { content: '+'; font-size: 16px; } .gv-aistudio .google-symbols[data-icon='download']::before { content: '⬇'; font-size: 16px; } .gv-aistudio .google-symbols[data-icon='upload']::before { content: '⬆'; font-size: 16px; } .gv-aistudio .google-symbols[data-icon='star']::before { content: '★'; font-size: 14px; } .gv-aistudio .google-symbols[data-icon='star_outline']::before { content: '☆'; font-size: 14px; } .gv-aistudio .google-symbols[data-icon='close']::before { content: '×'; font-size: 14px; } /* Import dialog */ /* ── Folder Import Dialog ── */ .gv-folder-import-dialog { background: oklch(0.995 0.002 250); border: 1px solid oklch(0.92 0.004 250 / 0.7); border-radius: 18px; padding: 24px; min-width: 400px; max-width: 500px; box-shadow: 0 16px 48px oklch(0 0 0 / 0.12), 0 6px 20px oklch(0 0 0 / 0.06); font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji'; animation: gv-folder-fadeIn 0.2s cubic-bezier(0.4, 0, 0.2, 1); } @media (prefers-color-scheme: dark) { .gv-folder-import-dialog { background: oklch(0.2 0.008 285); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 16px 48px oklch(0 0 0 / 0.4), 0 6px 20px oklch(0 0 0 / 0.25); } } .theme-host.dark-theme .gv-folder-import-dialog, body.dark-theme .gv-folder-import-dialog { background: oklch(0.2 0.008 285); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 16px 48px oklch(0 0 0 / 0.4), 0 6px 20px oklch(0 0 0 / 0.25); } .theme-host.light-theme .gv-folder-import-dialog, body.light-theme .gv-folder-import-dialog { background: oklch(0.995 0.002 250); border-color: oklch(0.92 0.004 250 / 0.7); } html.dark .gv-folder-import-dialog, [data-theme='dark'] .gv-folder-import-dialog, [data-color-scheme='dark'] .gv-folder-import-dialog { background: oklch(0.2 0.008 285); border-color: oklch(0.3 0.008 285 / 0.7); box-shadow: 0 16px 48px oklch(0 0 0 / 0.4), 0 6px 20px oklch(0 0 0 / 0.25); } .gv-folder-import-dialog .gv-folder-dialog-title { font-size: 17px; font-weight: 800; letter-spacing: -0.02em; margin-bottom: 20px; padding: 0; border-bottom: none; color: oklch(0.14 0.004 285); } @media (prefers-color-scheme: dark) { .gv-folder-import-dialog .gv-folder-dialog-title { color: oklch(0.92 0.004 250); } } html.dark .gv-folder-import-dialog .gv-folder-dialog-title, [data-theme='dark'] .gv-folder-import-dialog .gv-folder-dialog-title, [data-color-scheme='dark'] .gv-folder-import-dialog .gv-folder-dialog-title { color: oklch(0.92 0.004 250); } .theme-host.dark-theme .gv-folder-import-dialog .gv-folder-dialog-title, body.dark-theme .gv-folder-import-dialog .gv-folder-dialog-title { color: oklch(0.92 0.004 250); } .theme-host.light-theme .gv-folder-import-dialog .gv-folder-dialog-title, body.light-theme .gv-folder-import-dialog .gv-folder-dialog-title { color: oklch(0.14 0.004 285); } /* Strategy selection */ .gv-folder-import-strategy { margin-bottom: 20px; } .gv-folder-import-strategy-label { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 12px; color: oklch(0.14 0.004 285 / 0.5); } @media (prefers-color-scheme: dark) { .gv-folder-import-strategy-label { color: oklch(0.92 0.004 250 / 0.5); } } html.dark .gv-folder-import-strategy-label, [data-theme='dark'] .gv-folder-import-strategy-label, [data-color-scheme='dark'] .gv-folder-import-strategy-label { color: oklch(0.92 0.004 250 / 0.5); } .theme-host.dark-theme .gv-folder-import-strategy-label, body.dark-theme .gv-folder-import-strategy-label { color: oklch(0.92 0.004 250 / 0.5); } .theme-host.light-theme .gv-folder-import-strategy-label, body.light-theme .gv-folder-import-strategy-label { color: oklch(0.14 0.004 285 / 0.5); } .gv-folder-import-strategy-options { display: flex; flex-direction: column; gap: 8px; } .gv-folder-import-radio-option { display: flex; align-items: center; padding: 12px 14px; border: 1.5px solid oklch(0.92 0.004 250 / 0.7); border-radius: 10px; cursor: pointer; transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1); } .gv-folder-import-radio-option:hover { background: oklch(0.55 0.17 155 / 0.06); border-color: oklch(0.55 0.17 155 / 0.4); } @media (prefers-color-scheme: dark) { .gv-folder-import-radio-option { border-color: oklch(0.3 0.008 285 / 0.7); } .gv-folder-import-radio-option:hover { background: oklch(0.7 0.16 155 / 0.08); border-color: oklch(0.7 0.16 155 / 0.4); } } html.dark .gv-folder-import-radio-option, [data-theme='dark'] .gv-folder-import-radio-option, [data-color-scheme='dark'] .gv-folder-import-radio-option { border-color: oklch(0.3 0.008 285 / 0.7); } html.dark .gv-folder-import-radio-option:hover, [data-theme='dark'] .gv-folder-import-radio-option:hover, [data-color-scheme='dark'] .gv-folder-import-radio-option:hover { background: oklch(0.7 0.16 155 / 0.08); border-color: oklch(0.7 0.16 155 / 0.4); } .theme-host.dark-theme .gv-folder-import-radio-option, body.dark-theme .gv-folder-import-radio-option { border-color: oklch(0.3 0.008 285 / 0.7); } .theme-host.dark-theme .gv-folder-import-radio-option:hover, body.dark-theme .gv-folder-import-radio-option:hover { background: oklch(0.7 0.16 155 / 0.08); border-color: oklch(0.7 0.16 155 / 0.4); } .theme-host.light-theme .gv-folder-import-radio-option, body.light-theme .gv-folder-import-radio-option { border-color: oklch(0.92 0.004 250 / 0.7); } .theme-host.light-theme .gv-folder-import-radio-option:hover, body.light-theme .gv-folder-import-radio-option:hover { background: oklch(0.55 0.17 155 / 0.06); border-color: oklch(0.55 0.17 155 / 0.4); } .gv-folder-import-radio-option input[type='radio'] { margin-right: 12px; cursor: pointer; accent-color: oklch(0.55 0.17 155); } .gv-folder-import-radio-option span { font-size: 13px; font-weight: 500; color: oklch(0.14 0.004 285); } @media (prefers-color-scheme: dark) { .gv-folder-import-radio-option span { color: oklch(0.92 0.004 250); } } html.dark .gv-folder-import-radio-option span, [data-theme='dark'] .gv-folder-import-radio-option span, [data-color-scheme='dark'] .gv-folder-import-radio-option span { color: oklch(0.92 0.004 250); } .theme-host.dark-theme .gv-folder-import-radio-option span, body.dark-theme .gv-folder-import-radio-option span { color: oklch(0.92 0.004 250); } .theme-host.light-theme .gv-folder-import-radio-option span, body.light-theme .gv-folder-import-radio-option span { color: oklch(0.14 0.004 285); } /* File input */ .gv-folder-import-file-input { margin-bottom: 20px; } .gv-folder-import-file-button { background: oklch(0.55 0.17 155); color: oklch(0.99 0.01 155); border: none; padding: 10px 20px; border-radius: 9px; cursor: pointer; font-size: 13px; font-weight: 700; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); width: 100%; box-shadow: 0 2px 8px oklch(0.55 0.17 155 / 0.3); } .gv-folder-import-file-button:hover { background: oklch(0.6 0.2 158); box-shadow: 0 4px 14px oklch(0.55 0.17 155 / 0.4); transform: translateY(-1px); } @media (prefers-color-scheme: dark) { .gv-folder-import-file-button { background: oklch(0.7 0.16 155); color: oklch(0.15 0.025 160); box-shadow: 0 2px 8px oklch(0.7 0.16 155 / 0.3); } .gv-folder-import-file-button:hover { background: oklch(0.7 0.2 155); box-shadow: 0 4px 14px oklch(0.7 0.16 155 / 0.4); } } .theme-host.light-theme .gv-folder-import-file-button, body.light-theme .gv-folder-import-file-button { background: oklch(0.55 0.17 155); color: oklch(0.99 0.01 155); box-shadow: 0 2px 8px oklch(0.55 0.17 155 / 0.3); } .theme-host.dark-theme .gv-folder-import-file-button, body.dark-theme .gv-folder-import-file-button { background: oklch(0.7 0.16 155); color: oklch(0.15 0.025 160); box-shadow: 0 2px 8px oklch(0.7 0.16 155 / 0.3); } .gv-folder-import-file-name { margin-top: 12px; font-size: 12px; font-weight: 500; color: oklch(0.14 0.004 285 / 0.5); padding: 9px 12px; background: oklch(0.14 0.004 285 / 0.04); border-radius: 10px; text-align: center; min-height: 32px; display: none; align-items: center; justify-content: center; } .gv-folder-import-file-name:not(:empty) { display: flex; } @media (prefers-color-scheme: dark) { .gv-folder-import-file-name { background: oklch(0.92 0.004 250 / 0.06); color: oklch(0.92 0.004 250 / 0.5); } } html.dark .gv-folder-import-file-name, [data-theme='dark'] .gv-folder-import-file-name, [data-color-scheme='dark'] .gv-folder-import-file-name { background: oklch(0.92 0.004 250 / 0.06); color: oklch(0.92 0.004 250 / 0.5); } .theme-host.dark-theme .gv-folder-import-file-name, body.dark-theme .gv-folder-import-file-name { background: oklch(0.92 0.004 250 / 0.06); color: oklch(0.92 0.004 250 / 0.5); } .theme-host.light-theme .gv-folder-import-file-name, body.light-theme .gv-folder-import-file-name { background: oklch(0.14 0.004 285 / 0.04); color: oklch(0.14 0.004 285 / 0.5); } /* Dialog buttons */ .gv-folder-dialog-buttons { display: flex; gap: 8px; justify-content: flex-end; } .gv-folder-dialog-btn { padding: 8px 18px; border-radius: 9px; border: none; font-size: 13px; font-weight: 700; cursor: pointer; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .gv-folder-dialog-btn-primary { background: oklch(0.55 0.17 155); color: oklch(0.99 0.01 155); box-shadow: 0 2px 8px oklch(0.55 0.17 155 / 0.3); } .gv-folder-dialog-btn-primary:hover { background: oklch(0.6 0.2 158); box-shadow: 0 4px 14px oklch(0.55 0.17 155 / 0.4); transform: translateY(-1px); } @media (prefers-color-scheme: dark) { .gv-folder-dialog-btn-primary { background: oklch(0.7 0.16 155); color: oklch(0.15 0.025 160); box-shadow: 0 2px 8px oklch(0.7 0.16 155 / 0.3); } .gv-folder-dialog-btn-primary:hover { background: oklch(0.7 0.2 155); box-shadow: 0 4px 14px oklch(0.7 0.16 155 / 0.4); } } .theme-host.light-theme .gv-folder-dialog-btn-primary, body.light-theme .gv-folder-dialog-btn-primary { background: oklch(0.55 0.17 155); color: oklch(0.99 0.01 155); box-shadow: 0 2px 8px oklch(0.55 0.17 155 / 0.3); } .theme-host.dark-theme .gv-folder-dialog-btn-primary, body.dark-theme .gv-folder-dialog-btn-primary { background: oklch(0.7 0.16 155); color: oklch(0.15 0.025 160); box-shadow: 0 2px 8px oklch(0.7 0.16 155 / 0.3); } .gv-folder-dialog-btn-secondary { background: transparent; color: oklch(0.55 0.17 155); border: 1px solid oklch(0.14 0.004 285 / 0.12); } .gv-folder-dialog-btn-secondary:hover { background: oklch(0.14 0.004 285 / 0.06); } @media (prefers-color-scheme: dark) { .gv-folder-dialog-btn-secondary { color: oklch(0.7 0.16 155); border-color: oklch(0.92 0.004 250 / 0.12); } .gv-folder-dialog-btn-secondary:hover { background: oklch(0.92 0.004 250 / 0.06); } } html.dark .gv-folder-dialog-btn-secondary, [data-theme='dark'] .gv-folder-dialog-btn-secondary, [data-color-scheme='dark'] .gv-folder-dialog-btn-secondary { color: oklch(0.7 0.16 155); border-color: oklch(0.92 0.004 250 / 0.12); } html.dark .gv-folder-dialog-btn-secondary:hover, [data-theme='dark'] .gv-folder-dialog-btn-secondary:hover, [data-color-scheme='dark'] .gv-folder-dialog-btn-secondary:hover { background: oklch(0.92 0.004 250 / 0.06); } .theme-host.dark-theme .gv-folder-dialog-btn-secondary, body.dark-theme .gv-folder-dialog-btn-secondary { color: oklch(0.7 0.16 155); border-color: oklch(0.92 0.004 250 / 0.12); } .theme-host.dark-theme .gv-folder-dialog-btn-secondary:hover, body.dark-theme .gv-folder-dialog-btn-secondary:hover { background: oklch(0.92 0.004 250 / 0.06); } .theme-host.light-theme .gv-folder-dialog-btn-secondary, body.light-theme .gv-folder-dialog-btn-secondary { color: oklch(0.55 0.17 155); border-color: oklch(0.14 0.004 285 / 0.12); } .theme-host.light-theme .gv-folder-dialog-btn-secondary:hover, body.light-theme .gv-folder-dialog-btn-secondary:hover { background: oklch(0.14 0.004 285 / 0.06); } /* Paste JSON toggle & textarea */ .gv-folder-import-paste-container { margin-bottom: 20px; } .gv-folder-import-paste-toggle { background: transparent; color: oklch(0.55 0.17 155); border: 1px dashed oklch(0.92 0.004 250 / 0.7); padding: 9px 16px; border-radius: 10px; cursor: pointer; font-size: 13px; font-weight: 600; width: 100%; transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1); } .gv-folder-import-paste-toggle:hover { background: oklch(0.55 0.17 155 / 0.06); border-color: oklch(0.55 0.17 155 / 0.4); } .gv-folder-import-paste-toggle-active { background: oklch(0.55 0.17 155 / 0.1); border-color: oklch(0.55 0.17 155 / 0.5); border-style: solid; } @media (prefers-color-scheme: dark) { .gv-folder-import-paste-toggle { color: oklch(0.7 0.16 155); border-color: oklch(0.3 0.008 285 / 0.7); } .gv-folder-import-paste-toggle:hover { background: oklch(0.7 0.16 155 / 0.08); border-color: oklch(0.7 0.16 155 / 0.4); } .gv-folder-import-paste-toggle-active { background: oklch(0.7 0.16 155 / 0.12); border-color: oklch(0.7 0.16 155 / 0.5); } } html.dark .gv-folder-import-paste-toggle, [data-theme='dark'] .gv-folder-import-paste-toggle, [data-color-scheme='dark'] .gv-folder-import-paste-toggle { color: oklch(0.7 0.16 155); border-color: oklch(0.3 0.008 285 / 0.7); } html.dark .gv-folder-import-paste-toggle:hover, [data-theme='dark'] .gv-folder-import-paste-toggle:hover, [data-color-scheme='dark'] .gv-folder-import-paste-toggle:hover { background: oklch(0.7 0.16 155 / 0.08); border-color: oklch(0.7 0.16 155 / 0.4); } html.dark .gv-folder-import-paste-toggle-active, [data-theme='dark'] .gv-folder-import-paste-toggle-active, [data-color-scheme='dark'] .gv-folder-import-paste-toggle-active { background: oklch(0.7 0.16 155 / 0.12); border-color: oklch(0.7 0.16 155 / 0.5); } .gv-folder-import-paste-area { width: 100%; min-height: 120px; max-height: 300px; margin-top: 10px; padding: 9px 12px; border: 1.5px solid oklch(0.92 0.004 250 / 0.7); border-radius: 10px; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; line-height: 1.5; resize: vertical; background: oklch(0.14 0.004 285 / 0.04); color: oklch(0.14 0.004 285); box-sizing: border-box; transition: border-color 0.2s ease, box-shadow 0.2s ease; } .gv-folder-import-paste-area:focus { outline: none; border-color: oklch(0.55 0.17 155 / 0.5); box-shadow: 0 0 0 3px oklch(0.55 0.17 155 / 0.1); } @media (prefers-color-scheme: dark) { .gv-folder-import-paste-area { background: oklch(0.92 0.004 250 / 0.06); color: oklch(0.92 0.004 250); border-color: oklch(0.3 0.008 285 / 0.7); } .gv-folder-import-paste-area:focus { border-color: oklch(0.7 0.16 155 / 0.5); box-shadow: 0 0 0 3px oklch(0.7 0.16 155 / 0.1); } } html.dark .gv-folder-import-paste-area, [data-theme='dark'] .gv-folder-import-paste-area, [data-color-scheme='dark'] .gv-folder-import-paste-area { background: oklch(0.92 0.004 250 / 0.06); color: oklch(0.92 0.004 250); border-color: oklch(0.3 0.008 285 / 0.7); } html.dark .gv-folder-import-paste-area:focus, [data-theme='dark'] .gv-folder-import-paste-area:focus, [data-color-scheme='dark'] .gv-folder-import-paste-area:focus { border-color: oklch(0.7 0.16 155 / 0.5); box-shadow: 0 0 0 3px oklch(0.7 0.16 155 / 0.1); } /* Notification toast */ .gv-notification { position: fixed; bottom: 24px; right: 24px; padding: 12px 20px; border-radius: 8px; font-size: 14px; font-weight: 500; color: white; z-index: 2147483647; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); opacity: 0; transform: translateY(20px); transition: all 0.3s ease; max-width: 400px; font-family: 'Google Sans', Roboto, Arial, sans-serif; } .gv-notification.show { opacity: 1; transform: translateY(0); } .gv-notification-success { background: linear-gradient(135deg, #34a853 0%, #0d652d 100%); } .gv-notification-error { background: linear-gradient(135deg, #ea4335 0%, #c5221f 100%); } .gv-notification-info { background: linear-gradient(135deg, #1a73e8 0%, #1765cc 100%); } /* ========================================================================== Export Dialog Styles ========================================================================== */ /* Dialog overlay */ .gv-export-dialog-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(4px); z-index: 2147483647; display: flex; align-items: center; justify-content: center; animation: gv-fade-in 0.2s ease-out; } @keyframes gv-fade-in { from { opacity: 0; } to { opacity: 1; } } /* Dialog container */ .gv-export-dialog { background: white; border-radius: 16px; padding: 24px; min-width: 420px; max-width: 500px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12); font-family: 'Google Sans', Roboto, Arial, sans-serif; animation: gv-slide-up 0.3s ease-out; } @keyframes gv-slide-up { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } html.dark .gv-export-dialog, [data-theme='dark'] .gv-export-dialog, [data-color-scheme='dark'] .gv-export-dialog { background: #1e1e1e; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); } /* Dialog title */ .gv-export-dialog-title { font-size: 20px; font-weight: 500; margin-bottom: 8px; color: #202124; } html.dark .gv-export-dialog-title, [data-theme='dark'] .gv-export-dialog-title, [data-color-scheme='dark'] .gv-export-dialog-title { color: #e8eaed; } /* Dialog subtitle */ .gv-export-dialog-subtitle { font-size: 14px; color: #5f6368; margin-bottom: 20px; } html.dark .gv-export-dialog-subtitle, [data-theme='dark'] .gv-export-dialog-subtitle, [data-color-scheme='dark'] .gv-export-dialog-subtitle { color: #9aa0a6; } /* Warning message */ .gv-export-dialog-warning { font-size: 13px; color: #d93025; background-color: #fef7e0; border: 1px solid #f9ab00; border-radius: 8px; padding: 12px 16px; margin-bottom: 20px; line-height: 1.5; } html.dark .gv-export-dialog-warning, [data-theme='dark'] .gv-export-dialog-warning, [data-color-scheme='dark'] .gv-export-dialog-warning { color: #fdd663; background-color: rgba(249, 171, 0, 0.1); border-color: #f9ab00; } /* Format list */ .gv-export-format-list { display: flex; flex-direction: column; gap: 12px; margin-bottom: 24px; } /* Format option */ .gv-export-format-option { display: flex; align-items: flex-start; padding: 16px; border: 2px solid #dadce0; border-radius: 8px; cursor: pointer; transition: all 0.2s ease; } .gv-export-format-option:hover { background-color: #f8f9fa; border-color: #1a73e8; } .gv-export-format-option:has(input:checked) { background-color: #e8f0fe; border-color: #1a73e8; } html.dark .gv-export-format-option, [data-theme='dark'] .gv-export-format-option, [data-color-scheme='dark'] .gv-export-format-option { border-color: #3c4043; } html.dark .gv-export-format-option:hover, [data-theme='dark'] .gv-export-format-option:hover, [data-color-scheme='dark'] .gv-export-format-option:hover { background-color: #2d2e30; border-color: #8ab4f8; } html.dark .gv-export-format-option:has(input:checked), [data-theme='dark'] .gv-export-format-option:has(input:checked), [data-color-scheme='dark'] .gv-export-format-option:has(input:checked) { background-color: #1e3a5f; border-color: #8ab4f8; } /* Radio input */ .gv-export-format-option input[type='radio'] { margin-right: 12px; margin-top: 2px; cursor: pointer; flex-shrink: 0; width: 18px; height: 18px; accent-color: #1a73e8; } /* Format content */ .gv-export-format-content { flex: 1; } .gv-export-format-label { font-size: 15px; font-weight: 500; color: #202124; margin-bottom: 4px; display: flex; align-items: center; gap: 8px; } html.dark .gv-export-format-label, [data-theme='dark'] .gv-export-format-label, [data-color-scheme='dark'] .gv-export-format-label { color: #e8eaed; } .gv-export-format-badge { display: inline-block; padding: 2px 8px; background: #34a853; color: white; font-size: 11px; font-weight: 500; border-radius: 4px; text-transform: uppercase; letter-spacing: 0.5px; } .gv-export-format-description { font-size: 13px; color: #5f6368; line-height: 1.4; } html.dark .gv-export-format-description, [data-theme='dark'] .gv-export-format-description, [data-color-scheme='dark'] .gv-export-format-description { color: #9aa0a6; } /* Dialog buttons */ .gv-export-dialog-buttons { display: flex; gap: 12px; justify-content: flex-end; } .gv-export-dialog-btn { padding: 10px 24px; border-radius: 8px; border: none; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; } .gv-export-dialog-btn-primary { background: #1a73e8; color: white; } .gv-export-dialog-btn-primary:hover { background: #1765cc; box-shadow: 0 2px 8px rgba(26, 115, 232, 0.3); } .gv-export-dialog-btn-secondary { background: transparent; color: #1a73e8; border: 1px solid #dadce0; } .gv-export-dialog-btn-secondary:hover { background: #f8f9fa; } html.dark .gv-export-dialog-btn-secondary, [data-theme='dark'] .gv-export-dialog-btn-secondary, [data-color-scheme='dark'] .gv-export-dialog-btn-secondary { color: #8ab4f8; border-color: #3c4043; } html.dark .gv-export-dialog-btn-secondary:hover, [data-theme='dark'] .gv-export-dialog-btn-secondary:hover, [data-color-scheme='dark'] .gv-export-dialog-btn-secondary:hover { background: #2d2e30; } /* Dark theme fallback selectors used by some Gemini variants */ html.dark-theme .gv-export-dialog, body.dark-theme .gv-export-dialog, body[data-theme='dark'] .gv-export-dialog, body[data-color-scheme='dark'] .gv-export-dialog { background: #1e1e1e; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); } html.dark-theme .gv-export-dialog-title, body.dark-theme .gv-export-dialog-title, body[data-theme='dark'] .gv-export-dialog-title, body[data-color-scheme='dark'] .gv-export-dialog-title { color: #e8eaed; } html.dark-theme .gv-export-dialog-subtitle, body.dark-theme .gv-export-dialog-subtitle, body[data-theme='dark'] .gv-export-dialog-subtitle, body[data-color-scheme='dark'] .gv-export-dialog-subtitle { color: #9aa0a6; } html.dark-theme .gv-export-dialog-warning, body.dark-theme .gv-export-dialog-warning, body[data-theme='dark'] .gv-export-dialog-warning, body[data-color-scheme='dark'] .gv-export-dialog-warning { color: #fdd663; background-color: rgba(249, 171, 0, 0.1); border-color: #f9ab00; } html.dark-theme .gv-export-format-option, body.dark-theme .gv-export-format-option, body[data-theme='dark'] .gv-export-format-option, body[data-color-scheme='dark'] .gv-export-format-option { border-color: #3c4043; } html.dark-theme .gv-export-format-option:hover, body.dark-theme .gv-export-format-option:hover, body[data-theme='dark'] .gv-export-format-option:hover, body[data-color-scheme='dark'] .gv-export-format-option:hover { background-color: #2d2e30; border-color: #8ab4f8; } html.dark-theme .gv-export-format-option:has(input:checked), body.dark-theme .gv-export-format-option:has(input:checked), body[data-theme='dark'] .gv-export-format-option:has(input:checked), body[data-color-scheme='dark'] .gv-export-format-option:has(input:checked) { background-color: #1e3a5f; border-color: #8ab4f8; } html.dark-theme .gv-export-format-label, body.dark-theme .gv-export-format-label, body[data-theme='dark'] .gv-export-format-label, body[data-color-scheme='dark'] .gv-export-format-label { color: #e8eaed; } html.dark-theme .gv-export-format-description, body.dark-theme .gv-export-format-description, body[data-theme='dark'] .gv-export-format-description, body[data-color-scheme='dark'] .gv-export-format-description { color: #9aa0a6; } html.dark-theme .gv-export-dialog-btn-secondary, body.dark-theme .gv-export-dialog-btn-secondary, body[data-theme='dark'] .gv-export-dialog-btn-secondary, body[data-color-scheme='dark'] .gv-export-dialog-btn-secondary { color: #8ab4f8; border-color: #3c4043; } html.dark-theme .gv-export-dialog-btn-secondary:hover, body.dark-theme .gv-export-dialog-btn-secondary:hover, body[data-theme='dark'] .gv-export-dialog-btn-secondary:hover, body[data-color-scheme='dark'] .gv-export-dialog-btn-secondary:hover { background: #2d2e30; } /* Font size control section in export dialog */ .gv-export-fontsize-section { margin-bottom: 20px; padding: 16px; border: 1px solid #dadce0; border-radius: 8px; background: #f8f9fa; } html.dark .gv-export-fontsize-section, [data-theme='dark'] .gv-export-fontsize-section, [data-color-scheme='dark'] .gv-export-fontsize-section, html.dark-theme .gv-export-fontsize-section, body.dark-theme .gv-export-fontsize-section, body[data-theme='dark'] .gv-export-fontsize-section, body[data-color-scheme='dark'] .gv-export-fontsize-section { border-color: #3c4043; background: #2d2e30; } .gv-export-fontsize-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .gv-export-fontsize-label { font-size: 14px; font-weight: 500; color: #202124; } html.dark .gv-export-fontsize-label, [data-theme='dark'] .gv-export-fontsize-label, [data-color-scheme='dark'] .gv-export-fontsize-label, html.dark-theme .gv-export-fontsize-label, body.dark-theme .gv-export-fontsize-label, body[data-theme='dark'] .gv-export-fontsize-label, body[data-color-scheme='dark'] .gv-export-fontsize-label { color: #e8eaed; } .gv-export-fontsize-value { font-size: 14px; font-weight: 600; color: #1a73e8; min-width: 40px; text-align: right; } html.dark .gv-export-fontsize-value, [data-theme='dark'] .gv-export-fontsize-value, [data-color-scheme='dark'] .gv-export-fontsize-value, html.dark-theme .gv-export-fontsize-value, body.dark-theme .gv-export-fontsize-value, body[data-theme='dark'] .gv-export-fontsize-value, body[data-color-scheme='dark'] .gv-export-fontsize-value { color: #8ab4f8; } .gv-export-fontsize-slider { width: 100%; height: 4px; -webkit-appearance: none; appearance: none; outline: none; border-radius: 2px; background: #dadce0; cursor: pointer; margin-bottom: 12px; } .gv-export-fontsize-slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 18px; height: 18px; border-radius: 50%; background: #1a73e8; cursor: pointer; border: 2px solid #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); } .gv-export-fontsize-slider::-moz-range-thumb { width: 18px; height: 18px; border-radius: 50%; background: #1a73e8; cursor: pointer; border: 2px solid #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); } html.dark .gv-export-fontsize-slider, [data-theme='dark'] .gv-export-fontsize-slider, [data-color-scheme='dark'] .gv-export-fontsize-slider, html.dark-theme .gv-export-fontsize-slider, body.dark-theme .gv-export-fontsize-slider, body[data-theme='dark'] .gv-export-fontsize-slider, body[data-color-scheme='dark'] .gv-export-fontsize-slider { background: #3c4043; } .gv-export-fontsize-preview { padding: 10px 14px; border: 1px solid #dadce0; border-radius: 6px; background: white; color: #202124; font-family: Georgia, 'Times New Roman', serif; line-height: 1.6; max-height: 60px; overflow: hidden; } html.dark .gv-export-fontsize-preview, [data-theme='dark'] .gv-export-fontsize-preview, [data-color-scheme='dark'] .gv-export-fontsize-preview, html.dark-theme .gv-export-fontsize-preview, body.dark-theme .gv-export-fontsize-preview, body[data-theme='dark'] .gv-export-fontsize-preview, body[data-color-scheme='dark'] .gv-export-fontsize-preview { border-color: #3c4043; background: #1e1e1e; color: #e8eaed; } .gv-aistudio .gv-conversation-title { min-width: 0; font-size: 12px; } /* Hide conversation icon to save space */ .gv-aistudio .gv-conversation-icon.google-symbols { display: none; } /* Message selection mode for export */ .gv-export-select-mode .gv-export-msg-host { position: relative; cursor: pointer; } .gv-export-msg-selector { display: none; position: absolute; left: 8px; top: 50%; transform: translateY(-50%); z-index: 30; } .gv-export-select-mode .gv-export-msg-selector { display: flex; align-items: center; justify-content: center; } .gv-export-msg-checkbox { width: 22px; height: 22px; border-radius: 6px; border: 1px solid rgba(0, 0, 0, 0.15); background: rgba(255, 255, 255, 0.9); color: #64748b; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; transition: all 0.12s ease; } .gv-export-msg-checkbox:hover { border-color: rgba(22, 163, 74, 0.6); box-shadow: 0 0 0 2px rgba(22, 163, 74, 0.12); } .gv-export-msg-checkbox-mark { width: 8px; height: 4px; border-left: 2px solid transparent; border-bottom: 2px solid transparent; transform: rotate(-45deg) translate(0, -1px); } .gv-export-msg-checkbox[data-selected='true'] { background: #16a34a; border-color: #16a34a; } .gv-export-msg-checkbox[data-selected='true'] .gv-export-msg-checkbox-mark { border-left-color: #fff; border-bottom-color: #fff; } /* Dark theme for checkbox */ html.dark .gv-export-msg-checkbox, html.dark-theme .gv-export-msg-checkbox, .theme-host.dark-theme .gv-export-msg-checkbox { border-color: rgba(255, 255, 255, 0.2); background: rgba(19, 22, 28, 0.9); color: #8b98aa; } html.dark .gv-export-msg-checkbox:hover, html.dark-theme .gv-export-msg-checkbox:hover, .theme-host.dark-theme .gv-export-msg-checkbox:hover { border-color: rgba(128, 255, 176, 0.7); box-shadow: 0 0 0 2px rgba(128, 255, 176, 0.15); } .gv-export-msg-selected { box-shadow: 0 0 0 1px rgba(34, 197, 94, 0.55), 0 8px 18px rgba(34, 197, 94, 0.1); } .gv-export-select-bar { position: fixed; left: 50%; top: 12px; width: max-content; max-width: calc(100vw - 32px); transform: translateX(-50%); z-index: 2147483600; display: flex; align-items: center; gap: 12px; padding: 10px 14px; border-radius: 14px; background: rgba(13, 17, 23, 0.92); border: 1px solid rgba(255, 255, 255, 0.12); backdrop-filter: blur(10px); color: #e5ecf5; box-shadow: 0 12px 30px rgba(0, 0, 0, 0.38), 0 2px 8px rgba(0, 0, 0, 0.22); overflow-x: auto; scrollbar-width: none; /* Firefox */ } .gv-export-select-bar::-webkit-scrollbar { display: none; /* Chrome, Safari, Opera */ } .gv-export-select-all-toggle, .gv-export-select-role-btn, .gv-export-select-export-btn, .gv-export-select-cancel-btn { border: 0; cursor: pointer; transition: all 0.12s ease; } .gv-export-select-all-toggle, .gv-export-select-role-btn { min-width: 68px; flex-shrink: 0; height: 34px; padding: 0 12px; border-radius: 10px; background: rgba(255, 255, 255, 0.08); color: #e5ecf5; font-size: 13px; font-weight: 600; white-space: nowrap; } .gv-export-select-all-toggle[data-checked='true'], .gv-export-select-role-btn[data-checked='true'], .gv-export-select-role-btn:active { background: rgba(22, 163, 74, 0.24); color: #bbf7d0; } .gv-export-select-all-toggle:hover:not(:active), .gv-export-select-role-btn:hover:not(:active) { background: rgba(255, 255, 255, 0.14); } .gv-export-select-count { min-width: 92px; flex-shrink: 0; text-align: center; color: #cfd8e3; font-size: 13px; font-weight: 600; white-space: nowrap; } .gv-export-select-export-btn { min-width: 74px; flex-shrink: 0; height: 34px; padding: 0 14px; border-radius: 10px; background: #1d4ed8; color: #fff; font-size: 13px; font-weight: 700; white-space: nowrap; } .gv-export-select-export-btn:hover:not(:disabled) { background: #2563eb; } .gv-export-select-export-btn:disabled { opacity: 0.45; cursor: not-allowed; } .gv-export-select-cancel-btn { width: 34px; flex-shrink: 0; height: 34px; border-radius: 10px; background: transparent; color: #a8b6c8; font-size: 20px; line-height: 1; } .gv-export-select-cancel-btn:hover { background: rgba(255, 255, 255, 0.1); color: #eef4ff; } .gv-export-progress-overlay { position: fixed; left: 50%; transform: translateX(-50%); top: 12px; z-index: 2147483645; pointer-events: none; } .gv-export-progress-card { min-width: 220px; max-width: min(360px, calc(100vw - 24px)); padding: 9px 12px; border-radius: 999px; border: 1px solid rgba(15, 23, 42, 0.12); background: rgba(255, 255, 255, 0.92); color: #0f172a; box-shadow: 0 10px 24px rgba(15, 23, 42, 0.16), 0 2px 8px rgba(15, 23, 42, 0.08); backdrop-filter: blur(10px); display: grid; grid-template-columns: auto 1fr; grid-template-areas: 'spinner title' 'spinner desc'; align-items: center; column-gap: 10px; row-gap: 1px; } .gv-export-progress-spinner { grid-area: spinner; width: 22px; height: 22px; border-radius: 999px; border: 2px solid rgba(100, 116, 139, 0.32); border-top-color: #2563eb; animation: gv-export-progress-spin 0.8s linear infinite; } .gv-export-progress-title { grid-area: title; font-size: 16px; font-weight: 700; color: #0f172a; line-height: 1.2; } .gv-export-progress-desc { grid-area: desc; font-size: 12px; color: #475569; line-height: 1.2; } html.dark .gv-export-progress-card, html.dark-theme .gv-export-progress-card, body.dark-theme .gv-export-progress-card, [data-theme='dark'] .gv-export-progress-card, [data-color-scheme='dark'] .gv-export-progress-card, body[data-theme='dark'] .gv-export-progress-card, body[data-color-scheme='dark'] .gv-export-progress-card { border: 1px solid rgba(148, 163, 184, 0.3); background: rgba(10, 16, 24, 0.86); color: #e5ecf5; box-shadow: 0 10px 24px rgba(0, 0, 0, 0.32), 0 2px 8px rgba(0, 0, 0, 0.2); } html.dark .gv-export-progress-spinner, html.dark-theme .gv-export-progress-spinner, body.dark-theme .gv-export-progress-spinner, [data-theme='dark'] .gv-export-progress-spinner, [data-color-scheme='dark'] .gv-export-progress-spinner, body[data-theme='dark'] .gv-export-progress-spinner, body[data-color-scheme='dark'] .gv-export-progress-spinner { border: 2px solid rgba(148, 163, 184, 0.35); border-top-color: #3b82f6; } html.dark .gv-export-progress-title, html.dark-theme .gv-export-progress-title, body.dark-theme .gv-export-progress-title, [data-theme='dark'] .gv-export-progress-title, [data-color-scheme='dark'] .gv-export-progress-title, body[data-theme='dark'] .gv-export-progress-title, body[data-color-scheme='dark'] .gv-export-progress-title { color: #f8fbff; } html.dark .gv-export-progress-desc, html.dark-theme .gv-export-progress-desc, body.dark-theme .gv-export-progress-desc, [data-theme='dark'] .gv-export-progress-desc, [data-color-scheme='dark'] .gv-export-progress-desc, body[data-theme='dark'] .gv-export-progress-desc, body[data-color-scheme='dark'] .gv-export-progress-desc { color: #aebfd2; } @keyframes gv-export-progress-spin { from { transform: rotate(0); } to { transform: rotate(360deg); } } @media (max-width: 640px) { .gv-export-select-bar { left: 10px; right: 10px; top: 10px; transform: none; justify-content: space-between; gap: 8px; } .gv-export-select-all-toggle { min-width: 62px; padding: 0 10px; } .gv-export-select-count { min-width: 82px; font-size: 12px; } .gv-export-select-export-btn { min-width: 66px; padding: 0 10px; } .gv-export-progress-overlay { top: 10px; } .gv-export-progress-card { max-width: calc(100vw - 20px); } } /* ===== Changelog Modal ===== */ .gv-changelog-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(4px); z-index: 2147483647; display: flex; align-items: center; justify-content: center; animation: gv-fade-in 0.2s ease-out; } .gv-changelog-dialog { background: white; border-radius: 16px; min-width: 360px; max-width: 520px; width: 90vw; max-height: 80vh; display: flex; flex-direction: column; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12); font-family: 'Google Sans', Roboto, Arial, sans-serif; animation: gv-slide-up 0.3s ease-out; } html.dark .gv-changelog-dialog, [data-theme='dark'] .gv-changelog-dialog, [data-color-scheme='dark'] .gv-changelog-dialog { background: #1e1e1e; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); } .gv-changelog-header { display: flex; align-items: center; gap: 8px; padding: 20px 24px 16px; border-bottom: 1px solid #e0e0e0; } html.dark .gv-changelog-header, [data-theme='dark'] .gv-changelog-header, [data-color-scheme='dark'] .gv-changelog-header { border-bottom-color: #3c4043; } .gv-changelog-title { font-size: 18px; font-weight: 600; color: #202124; } html.dark .gv-changelog-title, [data-theme='dark'] .gv-changelog-title, [data-color-scheme='dark'] .gv-changelog-title { color: #e8eaed; } .gv-changelog-version { font-size: 12px; font-weight: 500; color: #1a73e8; background: #e8f0fe; padding: 2px 8px; border-radius: 12px; } html.dark .gv-changelog-version, [data-theme='dark'] .gv-changelog-version, [data-color-scheme='dark'] .gv-changelog-version { color: #8ab4f8; background: rgba(138, 180, 248, 0.15); } .gv-changelog-close { margin-left: auto; background: none; border: none; font-size: 18px; color: #5f6368; cursor: pointer; padding: 4px 8px; border-radius: 50%; line-height: 1; transition: background-color 0.2s; } .gv-changelog-close:hover { background-color: rgba(0, 0, 0, 0.08); } html.dark .gv-changelog-close, [data-theme='dark'] .gv-changelog-close, [data-color-scheme='dark'] .gv-changelog-close { color: #9aa0a6; } html.dark .gv-changelog-close:hover, [data-theme='dark'] .gv-changelog-close:hover, [data-color-scheme='dark'] .gv-changelog-close:hover { background-color: rgba(255, 255, 255, 0.08); } .gv-changelog-body { flex: 1; overflow-y: auto; padding: 16px 24px; font-size: 14px; line-height: 1.6; color: #3c4043; } html.dark .gv-changelog-body, [data-theme='dark'] .gv-changelog-body, [data-color-scheme='dark'] .gv-changelog-body { color: #bdc1c6; } .gv-changelog-body h3 { font-size: 16px; font-weight: 600; margin: 0 0 12px; color: #202124; } html.dark .gv-changelog-body h3, [data-theme='dark'] .gv-changelog-body h3, [data-color-scheme='dark'] .gv-changelog-body h3 { color: #e8eaed; } .gv-changelog-body ul { margin: 0 0 12px; padding-left: 20px; } .gv-changelog-body li { margin-bottom: 6px; } .gv-changelog-body code { font-size: 13px; background: #f1f3f4; padding: 1px 6px; border-radius: 4px; } html.dark .gv-changelog-body code, [data-theme='dark'] .gv-changelog-body code, [data-color-scheme='dark'] .gv-changelog-body code { background: #3c4043; } .gv-changelog-body p { margin: 0 0 12px; } .gv-changelog-body img { max-width: 100%; border-radius: 8px; margin: 8px 0; cursor: zoom-in; transition: opacity 0.15s; } .gv-changelog-body img:hover { opacity: 0.9; } .gv-changelog-body a { color: #1a73e8; text-decoration: none; } .gv-changelog-body a:hover { text-decoration: underline; } html.dark .gv-changelog-body a, [data-theme='dark'] .gv-changelog-body a, [data-color-scheme='dark'] .gv-changelog-body a { color: #8ab4f8; } .gv-changelog-footer { display: flex; flex-direction: column; padding: 16px 24px; border-top: 1px solid #e0e0e0; gap: 12px; } html.dark .gv-changelog-footer, [data-theme='dark'] .gv-changelog-footer, [data-color-scheme='dark'] .gv-changelog-footer { border-top-color: #3c4043; } .gv-changelog-recommendation { font-size: 13px; color: #5f6368; margin: 0; line-height: 1.5; } html.dark .gv-changelog-recommendation, [data-theme='dark'] .gv-changelog-recommendation, [data-color-scheme='dark'] .gv-changelog-recommendation { color: #9aa0a6; } .gv-changelog-social-row { display: flex; flex-wrap: wrap; gap: 6px 12px; margin: 8px 0 0; font-size: 12px; color: #5f6368; line-height: 1.5; } .gv-changelog-social-item { display: inline-flex; align-items: center; gap: 4px; text-decoration: none; color: inherit; transition: opacity 0.15s; } a.gv-changelog-social-item:hover { opacity: 0.7; } .gv-changelog-social-icon { display: inline-flex; align-items: center; flex-shrink: 0; } html.dark .gv-changelog-social-row, [data-theme='dark'] .gv-changelog-social-row, [data-color-scheme='dark'] .gv-changelog-social-row { color: #9aa0a6; } .gv-changelog-action-row { display: flex; align-items: center; justify-content: space-between; } .gv-changelog-icon-group { display: flex; align-items: center; gap: 4px; } .gv-changelog-icon-link { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 50%; color: #5f6368; transition: background-color 0.2s, color 0.2s; text-decoration: none; } .gv-changelog-icon-link:hover { background-color: rgba(0, 0, 0, 0.06); } .gv-changelog-icon-sponsor:hover { color: #db61a2; } .gv-changelog-icon-github:hover { color: #24292f; } .gv-changelog-icon-docs:hover { color: #1a73e8; } .gv-changelog-icon-x:hover { color: #000000; } html.dark .gv-changelog-icon-link, [data-theme='dark'] .gv-changelog-icon-link, [data-color-scheme='dark'] .gv-changelog-icon-link { color: #9aa0a6; } html.dark .gv-changelog-icon-link:hover, [data-theme='dark'] .gv-changelog-icon-link:hover, [data-color-scheme='dark'] .gv-changelog-icon-link:hover { background-color: rgba(255, 255, 255, 0.08); } html.dark .gv-changelog-icon-sponsor:hover, [data-theme='dark'] .gv-changelog-icon-sponsor:hover, [data-color-scheme='dark'] .gv-changelog-icon-sponsor:hover { color: #f778ba; } html.dark .gv-changelog-icon-github:hover, [data-theme='dark'] .gv-changelog-icon-github:hover, [data-color-scheme='dark'] .gv-changelog-icon-github:hover { color: #e8eaed; } html.dark .gv-changelog-icon-docs:hover, [data-theme='dark'] .gv-changelog-icon-docs:hover, [data-color-scheme='dark'] .gv-changelog-icon-docs:hover { color: #8ab4f8; } html.dark .gv-changelog-icon-x:hover, [data-theme='dark'] .gv-changelog-icon-x:hover, [data-color-scheme='dark'] .gv-changelog-icon-x:hover { color: #e8eaed; } .gv-changelog-docs-wrapper { position: relative; display: flex; align-items: center; } .gv-changelog-docs-annotation { position: absolute; left: calc(100% + 6px); white-space: nowrap; font-size: 11px; color: #80868b; pointer-events: none; display: flex; align-items: center; gap: 2px; } .gv-changelog-docs-annotation::before { content: '\2190'; font-size: 12px; } html.dark .gv-changelog-docs-annotation, [data-theme='dark'] .gv-changelog-docs-annotation, [data-color-scheme='dark'] .gv-changelog-docs-annotation { color: #80868b; } .gv-changelog-got-it { background: #1a73e8; color: white; border: none; border-radius: 20px; padding: 8px 24px; font-size: 14px; font-weight: 500; cursor: pointer; transition: background-color 0.2s; white-space: nowrap; } .gv-changelog-got-it:hover { background: #1557b0; } html.dark .gv-changelog-got-it, [data-theme='dark'] .gv-changelog-got-it, [data-color-scheme='dark'] .gv-changelog-got-it { background: #8ab4f8; color: #202124; } html.dark .gv-changelog-got-it:hover, [data-theme='dark'] .gv-changelog-got-it:hover, [data-color-scheme='dark'] .gv-changelog-got-it:hover { background: #aecbfa; } .gv-changelog-chrome-rating { display: flex; align-items: center; gap: 12px; padding: 10px 14px; margin-bottom: 12px; border-radius: 10px; background: linear-gradient(135deg, #eff6ff 0%, #f5f3ff 100%); border: 1px solid rgba(99, 102, 241, 0.12); } .gv-changelog-chrome-rating-text { flex: 1; font-size: 12.5px; color: #374151; line-height: 1.4; } .gv-changelog-chrome-rating-link { display: inline-flex; align-items: center; gap: 4px; padding: 6px 14px; background: #1a73e8; color: white !important; border-radius: 20px; font-size: 12px; font-weight: 500; text-decoration: none !important; white-space: nowrap; flex-shrink: 0; transition: background-color 0.2s; } .gv-changelog-chrome-rating-link:hover { background: #1557b0; text-decoration: none !important; } html.dark .gv-changelog-chrome-rating, [data-theme='dark'] .gv-changelog-chrome-rating, [data-color-scheme='dark'] .gv-changelog-chrome-rating { background: linear-gradient(135deg, rgba(59, 130, 246, 0.1) 0%, rgba(139, 92, 246, 0.1) 100%); border-color: rgba(139, 92, 246, 0.2); } html.dark .gv-changelog-chrome-rating-text, [data-theme='dark'] .gv-changelog-chrome-rating-text, [data-color-scheme='dark'] .gv-changelog-chrome-rating-text { color: #bdc1c6; } html.dark .gv-changelog-chrome-rating-link, [data-theme='dark'] .gv-changelog-chrome-rating-link, [data-color-scheme='dark'] .gv-changelog-chrome-rating-link { background: #8ab4f8; color: #202124 !important; } html.dark .gv-changelog-chrome-rating-link:hover, [data-theme='dark'] .gv-changelog-chrome-rating-link:hover, [data-color-scheme='dark'] .gv-changelog-chrome-rating-link:hover { background: #aecbfa; } .gv-changelog-lightbox { position: fixed; inset: 0; z-index: 2147483647; background: rgba(0, 0, 0, 0.88); display: flex; align-items: center; justify-content: center; padding: 24px; cursor: zoom-out; animation: gv-lightbox-in 0.18s ease; } @keyframes gv-lightbox-in { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } } .gv-changelog-lightbox-img { max-width: 90vw; max-height: 88vh; border-radius: 10px; object-fit: contain; box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6); pointer-events: none; } /* Changelog notification mode toggle */ .gv-changelog-notify-toggle { margin-bottom: 12px; padding: 8px 12px; border-radius: 8px; background: rgba(0, 0, 0, 0.03); border: 1px solid rgba(0, 0, 0, 0.06); } .gv-changelog-notify-label { display: flex; align-items: center; gap: 8px; cursor: pointer; font-size: 12.5px; color: #555; line-height: 1.4; user-select: none; } .gv-changelog-notify-checkbox { width: 15px; height: 15px; margin: 0; cursor: pointer; accent-color: #1a73e8; flex-shrink: 0; } html.dark .gv-changelog-notify-toggle, [data-theme='dark'] .gv-changelog-notify-toggle, [data-color-scheme='dark'] .gv-changelog-notify-toggle { background: rgba(255, 255, 255, 0.04); border-color: rgba(255, 255, 255, 0.08); } html.dark .gv-changelog-notify-label, [data-theme='dark'] .gv-changelog-notify-label, [data-color-scheme='dark'] .gv-changelog-notify-label { color: #9aa0a6; } /* ── RTL Support ── */ /* Applied via the `gv-rtl` class on document.body when an RTL language is active. */ /* Timeline bar: move from the right edge to the left edge */ body.gv-rtl .gemini-timeline-bar { right: auto; left: 15px; } /* Prompt manager trigger: mirror to the left side */ body.gv-rtl .gv-pm-trigger { right: auto; left: 18px; } /* Preview panel: reverse the slide-in direction (from right instead of left) */ body.gv-rtl .timeline-preview-panel { transform: scale(0.96) translateX(-8px); direction: rtl; } body.gv-rtl .timeline-preview-panel.visible { transform: scale(1) translateX(0); } /* Preview list items: active border on the right side */ body.gv-rtl .timeline-preview-item { border-left: none; border-right: 3px solid transparent; padding: 6px 6px 6px 10px; } body.gv-rtl .timeline-preview-item.active { border-right-color: var(--timeline-dot-active-color); } /* Preview index: right-align numbers in RTL */ body.gv-rtl .timeline-preview-index { text-align: right; justify-content: flex-end; } /* ── Message Timestamps ── */ .gv-timestamp { display: flex; font-size: 0.9em; color: var(--gm-neutral-variant-50, #999); opacity: 0.7; margin: 12px 0 6px 0; font-weight: 400; user-select: none; line-height: 1.2; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; } .gv-timestamp-user { justify-content: flex-end; text-align: right; } .gv-timestamp-assistant { justify-content: flex-start; text-align: left; } /* Dark mode timestamp color */ html.dark .gv-timestamp, [data-theme='dark'] .gv-timestamp, [data-color-scheme='dark'] .gv-timestamp { color: var(--gm-neutral-variant-70, #aaa); } /* RTL support for timestamps */ body.gv-rtl .gv-timestamp { text-align: right; } ================================================ FILE: public/fetchInterceptor.js ================================================ /** * Fetch Interceptor - Injected into MAIN world * * This script runs in the page context (MAIN world) to intercept native fetch calls. * It catches Gemini download requests and modifies them to fetch the original resolution image * without watermark parameters. * * The script respects the user's watermark remover setting and communicates with the * content script via DOM-based bridge for watermark removal processing. * (CustomEvents don't cross world boundaries in Firefox, so we use a hidden DOM element) */ (function () { 'use strict'; /** Timeout for watermark processing in milliseconds */ const WATERMARK_PROCESSING_TIMEOUT_MS = 30000; // Prevent double injection if (window.__gvFetchInterceptorInstalled) { console.log('[Gemini Voyager] Fetch interceptor already installed, skipping'); return; } window.__gvFetchInterceptorInstalled = true; console.log('[Gemini Voyager] Fetch interceptor loading (MAIN world)...'); /** * Pattern to match Gemini download URLs * Only matches rd-gg-dl paths (dl = download) to avoid intercepting normal image display * Matches both googleusercontent.com and ggpht.com domains */ const GEMINI_DOWNLOAD_PATTERN = /https:\/\/[^/]+(\.googleusercontent\.com|\.ggpht\.com)\/rd-gg-dl\//; const CSP_BLOCKED_TELEMETRY_PATTERNS = [/^https:\/\/www\.googletagmanager\.com\/td\?/i]; const GOOGLE_SIZE_PATTERN = /=[swh]\d+[^?#]*/; /** * Replace size parameter with =s0 for original size * Gemini uses =sNNN format for resized images, =s0 means original */ const replaceWithOriginalSize = (src) => { // Match common Google size patterns and replace with =s0 (but keep the rest of the URL) if (GOOGLE_SIZE_PATTERN.test(src)) { return src.replace(GOOGLE_SIZE_PATTERN, '=s0'); } // Fallback: if no size param but it's a google image, append =s0 return src.includes('=') ? src + '-s0' : src + '=s0'; }; const isKnownCspBlockedTelemetryRequest = (requestUrl) => CSP_BLOCKED_TELEMETRY_PATTERNS.some((pattern) => pattern.test(requestUrl)); /** * DOM-based communication bridge * CustomEvents don't cross world boundaries in Firefox, so we use a hidden DOM element */ const GV_BRIDGE_ID = 'gv-watermark-bridge'; const getBridgeElement = () => { let bridge = document.getElementById(GV_BRIDGE_ID); if (!bridge) { bridge = document.createElement('div'); bridge.id = GV_BRIDGE_ID; bridge.style.display = 'none'; document.documentElement.appendChild(bridge); } return bridge; }; /** * Update status on the bridge for the content script to pick up (and show Toasts) */ const updateStatus = (status, details = {}) => { const bridge = getBridgeElement(); if (bridge) { bridge.dataset.status = JSON.stringify({ type: status, // 'START', 'PROGRESS', 'SUCCESS', 'ERROR', 'WARNING' timestamp: Date.now(), ...details, }); } }; /** * Check if watermark remover is enabled by reading from bridge element */ const isWatermarkRemoverEnabled = () => { const bridge = getBridgeElement(); return bridge.dataset.enabled === 'true'; }; // Store original fetch const originalFetch = window.fetch; // Intercept fetch // IMPORTANT: This must be a regular function (NOT async) to preserve the original Promise // chain for passthrough requests. An async function always wraps the return value in a new // Promise, which breaks Angular's zone.js change detection and causes link-block elements // to render with empty href attributes. window.fetch = function (...args) { const url = typeof args[0] === 'string' ? args[0] : args[0]?.url; // Gemini page regularly triggers GTM telemetry requests that are blocked by page CSP. // Since this interceptor wraps window.fetch in MAIN world, those blocked requests get // attributed to this extension in chrome://extensions. Short-circuit known blocked // telemetry endpoints to avoid noisy extension error reports. if (url && typeof url === 'string' && isKnownCspBlockedTelemetryRequest(url)) { return Promise.resolve(new Response(null, { status: 204, statusText: 'No Content' })); } // Check if this is a Gemini download request (specifically rd-gg-dl for downloads) if (url && typeof url === 'string' && GEMINI_DOWNLOAD_PATTERN.test(url)) { // Replace with original size URL const origSizeUrl = replaceWithOriginalSize(url); // Modify the request to use original size if (typeof args[0] === 'string') { args[0] = origSizeUrl; } else if (args[0]?.url) { // For Request objects, we need to create a new one with the modified URL const init = args[1] || {}; args[0] = new Request(origSizeUrl, { ...init, method: args[0].method, headers: args[0].headers, body: args[0].body, mode: args[0].mode, credentials: args[0].credentials, cache: args[0].cache, redirect: args[0].redirect, referrer: args[0].referrer, integrity: args[0].integrity, }); } // Only process watermark removal if enabled — use async IIFE only for this path if (isWatermarkRemoverEnabled()) { return (async () => { console.log('[Gemini Voyager] Intercepting download for watermark removal'); // Declare response and blob outside try block so they're accessible in catch let response, blob; try { // Check content length first (via HEAD request) to show appropriate message // But we'll just show "downloading" first and update if large updateStatus('DOWNLOADING'); // Fetch the original size image response = await originalFetch.apply(this, args); if (!response.ok) { updateStatus('ERROR', { message: `HTTP Error: ${response.status}` }); return response; } // Check content length for large files (5MB) - update status const contentLength = response.headers.get('content-length'); if (contentLength && parseInt(contentLength, 10) > 5 * 1024 * 1024) { updateStatus('DOWNLOADING_LARGE'); } // Clone response to read blob blob = await response.blob(); // Step 2: Processing updateStatus('PROCESSING'); // Send blob to content script for watermark removal via DOM bridge const processedBlob = await new Promise((resolve, reject) => { const requestId = 'gv_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9); const bridge = getBridgeElement(); // Watch for response via MutationObserver (works across worlds in Firefox) const observer = new MutationObserver(() => { const response = bridge.dataset.response; if (response) { try { const data = JSON.parse(response); if (data.requestId === requestId) { observer.disconnect(); bridge.removeAttribute('data-response'); if (data.error) reject(new Error(data.error)); else fetch(data.base64) .then((r) => r.blob()) .then(resolve) .catch(reject); } } catch (e) { console.warn('[Gemini Voyager] Failed to parse bridge response:', e); } } }); observer.observe(bridge, { attributes: true, attributeFilter: ['data-response'] }); // Send request via DOM bridge const reader = new FileReader(); reader.onloadend = () => { bridge.dataset.request = JSON.stringify({ requestId, base64: reader.result }); }; reader.onerror = () => reject(new Error('Failed to read blob')); reader.readAsDataURL(blob); // Timeout for watermark processing setTimeout(() => { observer.disconnect(); reject(new Error('Processing timeout')); }, WATERMARK_PROCESSING_TIMEOUT_MS); }); updateStatus('SUCCESS'); // Return processed response return new Response(processedBlob, { status: response.status, statusText: response.statusText, headers: response.headers, }); } catch (error) { console.warn('[Gemini Voyager] Watermark processing failed, using original:', error); updateStatus('ERROR', { message: error.message || 'Unknown error' }); // Return the original blob if available, otherwise fall through to originalFetch if (blob && response) { return new Response(blob, { status: response.status, statusText: response.statusText, headers: response.headers, }); } // If blob/response not available (error before fetch completed), fall through return originalFetch.apply(this, args); } })(); } } // Pass through: return the ORIGINAL Promise directly (no async wrapping) return originalFetch.apply(this, args); }; console.log('[Gemini Voyager] Fetch interceptor active'); })(); ================================================ FILE: public/katex-config.js ================================================ /** * KaTeX Configuration Override Script * This script runs in the page context (not content script context) * to suppress KaTeX strict mode warnings for Unicode text in math mode */ (function () { 'use strict'; // Monkey patch console.warn to suppress specific KaTeX warnings const originalWarn = console.warn; console.warn = function (...args) { const message = args[0]; // Suppress KaTeX Unicode warnings if ( typeof message === 'string' && (message.includes('unicodeTextInMathMode') || message.includes('LaTeX-incompatible input and strict mode') || message.includes("KaTeX doesn't work in quirks mode") || message.includes('No ID or name found in config')) ) { // Silently ignore these warnings return; } // Pass through all other warnings return originalWarn.apply(console, args); }; console.log('[Gemini Voyager] KaTeX configuration applied - Unicode warnings suppressed'); })(); ================================================ FILE: public/prevent-auto-scroll.js ================================================ (function () { 'use strict'; if (window.__gvPreventAutoScrollInstalled) return; window.__gvPreventAutoScrollInstalled = true; console.log('[Gemini Voyager] Prevent auto scroll script loaded'); const BRIDGE_ID = 'gv-prevent-auto-scroll-bridge'; function isEnabled() { const bridge = document.getElementById(BRIDGE_ID); return bridge && bridge.dataset.enabled === 'true'; } function getScrollTop(el) { if (el === window) return document.documentElement.scrollTop || document.body.scrollTop; return el.scrollTop; } function getScrollHeight(el) { if (el === window) return document.documentElement.scrollHeight || document.body.scrollHeight; return el.scrollHeight; } function getClientHeight(el) { if (el === window) return document.documentElement.clientHeight || window.innerHeight; return el.clientHeight; } function isScrolledUp(el) { const st = getScrollTop(el); const sh = getScrollHeight(el); const ch = getClientHeight(el); // If not scrollable or very small if (sh <= ch + 10) return false; return sh - st - ch > 150; } function isScrollingDownTo(el, args) { if (args.length === 0) return false; let targetY = undefined; if (args.length === 1 && args[0] && typeof args[0] === 'object') { if ('top' in args[0]) targetY = args[0].top; } else if (args.length >= 2) { targetY = args[1]; } if (targetY === undefined) return false; const currentScrollTop = getScrollTop(el); return targetY > currentScrollTop; } function isScrollingDownBy(args) { if (args.length === 0) return false; if (args.length === 1 && args[0] && typeof args[0] === 'object') { return args[0].top > 0; } else if (args.length >= 2) { return args[1] > 0; } return false; } function shouldBlockScrollTo(el, args) { if (!isEnabled()) return false; if (isScrolledUp(el) && isScrollingDownTo(el, args)) { return true; } return false; } function shouldBlockScrollBy(el, args) { if (!isEnabled()) return false; if (isScrolledUp(el) && isScrollingDownBy(args)) { return true; } return false; } const originalWindowScrollTo = window.scrollTo; window.scrollTo = function (...args) { if (shouldBlockScrollTo(window, args)) return; return originalWindowScrollTo.apply(this, args); }; const originalWindowScrollBy = window.scrollBy; window.scrollBy = function (...args) { if (shouldBlockScrollBy(window, args)) return; return originalWindowScrollBy.apply(this, args); }; const originalElementScrollTo = Element.prototype.scrollTo; Element.prototype.scrollTo = function (...args) { if (shouldBlockScrollTo(this, args)) return; return originalElementScrollTo.apply(this, args); }; const originalElementScrollBy = Element.prototype.scrollBy; Element.prototype.scrollBy = function (...args) { if (shouldBlockScrollBy(this, args)) return; return originalElementScrollBy.apply(this, args); }; const originalScrollIntoView = Element.prototype.scrollIntoView; Element.prototype.scrollIntoView = function (...args) { if (isEnabled()) { let ancestor = this.parentElement; let blocked = false; while (ancestor) { if (ancestor.scrollHeight > ancestor.clientHeight) { if (isScrolledUp(ancestor)) { const rect = this.getBoundingClientRect(); if (rect.top > (window.innerHeight || document.documentElement.clientHeight)) { blocked = true; } else if (rect.bottom > ancestor.getBoundingClientRect().bottom) { blocked = true; } break; } } ancestor = ancestor.parentElement; } if (!ancestor && isScrolledUp(window)) { const rect = this.getBoundingClientRect(); if (rect.top > (window.innerHeight || document.documentElement.clientHeight)) { blocked = true; } } if (blocked) return; } return originalScrollIntoView.apply(this, args); }; const originalScrollTopDescriptor = Object.getOwnPropertyDescriptor( Element.prototype, 'scrollTop', ); if (originalScrollTopDescriptor) { Object.defineProperty(Element.prototype, 'scrollTop', { get: originalScrollTopDescriptor.get, set: function (value) { if (isEnabled() && isScrolledUp(this)) { const currentVal = originalScrollTopDescriptor.get.call(this); if (value > currentVal) { return; } } return originalScrollTopDescriptor.set.call(this, value); }, }); } })(); ================================================ FILE: safari/App/SafariWebExtensionHandler.swift ================================================ // // SafariWebExtensionHandler.swift // Gemini Voyager Safari Extension // // Created for Gemini Voyager // https://github.com/Nagi-ovo/gemini-voyager // import SafariServices import os.log let logger = OSLog(subsystem: "com.gemini-voyager.safari", category: "extension") class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { /// Handles messages from the extension's JavaScript code /// - Parameters: /// - userInfo: Message payload from JavaScript /// - context: Extension context for responding func beginRequest(with context: NSExtensionContext) { let request = context.inputItems.first as? NSExtensionItem guard let message = request?.userInfo?[SFExtensionMessageKey] as? [String: Any], let action = message["action"] as? String else { os_log(.error, log: logger, "Invalid message format") context.completeRequest(returningItems: nil) return } os_log(.info, log: logger, "Received action: %{public}@", action) // Handle different message types switch action { case "ping": handlePing(context: context) case "getVersion": handleGetVersion(context: context) case "syncStorage": handleSyncStorage(message: message, context: context) default: os_log(.info, log: logger, "Unknown action: %{public}@", action) respondWithError(context: context, message: "Unknown action") } } // MARK: - Message Handlers /// Simple health check private func handlePing(context: NSExtensionContext) { respondWithSuccess(context: context, data: ["status": "ok", "message": "pong"]) } /// Returns extension version info private func handleGetVersion(context: NSExtensionContext) { let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "unknown" let build = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String ?? "unknown" respondWithSuccess(context: context, data: [ "version": version, "build": build, "platform": "safari-macos" ]) } /// Handle storage synchronization (placeholder for future feature) private func handleSyncStorage(message: [String: Any], context: NSExtensionContext) { // Future: Implement native storage sync with UserDefaults or Keychain os_log(.info, log: logger, "Storage sync requested (not yet implemented)") respondWithSuccess(context: context, data: ["synced": false]) } // MARK: - Response Helpers private func respondWithSuccess(context: NSExtensionContext, data: [String: Any]) { let response = NSExtensionItem() response.userInfo = [ SFExtensionMessageKey: [ "success": true, "data": data ] ] context.completeRequest(returningItems: [response]) } private func respondWithError(context: NSExtensionContext, message: String) { let response = NSExtensionItem() response.userInfo = [ SFExtensionMessageKey: [ "success": false, "error": message ] ] context.completeRequest(returningItems: [response]) } } ================================================ FILE: safari/Models/SafariMessage.swift ================================================ // // SafariMessage.swift // Gemini Voyager Safari Extension // // Created for Gemini Voyager // https://github.com/Nagi-ovo/gemini-voyager // import Foundation /// Message types exchanged between JavaScript and native Swift code enum SafariMessageAction: String, Codable { case ping case getVersion case syncStorage // Future actions can be added here: // case exportToFiles // case importFromFiles // case showNotification } /// Standard message structure from JavaScript struct SafariMessage: Codable { let action: SafariMessageAction let payload: [String: AnyCodable]? enum CodingKeys: String, CodingKey { case action case payload } } /// Standard response structure to JavaScript struct SafariResponse: Codable { let success: Bool let data: [String: AnyCodable]? let error: String? static func success(data: [String: Any]) -> SafariResponse { SafariResponse( success: true, data: data.mapValues { AnyCodable($0) }, error: nil ) } static func error(message: String) -> SafariResponse { SafariResponse( success: false, data: nil, error: message ) } } /// Type-erased wrapper for Codable values struct AnyCodable: Codable { let value: Any init(_ value: Any) { self.value = value } init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() if let bool = try? container.decode(Bool.self) { value = bool } else if let int = try? container.decode(Int.self) { value = int } else if let double = try? container.decode(Double.self) { value = double } else if let string = try? container.decode(String.self) { value = string } else if let array = try? container.decode([AnyCodable].self) { value = array.map { $0.value } } else if let dictionary = try? container.decode([String: AnyCodable].self) { value = dictionary.mapValues { $0.value } } else { throw DecodingError.dataCorruptedError( in: container, debugDescription: "Unsupported type" ) } } func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() switch value { case let bool as Bool: try container.encode(bool) case let int as Int: try container.encode(int) case let double as Double: try container.encode(double) case let string as String: try container.encode(string) case let array as [Any]: try container.encode(array.map { AnyCodable($0) }) case let dictionary as [String: Any]: try container.encode(dictionary.mapValues { AnyCodable($0) }) default: throw EncodingError.invalidValue( value, EncodingError.Context( codingPath: container.codingPath, debugDescription: "Unsupported type" ) ) } } } ================================================ FILE: safari/README.md ================================================ # Safari Development Guide English | [简体中文](README_ZH.md) Developer guide for building and extending Voyager for Safari. > [!TIP] > **Looking to install?** You can now download the pre-signed app directly from the [latest release](https://github.com/Nagi-ovo/gemini-voyager/releases/latest). Simply download the `.dmg` and follow the prompts to install. ## Quick Start ### Build from Source ```bash # Install dependencies bun install # Build for Safari bun run build:safari ``` This creates a `dist_safari/` folder with the extension files. ### Convert and Run ```bash # Convert to Safari format xcrun safari-web-extension-converter dist_safari --macos-only --app-name "Gemini Voyager" # Open in Xcode open "Gemini Voyager/Gemini Voyager.xcodeproj" ``` In Xcode: 1. Select **Signing & Capabilities** → Choose your Team 2. Set target to **My Mac** 3. Press **⌘R** to build and run ## Development Workflow ### Auto-reload on Changes ```bash bun run dev:safari ``` This watches for file changes and rebuilds automatically. After each rebuild: 1. Press **⌘R** in Xcode to reload 2. Safari will refresh the extension ### Manual Build ```bash # After code changes bun run build:safari # Then rebuild in Xcode (⌘R) ``` ## Adding Swift Native Code (Optional) [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) This project includes Swift code for native macOS features. Adding it is **optional** but recommended. ### Files Included ``` safari/ ├── App/ │ └── SafariWebExtensionHandler.swift # Native message handler └── Models/ └── SafariMessage.swift # Message definitions ``` ### How to Add 1. Open the Xcode project 2. Right-click **"Gemini Voyager Extension"** target 3. Select **Add Files to "Gemini Voyager Extension"...** 4. Navigate to `safari/App/` and `safari/Models/` 5. Check **"Copy items if needed"** 6. Ensure target is **"Gemini Voyager Extension"** ### Native Features Once added, you can: - Access macOS Keychain (future) - Use native notifications - Access file system with native pickers - Sync via iCloud (future) - Enhanced debugging logs ### Native Messaging API [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) **From JavaScript:** ```javascript // Health check browser.runtime.sendNativeMessage({ action: 'ping' }, (response) => { console.log(response); // { success: true, data: { status: "ok", message: "pong" } } }); // Get version browser.runtime.sendNativeMessage({ action: 'getVersion' }, (response) => { console.log(response.data); // { version: "1.0.0", platform: "macOS" } }); ``` **Available Actions:** - `ping` - Health check - `getVersion` - Get extension version info - `syncStorage` - Sync storage (placeholder for future) ## Debugging ### View Extension Logs **Web Console:** - Safari → Develop → Web Extension Background Pages → Gemini Voyager **Native Logs:** ```bash log stream --predicate 'subsystem == "com.gemini-voyager.safari"' --level debug ``` ### Common Issues **"Module 'SafariServices' not found"** - Ensure Swift files are added to "Gemini Voyager Extension" target, not the main app **Native messaging not working** - Check `Info.plist` has `SafariWebExtensionHandler` as principal class **Swift files not compiling** - Verify Target Membership in Xcode file inspector ## Building for Distribution ### Create Archive 1. Product → Archive in Xcode 2. Window → Organizer 3. Select archive → Distribute App 4. Follow prompts to export ### For App Store Requires: - Apple Developer account ($99/year) - App Store Connect setup - App review submission See [Apple's official guide](https://developer.apple.com/documentation/safariservices/safari_web_extensions/distributing_your_safari_web_extension) for details. ## Project Structure [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) ``` ├── dist_safari/ # Built extension (gitignored) ├── safari/ # Native Swift code │ ├── App/ # Extension handlers │ ├── Models/ # Data models │ └── Resources/ # Example code ├── src/ # Main extension source └── vite.config.safari.ts # Safari build config ``` ## Build Commands ```bash bun run build:safari # Production build bun run dev:safari # Development with auto-reload bun run build:all # Build for all browsers ``` ## Update Reminder Configuration By default, update reminders are **disabled** for Safari builds to avoid conflicts with App Store auto-updates. To enable update reminders (for manual distribution): ```bash ENABLE_SAFARI_UPDATE_CHECK=true bun run build:safari ``` **Note**: Only enable this if you're distributing the extension manually (not via App Store). App Store versions should use the default (disabled) to rely on automatic updates. ## Known Limitations Due to Safari's technical architecture and security restrictions, the following features are currently unavailable in the Safari version: - **(a) Nano Banana Watermark Removal**: Watermark detection and removal for Gemini™-generated images is not supported. - **(b) Image Export**: Direct export to image format is not supported (including in Chat Export). **Recommendation**: Use **PDF Export** instead. ## Resources - [Safari Web Extensions Docs](https://developer.apple.com/documentation/safariservices/safari_web_extensions) - [Native Messaging Guide](https://developer.apple.com/documentation/safariservices/safari_web_extensions/messaging_between_the_app_and_javascript_in_a_safari_web_extension) - [Converting Extensions for Safari](https://developer.apple.com/documentation/safariservices/safari_web_extensions/converting_a_web_extension_for_safari) ## Contributing See [CONTRIBUTING.md](../.github/CONTRIBUTING.md) for contribution guidelines. When adding native features: 1. Define action in `SafariMessage.swift` 2. Implement handler in `SafariWebExtensionHandler.swift` 3. Add JavaScript API in web extension 4. Document in this README ================================================ FILE: safari/README_ZH.md ================================================ # Safari 开发指南 [English](README.md) | 简体中文 为 Safari 构建和扩展 Voyager 的开发者指南。 > [!TIP] > **想要进行安装?** 你现在可以直接从 [最新发布页](https://github.com/Nagi-ovo/gemini-voyager/releases/latest) 下载预签名的应用。只需下载 `.dmg` 并按提示安装即可。 ## 快速开始 ### 从源代码构建 ```bash # 安装依赖 bun install # 为 Safari 构建 bun run build:safari ``` 这会创建一个包含扩展文件的 `dist_safari/` 文件夹。 ### 转换并运行 ```bash # 转换为 Safari 格式 xcrun safari-web-extension-converter dist_safari --macos-only --app-name "Gemini Voyager" # 在 Xcode 中打开 open "Gemini Voyager/Gemini Voyager.xcodeproj" ``` 在 Xcode 中: 1. 选择 **Signing & Capabilities** → 选择你的 Team 2. 设置目标为 **My Mac** 3. 按 **⌘R** 构建并运行 ## 开发工作流 ### 文件变更自动重载 ```bash bun run dev:safari ``` 这会监听文件变更并自动重新构建。每次重新构建后: 1. 在 Xcode 中按 **⌘R** 重新加载 2. Safari 会刷新扩展 ### 手动构建 ```bash # 修改代码后 bun run build:safari # 然后在 Xcode 中重新构建(⌘R) ``` ## 添加 Swift 原生代码(可选) [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) 本项目包含用于原生 macOS 功能的 Swift 代码。添加它是**可选的**,但推荐使用。 ### 包含的文件 ``` safari/ ├── App/ │ └── SafariWebExtensionHandler.swift # 原生消息处理器 └── Models/ └── SafariMessage.swift # 消息定义 ``` ### 如何添加 1. 打开 Xcode 项目 2. 右键点击 **"Gemini Voyager Extension"** 目标 3. 选择 **Add Files to "Gemini Voyager Extension"...** 4. 导航到 `safari/App/` 和 `safari/Models/` 5. 勾选 **"Copy items if needed"** 6. 确保目标是 **"Gemini Voyager Extension"** ### 原生功能 添加后,你可以: - 访问 macOS 钥匙串(未来) - 使用原生通知 - 通过原生选择器访问文件系统 - 通过 iCloud 同步(未来) - 增强的调试日志 ### 原生消息 API [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) **从 JavaScript 调用:** ```javascript // 健康检查 browser.runtime.sendNativeMessage({ action: 'ping' }, (response) => { console.log(response); // { success: true, data: { status: "ok", message: "pong" } } }); // 获取版本 browser.runtime.sendNativeMessage({ action: 'getVersion' }, (response) => { console.log(response.data); // { version: "1.0.0", platform: "macOS" } }); ``` **可用操作:** - `ping` - 健康检查 - `getVersion` - 获取扩展版本信息 - `syncStorage` - 同步存储(未来功能的占位符) ## 调试 ### 查看扩展日志 **Web 控制台:** - Safari → 开发 → Web Extension Background Pages → Gemini Voyager **原生日志:** ```bash log stream --predicate 'subsystem == "com.gemini-voyager.safari"' --level debug ``` ### 常见问题 **"Module 'SafariServices' not found"** - 确保 Swift 文件添加到 "Gemini Voyager Extension" 目标,而不是主应用 **原生消息不工作** - 检查 `Info.plist` 是否将 `SafariWebExtensionHandler` 设置为主类 **Swift 文件未编译** - 在 Xcode 文件检查器中验证目标成员资格 ## 构建分发版本 ### 创建存档 1. 在 Xcode 中选择 Product → Archive 2. Window → Organizer 3. 选择存档 → Distribute App 4. 按提示导出 ### 发布到 App Store 需要: - Apple Developer 账号($99/年) - App Store Connect 设置 - 应用审核提交 详见 [Apple 官方指南](https://developer.apple.com/documentation/safariservices/safari_web_extensions/distributing_your_safari_web_extension)。 ## 项目结构 [Ask DeepWiki](https://deepwiki.com/Nagi-ovo/gemini-voyager) ``` ├── dist_safari/ # 构建的扩展(已忽略) ├── safari/ # 原生 Swift 代码 │ ├── App/ # 扩展处理器 │ ├── Models/ # 数据模型 │ └── Resources/ # 示例代码 ├── src/ # 主扩展源代码 └── vite.config.safari.ts # Safari 构建配置 ``` ## 构建命令 ```bash bun run build:safari # 生产构建 bun run dev:safari # 开发模式(自动重载) bun run build:all # 为所有浏览器构建 ``` ## 更新提醒配置 默认情况下,Safari 版本的更新提醒是**禁用的**,以避免与 App Store 自动更新冲突。 如需启用更新提醒(用于手动分发): ```bash ENABLE_SAFARI_UPDATE_CHECK=true bun run build:safari ``` **注意**:仅在手动分发扩展时启用此功能(非 App Store 分发)。App Store 版本应使用默认设置(禁用),以依赖自动更新。 ## 已知限制 由于 Safari 的技术架构和安全限制,以下功能目前在 Safari 版本中不可用: - **(a) Nano Banana 水印去除**:暂不支持对 Gemini™ 生成进行图片水印识别与去除。 - **(b) 图片导出**:暂不支持直接导出为图片(包括在对话导出功能中)。**建议**:改用 **PDF 导出**。 ## 资源 - [Safari Web Extensions 文档](https://developer.apple.com/documentation/safariservices/safari_web_extensions) - [原生消息指南](https://developer.apple.com/documentation/safariservices/safari_web_extensions/messaging_between_the_app_and_javascript_in_a_safari_web_extension) - [为 Safari 转换扩展](https://developer.apple.com/documentation/safariservices/safari_web_extensions/converting_a_web_extension_for_safari) ## 贡献 查看 [CONTRIBUTING.md](../.github/CONTRIBUTING.md) 了解贡献指南。 添加原生功能时: 1. 在 `SafariMessage.swift` 中定义操作 2. 在 `SafariWebExtensionHandler.swift` 中实现处理器 3. 在 web 扩展中添加 JavaScript API 4. 在本 README 中记录 ================================================ FILE: safari/Resources/example-native-messaging.js ================================================ /** * Example: How to use native messaging in Safari * * This file demonstrates how to communicate with the Swift native code * from your JavaScript extension code. */ // Note: Safari uses browser.runtime.sendNativeMessage() differently than Chrome // In Safari, it's handled through the SafariWebExtensionHandler /** * Send a message to native Swift code * @param {string} action - The action to perform * @param {object} payload - Data to send * @returns {Promise} Response from native code */ async function sendNativeMessage(action, payload = {}) { return new Promise((resolve, reject) => { // Safari's native messaging API expects a single message object. browser.runtime.sendNativeMessage({ action, payload }, (response) => { if (browser.runtime.lastError) { return reject(browser.runtime.lastError); } if (response && response.success) { resolve(response.data); } else { reject(new Error(response?.error || 'Native messaging failed')); } }); }); } // Example 1: Health check async function checkNativeHealth() { try { const response = await sendNativeMessage('ping'); console.log('Native messaging is working:', response); // Output: { status: "ok", message: "pong" } } catch (error) { console.error('Native messaging not available:', error); } } // Example 2: Get version info async function getExtensionVersion() { try { const info = await sendNativeMessage('getVersion'); console.log('Extension version:', info.version); console.log('Build:', info.build); console.log('Platform:', info.platform); } catch (error) { console.error('Failed to get version:', error); } } // Example 3: Sync storage (placeholder for future feature) async function syncStorage(data) { try { const result = await sendNativeMessage('syncStorage', { data }); console.log('Storage sync result:', result); } catch (error) { console.error('Storage sync failed:', error); } } // Export for use in other modules export { sendNativeMessage, checkNativeHealth, getExtensionVersion, syncStorage }; ================================================ FILE: scripts/build-edge.js ================================================ #!/usr/bin/env node /** * Build script for Edge store submission. * Edge doesn't accept the 'key' field in manifest.json * This script builds the Chrome extension and removes incompatible fields. */ import { execSync } from 'child_process'; import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const rootDir = path.resolve(__dirname, '..'); const distDir = path.join(rootDir, 'dist_chrome'); const manifestPath = path.join(distDir, 'manifest.json'); // Fields that Edge doesn't accept const EDGE_INCOMPATIBLE_FIELDS = ['key']; async function buildForEdge() { console.log('🔨 Building Chrome extension...'); try { execSync('bun run build:chrome', { cwd: rootDir, stdio: 'inherit', }); } catch (error) { console.error('❌ Build failed:', error.message); process.exit(1); } console.log('\n🔧 Preparing for Edge submission...'); // Read and parse manifest if (!fs.existsSync(manifestPath)) { console.error('❌ manifest.json not found in dist_chrome/'); process.exit(1); } const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')); // Remove incompatible fields let removedFields = []; for (const field of EDGE_INCOMPATIBLE_FIELDS) { if (field in manifest) { delete manifest[field]; removedFields.push(field); } } if (removedFields.length > 0) { console.log(` Removed fields: ${removedFields.join(', ')}`); } // Write back the cleaned manifest fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n'); console.log('✅ Edge build ready!'); console.log(` Output: ${distDir}/`); // Zip the output const packageJsonPath = path.join(rootDir, 'package.json'); const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); const version = packageJson.version; const zipName = `voyager-edge-v${version}.zip`; const zipPath = path.join(rootDir, zipName); console.log(`\n📦 Zipping into ${zipName}...`); try { // Remove existing zip if it exists if (fs.existsSync(zipPath)) { fs.unlinkSync(zipPath); } // Zip the *contents* of dist_chrome execSync(`zip -r "${zipPath}" .`, { cwd: distDir, stdio: 'inherit', }); console.log(`✨ Successfully created: ${zipName}`); } catch (error) { console.error('❌ Zipping failed:', error.message); process.exit(1); } } buildForEdge(); ================================================ FILE: scripts/build-safari.sh ================================================ #!/bin/bash # Build Safari Extension # This script builds the extension for Safari using xcrun safari-web-extension-converter set -e echo "🔨 Building extension for Safari..." # Step 1: Build the extension using Vite echo "📦 Building with Vite..." npm run build:safari # Step 2: Check if dist_safari exists if [ ! -d "dist_safari" ]; then echo "❌ Error: dist_safari directory not found" exit 1 fi echo "✅ Build completed: dist_safari/" # Step 3: Convert to Safari App Extension (requires macOS) if [[ "$OSTYPE" == "darwin"* ]]; then echo "" echo "🍎 Safari Extension Converter Information:" echo "" echo "To convert this extension for Safari, run:" echo "" echo " xcrun safari-web-extension-converter dist_safari --app-name 'Gemini Voyager' --bundle-identifier com.nagi-ovo.Gemini-Voyager" echo "" echo "This will create a Safari App Extension project that you can:" echo " 1. Open in Xcode" echo " 2. Sign with your Apple Developer ID" echo " 3. Build and run on Safari" echo "" echo "Note: You need:" echo " - macOS 11 (Big Sur) or later" echo " - Xcode 12 or later" echo " - Safari 14 or later" echo "" echo "For development testing without Xcode:" echo " xcrun safari-web-extension-converter dist_safari --macos-only" echo "" else echo "" echo "⚠️ Safari extension conversion requires macOS with Xcode" echo "The built extension is available in: dist_safari/" echo "" fi echo "✨ Done!" ================================================ FILE: scripts/bump-version.js ================================================ import { execSync } from 'child_process'; import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Paths to the files containing the version const packageJsonPath = path.resolve(__dirname, '../package.json'); const manifestJsonPath = path.resolve(__dirname, '../manifest.json'); const manifestDevJsonPath = path.resolve(__dirname, '../manifest.dev.json'); // Helper to read JSON file function readJson(filePath) { return JSON.parse(fs.readFileSync(filePath, 'utf8')); } // Helper to write JSON file function writeJson(filePath, data) { fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n'); } // Logic to bump version with rollover at 10 function bumpVersion(version) { let [major, minor, patch] = version.split('.').map(Number); patch += 1; if (patch > 9) { patch = 0; minor += 1; } if (minor > 9) { minor = 0; major += 1; } return `${major}.${minor}.${patch}`; } async function main() { try { console.log('Reading current version...'); const packageJson = readJson(packageJsonPath); const currentVersion = packageJson.version; console.log(`Current version: ${currentVersion}`); const newVersion = bumpVersion(currentVersion); console.log(`New version: ${newVersion}`); // Update package.json packageJson.version = newVersion; writeJson(packageJsonPath, packageJson); console.log('Updated package.json'); // Update manifest.json if (fs.existsSync(manifestJsonPath)) { const manifestJson = readJson(manifestJsonPath); manifestJson.version = newVersion; writeJson(manifestJsonPath, manifestJson); console.log('Updated manifest.json'); } else { console.warn('manifest.json not found, skipping...'); } // Update manifest.dev.json if (fs.existsSync(manifestDevJsonPath)) { const manifestDevJson = readJson(manifestDevJsonPath); manifestDevJson.version = newVersion; writeJson(manifestDevJsonPath, manifestDevJson); console.log('Updated manifest.dev.json'); } console.log('Version bump complete! 🚀'); console.log('Running format...'); execSync('bun run format', { stdio: 'inherit' }); console.log('Format complete! ✨'); } catch (error) { console.error('Error bumping version:', error); process.exit(1); } } main(); ================================================ FILE: scripts/generate-sponsors.cjs ================================================ #!/usr/bin/env node /** * Generate the sponsor board SVG with GitHub Sponsors, Afdian, and Tipping Friends. * * Usage: * node sponsorkit/generate-sponsors.js * * Environment variables: * GITHUB_TOKEN - GitHub token for fetching sponsors * AFDIAN_USER_ID - Afdian user ID * AFDIAN_TOKEN - Afdian API token */ const fsp = require('fs/promises'); const path = require('path'); const crypto = require('crypto'); const ROOT = path.resolve(__dirname, '..'); const FRIENDS_PATH = path.join(ROOT, 'sponsorkit', 'sponsors.json'); const OUTPUT_DIR = path.join(ROOT, 'docs', 'public', 'assets'); const OUTPUT_PATH = path.join(OUTPUT_DIR, 'sponsors.svg'); const OUTPUT_PNG_PATH = path.join(OUTPUT_DIR, 'sponsors.png'); const SPONSORS_URL = 'https://github.com/sponsors/Nagi-ovo'; const OWNER_LOGIN = 'Nagi-ovo'; const GRAPHQL_ENDPOINT = 'https://api.github.com/graphql'; const AFDIAN_API = 'https://afdian.com/api/open/query-sponsor'; const FONT_FAMILY = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji'"; async function main() { const friends = await loadFriends(); await ensureDir(OUTPUT_DIR); const githubToken = process.env.GITHUB_TOKEN; const afdianUserId = process.env.AFDIAN_USER_ID; const afdianToken = process.env.AFDIAN_TOKEN; const [githubSponsors, afdianSponsors] = await Promise.all([ fetchGitHubSponsors(githubToken), fetchAfdianSponsors(afdianUserId, afdianToken), ]); const svgContent = await buildSvg({ githubSponsors, afdianSponsors, friends }); await fsp.writeFile(OUTPUT_PATH, svgContent, 'utf8'); console.log( `Generated ${path.relative(ROOT, OUTPUT_PATH)} with ${githubSponsors.length} GitHub sponsors, ${afdianSponsors.length} Afdian sponsors, and ${friends.length} tipping friends.`, ); } async function loadFriends() { try { const raw = await fsp.readFile(FRIENDS_PATH, 'utf8'); const list = JSON.parse(raw); if (!Array.isArray(list)) { throw new Error(`Friend data must be an array in ${FRIENDS_PATH}`); } return list .map((item) => { if (typeof item === 'string') return item.trim(); return String(item.name || '').trim(); }) .filter(Boolean); } catch (e) { console.warn('⚠️ Failed to load friends list:', e.message); return []; } } async function ensureDir(target) { await fsp.mkdir(target, { recursive: true }); } async function fetchGitHubSponsors(token) { if (!token) { console.warn('⚠️ No GitHub token available, GitHub sponsors will be skipped.'); return []; } const sponsors = []; let cursor = null; const headers = { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, 'User-Agent': 'gemini-voyager-sponsor-bot', }; while (true) { const body = { query: ` query($login: String!, $cursor: String) { user(login: $login) { sponsorshipsAsMaintainer(first: 100, after: $cursor, includePrivate: true, activeOnly: false, orderBy: {field: CREATED_AT, direction: DESC}) { nodes { sponsorEntity { ... on User { login name avatarUrl url } ... on Organization { login name avatarUrl url } } tier { monthlyPriceInDollars } createdAt } pageInfo { hasNextPage endCursor } } } } `, variables: { login: OWNER_LOGIN, cursor, }, }; const res = await fetch(GRAPHQL_ENDPOINT, { method: 'POST', headers, body: JSON.stringify(body), }); if (!res.ok) { const text = await res.text(); console.error(`Failed to fetch GitHub sponsors (${res.status}): ${text}`); return sponsors; } const payload = await res.json(); const data = payload?.data?.user?.sponsorshipsAsMaintainer; if (!data) { console.error('Unexpected response from GitHub Sponsors API.'); return sponsors; } for (const node of data.nodes || []) { const sponsor = node?.sponsorEntity; if (!sponsor?.login || !sponsor?.avatarUrl) continue; sponsors.push({ login: sponsor.login, name: sponsor.name || sponsor.login, avatarUrl: sponsor.avatarUrl, url: sponsor.url || `https://github.com/${sponsor.login}`, amount: node?.tier?.monthlyPriceInDollars || 0, createdAt: node?.createdAt, provider: 'github', }); } if (!data.pageInfo?.hasNextPage) { break; } cursor = data.pageInfo.endCursor; } sponsors.sort((a, b) => { if (b.amount !== a.amount) return b.amount - a.amount; if (a.createdAt && b.createdAt) { return new Date(a.createdAt) - new Date(b.createdAt); } return a.login.localeCompare(b.login); }); return sponsors; } async function fetchAfdianSponsors(userId, token) { if (!userId || !token) { console.warn('⚠️ No Afdian credentials available, Afdian sponsors will be skipped.'); return []; } const sponsors = []; let page = 1; while (true) { const ts = Math.floor(Date.now() / 1000); const params = JSON.stringify({ page }); const sign = crypto .createHash('md5') .update(`${token}params${params}ts${ts}user_id${userId}`) .digest('hex'); const res = await fetch(AFDIAN_API, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ user_id: userId, params, ts, sign, }), }); if (!res.ok) { console.error(`Failed to fetch Afdian sponsors (${res.status})`); break; } const payload = await res.json(); if (payload.ec !== 200) { console.error('Afdian API error:', payload.em); break; } const list = payload.data?.list || []; if (list.length === 0) break; for (const item of list) { const user = item.user; if (!user) continue; sponsors.push({ login: user.user_id, name: user.name || '匿名用户', avatarUrl: user.avatar || 'https://pic1.afdiancdn.com/default/avatar/avatar-purple.png', url: `https://afdian.com/u/${user.user_id}`, amount: parseFloat(item.all_sum_amount) || 0, provider: 'afdian', }); } if (list.length < 20) break; page++; } sponsors.sort((a, b) => b.amount - a.amount); return sponsors; } async function buildSvg({ githubSponsors, afdianSponsors, friends }) { const width = 800; const outerPadding = 40; const innerPadding = 32; const contentWidth = width - outerPadding * 2; // Embed avatar data await embedAvatarData(githubSponsors); await embedAvatarData(afdianSponsors); let cursorY = innerPadding; const defs = []; // GitHub Sponsors section const githubGrid = renderSponsorGrid({ sponsors: githubSponsors, title: 'GitHub Sponsors', x: 0, y: cursorY, width: contentWidth, sponsorUrl: SPONSORS_URL, }); defs.push(...githubGrid.defs); cursorY += githubGrid.height + 60; // Afdian Sponsors section const afdianGrid = renderSponsorGrid({ sponsors: afdianSponsors, title: 'Afdian Sponsors', x: 0, y: cursorY, width: contentWidth, sponsorUrl: 'https://afdian.com/a/nagi', }); defs.push(...afdianGrid.defs); cursorY += afdianGrid.height + 60; // Tipping Friends section const friendTable = renderFriendTable({ friends, x: 0, y: cursorY, width: contentWidth, }); cursorY += friendTable.height + innerPadding; const boardHeight = cursorY; const height = boardHeight + outerPadding * 2; const svg = ` Gemini Voyager Sponsors ${defs.join('\n')} ${githubGrid.markup} ${afdianGrid.markup} ${friendTable.markup} `; return svg; } async function avatarDataUri(url) { try { const sizedUrl = url.includes('?') ? `${url}&s=160` : `${url}?s=160`; const res = await fetch(sizedUrl); if (!res.ok) return null; const contentType = res.headers.get('content-type') || 'image/png'; const buffer = Buffer.from(await res.arrayBuffer()); return `data:${contentType};base64,${buffer.toString('base64')}`; } catch { return null; } } async function embedAvatarData(sponsors) { const results = await Promise.allSettled( sponsors.map(async (sponsor) => { if (!sponsor.avatarUrl) return; sponsor.avatar = await avatarDataUri(sponsor.avatarUrl); }), ); } function renderSponsorGrid({ sponsors, title, x, y, width, sponsorUrl }) { const avatarSize = 36; const baseGap = 36; const gapY = 24; let cols = Math.floor(width / (avatarSize + baseGap)); const rows = Math.max(1, Math.ceil(sponsors.length / cols)); let spacing = baseGap; if (cols > 1) { spacing = (width - cols * avatarSize) / (cols - 1); if (spacing < baseGap) { spacing = baseGap; cols = Math.max(1, Math.floor((width + baseGap) / (avatarSize + baseGap))); } } const gridWidth = sponsors.length ? cols * avatarSize + Math.max(0, cols - 1) * spacing : width; const gridHeight = sponsors.length ? rows * avatarSize + Math.max(0, rows - 1) * gapY : 80; const titleHeight = 36; const sectionHeight = titleHeight + 36 + gridHeight + 32; const centerX = width / 2; const offsetX = Math.max(0, (width - gridWidth) / 2); let markup = ` ${escapeText(title)} · ${sponsors.length} `; const clipDefs = []; if (!sponsors.length) { markup += ` Become a Sponsor ❤️ `; return { markup, height: sectionHeight, defs: [] }; } markup += ``; sponsors.forEach((sponsor, index) => { const col = index % cols; const row = Math.floor(index / cols); const avatarX = offsetX + col * (avatarSize + spacing); const avatarY = row * (avatarSize + gapY); const clipId = `cp-${sponsor.provider}-${index}`; clipDefs.push( ` `, ); markup += ` ${ sponsor.avatar ? `` : `` } ${escapeText(sponsor.name).slice(0, 12)} `; }); markup += ''; return { markup, height: sectionHeight, defs: clipDefs, }; } function renderFriendTable({ friends, x, y, width }) { const tableTop = 44; const columns = 6; const colWidth = width / columns; const rowHeight = 28; const rows = Math.max(1, Math.ceil(friends.length / columns)); const tableHeight = rows * rowHeight; const centerX = width / 2; let markup = ` Tipping Friends · ${friends.length} `; const orderedFriends = [...friends].reverse(); orderedFriends.forEach((name, index) => { const row = Math.floor(index / columns); const col = index % columns; const textX = col * colWidth + colWidth / 2; const textY = row * rowHeight + rowHeight / 2; markup += `${escapeText(name)}`; }); markup += ''; return { markup, height: tableTop + tableHeight, }; } function escapeText(value) { return String(value).replace(/&/g, '&').replace(//g, '>'); } function escapeAttr(value) { return escapeText(value).replace(/"/g, '"'); } main().catch((err) => { console.error(err); process.exitCode = 1; }); ================================================ FILE: scripts/launch-chrome.cjs ================================================ 'use strict'; const fs = require('fs'); const net = require('net'); const os = require('os'); const path = require('path'); const { spawn } = require('child_process'); const TARGET_URL = process.env.CHROME_OPEN_URL || 'https://gemini.google.com/'; const BUILD_TIMEOUT_MS = Number(process.env.CHROME_OPEN_BUILD_TIMEOUT_MS) || 120000; // ms const BUILD_POLL_INTERVAL_MS = Number(process.env.CHROME_OPEN_POLL_INTERVAL_MS) || 500; // ms const repoRoot = path.resolve(__dirname, '..'); const distDir = path.join(repoRoot, 'dist_chrome'); const manifestPath = path.join(distDir, 'manifest.json'); const profileDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gemini-voyager-chrome-')); let devProcess, chromeRunner, debugPort, reloadTimer, lastBuildTime = 0, shuttingDown = false; let devtoolsCommandId = 0; main().catch((error) => { log(`Fatal error: ${error.message}`); process.exit(1); }); async function main() { debugPort = await getAvailablePort(); devProcess = startDevBuild(); await waitForManifest(Date.now()); lastBuildTime = manifestMtime(); chromeRunner = await launchChrome(); attachProcessHandlers(); log('Chrome launched with the latest build.'); if (debugPort) startReloadWatcher(); } function startDevBuild() { const args = ['run', 'dev:chrome']; log(`Starting dev build: bun ${args.join(' ')}`); const child = spawn('bun', args, { cwd: repoRoot, stdio: 'inherit', env: process.env }); child.on('exit', (code, signal) => { if (shuttingDown) return; log(`Dev build process exited (${signal ? `signal ${signal}` : `code ${code}`}).`); process.exit(code ?? 0); }); return child; } async function launchChrome() { const webExt = await import('web-ext-run').then((mod) => mod.default ?? mod); const args = ['--no-first-run', '--no-default-browser-check']; if (debugPort) args.push('--remote-debugging-address=127.0.0.1', `--remote-debugging-port=${debugPort}`); const config = { target: 'chromium', sourceDir: distDir, startUrl: [TARGET_URL], keepProfileChanges: true, chromiumProfile: profileDir, args, noInput: true, }; if (process.env.CHROME_BIN) config.chromiumBinary = process.env.CHROME_BIN; log('Launching Chrome via web-ext-run.'); return webExt.cmd.run(config, { shouldExitProgram: false }); } function attachProcessHandlers() { const cleanup = () => { if (shuttingDown) return; shuttingDown = true; devProcess?.kill('SIGTERM'); chromeRunner?.exit?.(); if (reloadTimer) clearInterval(reloadTimer); fs.rmSync(profileDir, { recursive: true, force: true }); }; process.on('SIGINT', () => { cleanup(); process.exit(0); }); process.on('SIGTERM', () => { cleanup(); process.exit(0); }); process.on('exit', cleanup); } async function waitForManifest(startTime) { const deadline = Date.now() + BUILD_TIMEOUT_MS; while (Date.now() < deadline) { try { const stat = fs.statSync(manifestPath); if (stat.mtimeMs >= startTime && stat.size > 0) return; } catch {} await new Promise((r) => setTimeout(r, BUILD_POLL_INTERVAL_MS)); } throw new Error('Timed out waiting for dist_chrome/manifest.json'); } function startReloadWatcher() { if (reloadTimer) return; reloadTimer = setInterval(async () => { if (shuttingDown) return; const mtime = manifestMtime(); if (mtime <= lastBuildTime) return; lastBuildTime = mtime; try { await reloadTargetTabs(); } catch (error) { log(`Tab reload failed: ${error.message}`); } }, BUILD_POLL_INTERVAL_MS); } function manifestMtime() { try { return fs.statSync(manifestPath).mtimeMs; } catch { return 0; } } async function reloadTargetTabs() { const targets = await fetchJson(`http://127.0.0.1:${debugPort}/json`); const matches = Array.isArray(targets) ? targets.filter( (t) => t?.type === 'page' && typeof t?.url === 'string' && t.url.startsWith(TARGET_URL), ) : []; if (matches.length === 0) return; await Promise.all( matches.map((t) => t?.webSocketDebuggerUrl ? sendDevtoolsCommand(t.webSocketDebuggerUrl, 'Page.reload', { ignoreCache: true }) : Promise.resolve(), ), ); } async function fetchJson(url) { const res = await fetch(url); if (!res.ok) throw new Error(`Devtools endpoint returned ${res.status}`); return res.json(); } function sendDevtoolsCommand(url, method, params) { return new Promise((resolve, reject) => { const ws = new WebSocket(url); const id = (devtoolsCommandId += 1); let settled = false; const settle = (error) => { if (settled) return; settled = true; clearTimeout(timeoutId); if (error) reject(error); else resolve(); }; const timeoutId = setTimeout(() => { settle(new Error(`Devtools command timeout: ${method}`)); ws.close(); }, 5000); ws.onopen = () => ws.send(JSON.stringify({ id, method, params })); ws.onmessage = (event) => { const payload = typeof event.data === 'string' ? event.data : (event.data?.toString?.() ?? ''); if (!payload) return; try { if (JSON.parse(payload).id === id) { ws.close(); settle(); } } catch (error) { log(`Devtools message parse error: ${error.message}`); } }; ws.onerror = (error) => settle(error); ws.onclose = () => settle(new Error('Devtools connection closed before response.')); }); } function getAvailablePort() { return new Promise((resolve, reject) => { const server = net.createServer(); server.once('error', reject); server.listen(0, '127.0.0.1', () => { const addr = server.address(); const port = typeof addr === 'object' && addr ? addr.port : null; server.close(() => port ? resolve(port) : reject(new Error('Unable to determine open port.')), ); }); }); } function log(message) { console.log(`[chrome-open] ${message}`); } ================================================ FILE: sponsorkit/sponsors.json ================================================ [ "第一位无名赞助者", "王萱", "NGC2237", "白洺泽", "无名赞助者 2 号", "粤北", "**颖", "liubok", "lty", "Yohjishong", "猫之汉化", "益达", "tttt", "Alex", "BlancX", "i马克图布", "松子", "Zy", "胡杨", "*源", "脆脆的", "**朗", "无邪。", "Jakobs", "小星星4818", "聪明文思", "菜头", "ForeverJv", "Atopos", "dragoon", "徐云霆", "Ewwwzh", "Grace", "tnyh0330", "iK兎Ki", "¥999", "不要这雪", "混淆", "夜雨思晗", "顗逺", "Justin", "好名字被用光了", "Y.", ".", "理想", "逆地无天", "龙", "轩辕", "四方上下为宇", "Wuliyasi", "Chemisme", "蔡蔡", "Zhang", "鸿", "Carho", "風を食む", "小栗", "。。。。", "Red", "抬头见喜", "空海", "浦睿", "Danial", "我要午睡", "魚尾鱼尾鱼", "Rosépineus", "洞穴里的太阳", "逍尧子", "边际不寄", "桓", "Y", "青", "谷彻然", "LiuB", "摆", "Meursault", "Ruby", "**豪", "**朗", "**彬", "**彬", "**俊", "**彬", "**霖", "**涛", "**东", "**源", "**元", "Howland", "Kamil", "CS", "HD0NG", "dannyquayle", "Lowis Wong", "Stacey🌋", "又堵", "国家一级可乐品鉴师", "Cyanis", "99", "李火旺", "晴空叁玖里", "金童", "Y", "?", "chellyzzz", "一定要跟自己和解", "yankee_qi", "浮小尘", "*迅", "*浩", "**柠", "**文", "**滔", "**宇", "**佐", "*强", "**泰", "**星", "**飞", "*鑫", "Commie.苍", "Mezzo Forte", "爱染城", "Maco", "G2TH3S", "Kezd-", "Hsu", "红薯", "公无渡河", "晃", "6 z 1", "炒米线", "前熬夜运动员", "青丘", "一日看尽长安花", "Bee.", "Inject", "Leslie Mo", "Fm106.8", "柯山梦", "柴荨-🌙🐎", "夜间飞鸟", "六虎凶鸣", "博协", "梦中的梦", "wnlei", "孤守半岛", "Siri", "MEEE", "十分人性", "西米 SU" ] ================================================ FILE: src/assets/styles/tailwind.css ================================================ @import 'tailwindcss'; @layer base { :root { --background: oklch(0.98 0.002 250); --foreground: oklch(0.14 0.004 285); --card: oklch(0.995 0.001 250); --card-foreground: oklch(0.14 0.004 285); --popover: oklch(0.995 0.001 250); --popover-foreground: oklch(0.14 0.004 285); --primary: oklch(0.55 0.17 155); --primary-foreground: oklch(0.99 0 0); --secondary: oklch(0.95 0.004 250); --secondary-foreground: oklch(0.38 0.006 250); --muted: oklch(0.96 0.003 250); --muted-foreground: oklch(0.5 0.01 250); --accent: oklch(0.94 0.015 155); --accent-foreground: oklch(0.14 0.004 285); --destructive: oklch(0.6 0.22 25); --destructive-foreground: oklch(0.99 0 0); --border: oklch(0.92 0.004 250); --input: oklch(0.92 0.004 250); --ring: oklch(0.55 0.17 155); --radius: 0.625rem; } .dark { --background: oklch(0.16 0.006 285); --foreground: oklch(0.92 0.004 250); --card: oklch(0.2 0.008 285); --card-foreground: oklch(0.92 0.004 250); --popover: oklch(0.2 0.008 285); --popover-foreground: oklch(0.92 0.004 250); --primary: oklch(0.7 0.16 155); --primary-foreground: oklch(0.12 0.01 285); --secondary: oklch(0.24 0.008 285); --secondary-foreground: oklch(0.72 0.006 250); --muted: oklch(0.2 0.006 285); --muted-foreground: oklch(0.56 0.008 250); --accent: oklch(0.26 0.015 155); --accent-foreground: oklch(0.72 0.006 250); --destructive: oklch(0.6 0.22 25); --destructive-foreground: oklch(0.12 0.01 285); --border: oklch(0.3 0.008 285); --input: oklch(0.3 0.008 285); --ring: oklch(0.7 0.16 155); } * { border-color: var(--border); } /* Disable default View Transition crossfade — we use a custom clip-path circle expand */ ::view-transition-old(root), ::view-transition-new(root) { animation: none; mix-blend-mode: normal; } ::view-transition-new(root) { z-index: 1; } body { background-color: var(--background); color: var(--foreground); font-feature-settings: 'rlig' 1, 'calt' 1; } } @theme { --animate-spin-slow: spin 20s linear infinite; @keyframes spin { to { transform: rotate(360deg); } } --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); --color-card-foreground: var(--card-foreground); --color-popover: var(--popover); --color-popover-foreground: var(--popover-foreground); --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); --color-muted: var(--muted); --color-muted-foreground: var(--muted-foreground); --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); --color-destructive: var(--destructive); --color-destructive-foreground: var(--destructive-foreground); --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); } ================================================ FILE: src/components/DarkModeToggle.tsx ================================================ import React from 'react'; import { Moon, Sun } from 'lucide-react'; import { useDarkMode } from '../hooks/useDarkMode'; import { Button } from './ui/button'; export const DarkModeToggle: React.FC = () => { const { isDark, toggleDarkMode } = useDarkMode(); return ( ); }; ================================================ FILE: src/components/LanguageSwitcher.tsx ================================================ import React from 'react'; import { Globe } from 'lucide-react'; import { useLanguage } from '../contexts/LanguageContext'; import { APP_LANGUAGE_LABELS, getNextLanguage } from '../utils/language'; import { Button } from './ui/button'; export const LanguageSwitcher: React.FC = () => { const { language, setLanguage } = useLanguage(); const nextLanguage = getNextLanguage(language); const toggleLanguage = () => { setLanguage(nextLanguage); }; return ( ); }; ================================================ FILE: src/components/ui/button.tsx ================================================ import * as React from 'react'; import { type VariantProps, cva } from 'class-variance-authority'; import { cn } from '../../lib/utils'; const buttonVariants = cva( 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 relative overflow-hidden', { variants: { variant: { default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90 before:absolute before:inset-1/2 before:h-0 before:w-0 before:-translate-x-1/2 before:-translate-y-1/2 before:rounded-full before:bg-white/30 before:transition-all before:duration-500 active:before:h-full active:before:w-full active:before:duration-0', destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90 before:absolute before:inset-1/2 before:h-0 before:w-0 before:-translate-x-1/2 before:-translate-y-1/2 before:rounded-full before:bg-white/30 before:transition-all before:duration-500 active:before:h-full active:before:w-full active:before:duration-0', outline: 'border border-input bg-card hover:bg-accent hover:text-accent-foreground shadow-sm before:absolute before:inset-1/2 before:h-0 before:w-0 before:-translate-x-1/2 before:-translate-y-1/2 before:rounded-full before:bg-primary/10 before:transition-all before:duration-500 active:before:h-full active:before:w-full active:before:duration-0', secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80 before:absolute before:inset-1/2 before:h-0 before:w-0 before:-translate-x-1/2 before:-translate-y-1/2 before:rounded-full before:bg-primary/20 before:transition-all before:duration-500 active:before:h-full active:before:w-full active:before:duration-0', ghost: 'hover:bg-accent hover:text-accent-foreground before:absolute before:inset-1/2 before:h-0 before:w-0 before:-translate-x-1/2 before:-translate-y-1/2 before:rounded-full before:bg-primary/10 before:transition-all before:duration-500 active:before:h-full active:before:w-full active:before:duration-0', link: 'text-primary underline-offset-4 hover:underline', }, size: { default: 'h-10 px-4 py-2', sm: 'h-9 rounded-md px-3', lg: 'h-11 rounded-md px-8', icon: 'h-10 w-10', }, }, defaultVariants: { variant: 'default', size: 'default', }, }, ); export interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps { asChild?: boolean; } const Button = React.forwardRef( ({ className, variant, size, children, ...props }, ref) => { return ( ); }, ); Button.displayName = 'Button'; export { Button, buttonVariants }; ================================================ FILE: src/components/ui/card.tsx ================================================ import * as React from 'react'; import { cn } from '../../lib/utils'; const Card = React.forwardRef>( ({ className, ...props }, ref) => (
), ); Card.displayName = 'Card'; const CardHeader = React.forwardRef>( ({ className, ...props }, ref) => (
), ); CardHeader.displayName = 'CardHeader'; const CardTitle = React.forwardRef>( ({ className, ...props }, ref) => (

), ); CardTitle.displayName = 'CardTitle'; const CardDescription = React.forwardRef< HTMLParagraphElement, React.HTMLAttributes >(({ className, ...props }, ref) => (

)); CardDescription.displayName = 'CardDescription'; const CardContent = React.forwardRef>( ({ className, ...props }, ref) => (

), ); CardContent.displayName = 'CardContent'; const CardFooter = React.forwardRef>( ({ className, ...props }, ref) => (
), ); CardFooter.displayName = 'CardFooter'; export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }; ================================================ FILE: src/components/ui/label.tsx ================================================ import * as React from 'react'; import { cn } from '../../lib/utils'; const Label = React.forwardRef>( ({ className, ...props }, ref) => (