gitextract_0hhlykuf/ ├── .clang-format ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ └── feature_request.yml │ └── workflows/ │ ├── build-release.yml │ └── deploy-docs.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .vscode/ │ ├── c_cpp_properties.json │ ├── launch.json │ └── settings.json ├── AGENTS.md ├── CREDITS.md ├── LEGAL.md ├── LICENSE ├── README.md ├── cliff.toml ├── docs/ │ ├── .vitepress/ │ │ ├── config.ts │ │ ├── seo.ts │ │ └── theme/ │ │ ├── custom.css │ │ └── index.ts │ ├── en/ │ │ ├── about/ │ │ │ ├── credits.md │ │ │ └── legal.md │ │ ├── developer/ │ │ │ └── architecture.md │ │ ├── features/ │ │ │ ├── recording.md │ │ │ ├── screenshot.md │ │ │ └── window.md │ │ ├── guide/ │ │ │ └── getting-started.md │ │ └── index.md │ ├── index.md │ ├── package.json │ ├── public/ │ │ ├── robots.txt │ │ └── version.txt │ ├── v0/ │ │ ├── en/ │ │ │ └── index.md │ │ ├── index.md │ │ └── zh/ │ │ ├── advanced/ │ │ │ ├── custom-settings.md │ │ │ └── troubleshooting.md │ │ └── guide/ │ │ ├── features.md │ │ ├── getting-started.md │ │ └── introduction.md │ └── zh/ │ ├── about/ │ │ ├── credits.md │ │ └── legal.md │ ├── developer/ │ │ └── architecture.md │ ├── features/ │ │ ├── recording.md │ │ ├── screenshot.md │ │ └── window.md │ └── guide/ │ └── getting-started.md ├── installer/ │ ├── Bundle.wxs │ ├── CleanupAppDataRoot.js │ ├── DetectRunningSpinningMomo.js │ ├── License.rtf │ ├── Package.en-us.wxl │ ├── Package.wxs │ └── bundle/ │ ├── payloads/ │ │ └── 2052/ │ │ └── thm.wxl │ └── thm.wxl ├── package.json ├── resources/ │ ├── app.manifest │ └── app.rc ├── scripts/ │ ├── build-msi.ps1 │ ├── build-portable.js │ ├── fetch-third-party.ps1 │ ├── format-cpp.js │ ├── format-web.js │ ├── generate-checksums.js │ ├── generate-embedded-locales.js │ ├── generate-map-injection-cpp.js │ ├── generate-migrations.js │ ├── prepare-dist.js │ ├── quick-cleanup-spinningmomo.ps1 │ └── release-version.js ├── src/ │ ├── app.cpp │ ├── app.ixx │ ├── core/ │ │ ├── async/ │ │ │ ├── async.cpp │ │ │ ├── async.ixx │ │ │ ├── state.ixx │ │ │ └── ui_awaitable.ixx │ │ ├── commands/ │ │ │ ├── builtin.cpp │ │ │ ├── registry.cpp │ │ │ ├── registry.ixx │ │ │ └── state.ixx │ │ ├── database/ │ │ │ ├── data_mapper.ixx │ │ │ ├── database.cpp │ │ │ ├── database.ixx │ │ │ ├── state.ixx │ │ │ └── types.ixx │ │ ├── dialog_service/ │ │ │ ├── dialog_service.cpp │ │ │ ├── dialog_service.ixx │ │ │ └── state.ixx │ │ ├── events/ │ │ │ ├── events.cpp │ │ │ ├── events.ixx │ │ │ ├── handlers/ │ │ │ │ ├── feature_handlers.cpp │ │ │ │ ├── feature_handlers.ixx │ │ │ │ ├── settings_handlers.cpp │ │ │ │ ├── settings_handlers.ixx │ │ │ │ ├── system_handlers.cpp │ │ │ │ └── system_handlers.ixx │ │ │ ├── registrar.cpp │ │ │ ├── registrar.ixx │ │ │ └── state.ixx │ │ ├── http_client/ │ │ │ ├── http_client.cpp │ │ │ ├── http_client.ixx │ │ │ ├── state.ixx │ │ │ └── types.ixx │ │ ├── http_server/ │ │ │ ├── http_server.cpp │ │ │ ├── http_server.ixx │ │ │ ├── routes.cpp │ │ │ ├── routes.ixx │ │ │ ├── sse_manager.cpp │ │ │ ├── sse_manager.ixx │ │ │ ├── state.ixx │ │ │ ├── static.cpp │ │ │ ├── static.ixx │ │ │ └── types.ixx │ │ ├── i18n/ │ │ │ ├── embedded/ │ │ │ │ ├── en_us.ixx │ │ │ │ └── zh_cn.ixx │ │ │ ├── i18n.cpp │ │ │ ├── i18n.ixx │ │ │ ├── state.ixx │ │ │ └── types.ixx │ │ ├── initializer/ │ │ │ ├── database.cpp │ │ │ ├── database.ixx │ │ │ ├── initializer.cpp │ │ │ └── initializer.ixx │ │ ├── migration/ │ │ │ ├── generated/ │ │ │ │ ├── schema.ixx │ │ │ │ ├── schema_001.ixx │ │ │ │ ├── schema_002.ixx │ │ │ │ └── schema_003.ixx │ │ │ ├── migration.cpp │ │ │ ├── migration.ixx │ │ │ └── scripts/ │ │ │ ├── scripts.cpp │ │ │ └── scripts.ixx │ │ ├── rpc/ │ │ │ ├── endpoints/ │ │ │ │ ├── clipboard/ │ │ │ │ │ ├── clipboard.cpp │ │ │ │ │ └── clipboard.ixx │ │ │ │ ├── dialog/ │ │ │ │ │ ├── dialog.cpp │ │ │ │ │ └── dialog.ixx │ │ │ │ ├── extensions/ │ │ │ │ │ ├── extensions.cpp │ │ │ │ │ └── extensions.ixx │ │ │ │ ├── file/ │ │ │ │ │ ├── file.cpp │ │ │ │ │ └── file.ixx │ │ │ │ ├── gallery/ │ │ │ │ │ ├── asset.cpp │ │ │ │ │ ├── asset.ixx │ │ │ │ │ ├── folder.cpp │ │ │ │ │ ├── folder.ixx │ │ │ │ │ ├── gallery.cpp │ │ │ │ │ ├── gallery.ixx │ │ │ │ │ ├── tag.cpp │ │ │ │ │ └── tag.ixx │ │ │ │ ├── registry/ │ │ │ │ │ ├── registry.cpp │ │ │ │ │ └── registry.ixx │ │ │ │ ├── runtime_info/ │ │ │ │ │ ├── runtime_info.cpp │ │ │ │ │ └── runtime_info.ixx │ │ │ │ ├── settings/ │ │ │ │ │ ├── settings.cpp │ │ │ │ │ └── settings.ixx │ │ │ │ ├── tasks/ │ │ │ │ │ ├── tasks.cpp │ │ │ │ │ └── tasks.ixx │ │ │ │ ├── update/ │ │ │ │ │ ├── update.cpp │ │ │ │ │ └── update.ixx │ │ │ │ ├── webview/ │ │ │ │ │ ├── webview.cpp │ │ │ │ │ └── webview.ixx │ │ │ │ └── window_control/ │ │ │ │ ├── window_control.cpp │ │ │ │ └── window_control.ixx │ │ │ ├── notification_hub.cpp │ │ │ ├── notification_hub.ixx │ │ │ ├── registry.cpp │ │ │ ├── registry.ixx │ │ │ ├── rpc.cpp │ │ │ ├── rpc.ixx │ │ │ ├── state.ixx │ │ │ └── types.ixx │ │ ├── runtime_info/ │ │ │ ├── runtime_info.cpp │ │ │ └── runtime_info.ixx │ │ ├── shutdown/ │ │ │ ├── shutdown.cpp │ │ │ └── shutdown.ixx │ │ ├── state/ │ │ │ ├── app_state.cpp │ │ │ ├── app_state.ixx │ │ │ └── runtime_info.ixx │ │ ├── tasks/ │ │ │ ├── state.ixx │ │ │ ├── tasks.cpp │ │ │ └── tasks.ixx │ │ ├── webview/ │ │ │ ├── events.ixx │ │ │ ├── host.cpp │ │ │ ├── host.ixx │ │ │ ├── rpc_bridge.cpp │ │ │ ├── rpc_bridge.ixx │ │ │ ├── state.ixx │ │ │ ├── static.cpp │ │ │ ├── static.ixx │ │ │ ├── types.ixx │ │ │ ├── webview.cpp │ │ │ └── webview.ixx │ │ └── worker_pool/ │ │ ├── state.ixx │ │ ├── worker_pool.cpp │ │ └── worker_pool.ixx │ ├── extensions/ │ │ └── infinity_nikki/ │ │ ├── game_directory.cpp │ │ ├── game_directory.ixx │ │ ├── generated/ │ │ │ └── map_injection_script.ixx │ │ ├── map_service.cpp │ │ ├── map_service.ixx │ │ ├── photo_extract/ │ │ │ ├── infra.cpp │ │ │ ├── infra.ixx │ │ │ ├── photo_extract.cpp │ │ │ ├── photo_extract.ixx │ │ │ ├── scan.cpp │ │ │ └── scan.ixx │ │ ├── photo_service.cpp │ │ ├── photo_service.ixx │ │ ├── screenshot_hardlinks.cpp │ │ ├── screenshot_hardlinks.ixx │ │ ├── task_service.cpp │ │ ├── task_service.ixx │ │ └── types.ixx │ ├── features/ │ │ ├── gallery/ │ │ │ ├── asset/ │ │ │ │ ├── infinity_nikki_metadata_dict.cpp │ │ │ │ ├── infinity_nikki_metadata_dict.ixx │ │ │ │ ├── repository.cpp │ │ │ │ ├── repository.ixx │ │ │ │ ├── service.cpp │ │ │ │ ├── service.ixx │ │ │ │ ├── thumbnail.cpp │ │ │ │ └── thumbnail.ixx │ │ │ ├── color/ │ │ │ │ ├── extractor.cpp │ │ │ │ ├── extractor.ixx │ │ │ │ ├── filter.cpp │ │ │ │ ├── filter.ixx │ │ │ │ ├── repository.cpp │ │ │ │ ├── repository.ixx │ │ │ │ └── types.ixx │ │ │ ├── folder/ │ │ │ │ ├── repository.cpp │ │ │ │ ├── repository.ixx │ │ │ │ ├── service.cpp │ │ │ │ └── service.ixx │ │ │ ├── gallery.cpp │ │ │ ├── gallery.ixx │ │ │ ├── ignore/ │ │ │ │ ├── matcher.cpp │ │ │ │ ├── matcher.ixx │ │ │ │ ├── repository.cpp │ │ │ │ ├── repository.ixx │ │ │ │ ├── service.cpp │ │ │ │ └── service.ixx │ │ │ ├── original_locator.cpp │ │ │ ├── original_locator.ixx │ │ │ ├── recovery/ │ │ │ │ ├── repository.cpp │ │ │ │ ├── repository.ixx │ │ │ │ ├── service.cpp │ │ │ │ ├── service.ixx │ │ │ │ └── types.ixx │ │ │ ├── scan_common.cpp │ │ │ ├── scan_common.ixx │ │ │ ├── scanner.cpp │ │ │ ├── scanner.ixx │ │ │ ├── state.ixx │ │ │ ├── static_resolver.cpp │ │ │ ├── static_resolver.ixx │ │ │ ├── tag/ │ │ │ │ ├── repository.cpp │ │ │ │ ├── repository.ixx │ │ │ │ ├── service.cpp │ │ │ │ └── service.ixx │ │ │ ├── types.ixx │ │ │ ├── watcher.cpp │ │ │ └── watcher.ixx │ │ ├── letterbox/ │ │ │ ├── letterbox.cpp │ │ │ ├── letterbox.ixx │ │ │ ├── state.ixx │ │ │ ├── usecase.cpp │ │ │ └── usecase.ixx │ │ ├── notifications/ │ │ │ ├── constants.ixx │ │ │ ├── notifications.cpp │ │ │ ├── notifications.ixx │ │ │ └── state.ixx │ │ ├── overlay/ │ │ │ ├── capture.cpp │ │ │ ├── capture.ixx │ │ │ ├── geometry.cpp │ │ │ ├── geometry.ixx │ │ │ ├── interaction.cpp │ │ │ ├── interaction.ixx │ │ │ ├── overlay.cpp │ │ │ ├── overlay.ixx │ │ │ ├── rendering.cpp │ │ │ ├── rendering.ixx │ │ │ ├── shaders.ixx │ │ │ ├── state.ixx │ │ │ ├── threads.cpp │ │ │ ├── threads.ixx │ │ │ ├── types.ixx │ │ │ ├── usecase.cpp │ │ │ ├── usecase.ixx │ │ │ ├── window.cpp │ │ │ └── window.ixx │ │ ├── preview/ │ │ │ ├── capture.cpp │ │ │ ├── capture.ixx │ │ │ ├── interaction.cpp │ │ │ ├── interaction.ixx │ │ │ ├── preview.cpp │ │ │ ├── preview.ixx │ │ │ ├── rendering.cpp │ │ │ ├── rendering.ixx │ │ │ ├── shaders.ixx │ │ │ ├── state.ixx │ │ │ ├── types.ixx │ │ │ ├── usecase.cpp │ │ │ ├── usecase.ixx │ │ │ ├── viewport.cpp │ │ │ ├── viewport.ixx │ │ │ ├── window.cpp │ │ │ └── window.ixx │ │ ├── recording/ │ │ │ ├── audio_capture.cpp │ │ │ ├── audio_capture.ixx │ │ │ ├── recording.cpp │ │ │ ├── recording.ixx │ │ │ ├── state.ixx │ │ │ ├── types.ixx │ │ │ ├── usecase.cpp │ │ │ └── usecase.ixx │ │ ├── replay_buffer/ │ │ │ ├── disk_ring_buffer.cpp │ │ │ ├── disk_ring_buffer.ixx │ │ │ ├── motion_photo.cpp │ │ │ ├── motion_photo.ixx │ │ │ ├── muxer.cpp │ │ │ ├── muxer.ixx │ │ │ ├── replay_buffer.cpp │ │ │ ├── replay_buffer.ixx │ │ │ ├── state.ixx │ │ │ ├── types.ixx │ │ │ ├── usecase.cpp │ │ │ └── usecase.ixx │ │ ├── screenshot/ │ │ │ ├── screenshot.cpp │ │ │ ├── screenshot.ixx │ │ │ ├── state.ixx │ │ │ ├── usecase.cpp │ │ │ └── usecase.ixx │ │ ├── settings/ │ │ │ ├── background.cpp │ │ │ ├── background.ixx │ │ │ ├── compute.cpp │ │ │ ├── compute.ixx │ │ │ ├── events.ixx │ │ │ ├── menu.cpp │ │ │ ├── menu.ixx │ │ │ ├── migration.cpp │ │ │ ├── migration.ixx │ │ │ ├── registry.ixx │ │ │ ├── settings.cpp │ │ │ ├── settings.ixx │ │ │ ├── state.ixx │ │ │ └── types.ixx │ │ ├── update/ │ │ │ ├── state.ixx │ │ │ ├── types.ixx │ │ │ ├── update.cpp │ │ │ └── update.ixx │ │ └── window_control/ │ │ ├── state.ixx │ │ ├── usecase.cpp │ │ ├── usecase.ixx │ │ ├── window_control.cpp │ │ └── window_control.ixx │ ├── locales/ │ │ ├── en-US.json │ │ └── zh-CN.json │ ├── main.cpp │ ├── migrations/ │ │ ├── 001_initial_schema.sql │ │ ├── 002_watch_root_recovery_state.sql │ │ └── 003_infinity_nikki_params_nuan5_columns.sql │ ├── ui/ │ │ ├── context_menu/ │ │ │ ├── context_menu.cpp │ │ │ ├── context_menu.ixx │ │ │ ├── d2d_context.cpp │ │ │ ├── d2d_context.ixx │ │ │ ├── interaction.cpp │ │ │ ├── interaction.ixx │ │ │ ├── layout.cpp │ │ │ ├── layout.ixx │ │ │ ├── message_handler.cpp │ │ │ ├── message_handler.ixx │ │ │ ├── painter.cpp │ │ │ ├── painter.ixx │ │ │ ├── state.ixx │ │ │ └── types.ixx │ │ ├── floating_window/ │ │ │ ├── d2d_context.cpp │ │ │ ├── d2d_context.ixx │ │ │ ├── events.ixx │ │ │ ├── floating_window.cpp │ │ │ ├── floating_window.ixx │ │ │ ├── layout.cpp │ │ │ ├── layout.ixx │ │ │ ├── message_handler.cpp │ │ │ ├── message_handler.ixx │ │ │ ├── painter.cpp │ │ │ ├── painter.ixx │ │ │ ├── state.ixx │ │ │ └── types.ixx │ │ ├── tray_icon/ │ │ │ ├── state.ixx │ │ │ ├── tray_icon.cpp │ │ │ ├── tray_icon.ixx │ │ │ └── types.ixx │ │ └── webview_window/ │ │ ├── webview_window.cpp │ │ └── webview_window.ixx │ ├── utils/ │ │ ├── crash_dump/ │ │ │ ├── crash_dump.cpp │ │ │ └── crash_dump.ixx │ │ ├── crypto/ │ │ │ ├── crypto.cpp │ │ │ └── crypto.ixx │ │ ├── dialog/ │ │ │ ├── dialog.cpp │ │ │ └── dialog.ixx │ │ ├── file/ │ │ │ ├── file.cpp │ │ │ ├── file.ixx │ │ │ ├── mime.cpp │ │ │ └── mime.ixx │ │ ├── graphics/ │ │ │ ├── capture.cpp │ │ │ ├── capture.ixx │ │ │ ├── capture_region.cpp │ │ │ ├── capture_region.ixx │ │ │ ├── d3d.cpp │ │ │ └── d3d.ixx │ │ ├── image/ │ │ │ ├── image.cpp │ │ │ └── image.ixx │ │ ├── logger/ │ │ │ ├── logger.cpp │ │ │ └── logger.ixx │ │ ├── lru_cache.ixx │ │ ├── media/ │ │ │ ├── audio_capture.cpp │ │ │ ├── audio_capture.ixx │ │ │ ├── encoder.cpp │ │ │ ├── encoder.ixx │ │ │ ├── raw_encoder.cpp │ │ │ ├── raw_encoder.ixx │ │ │ ├── state.ixx │ │ │ ├── types.ixx │ │ │ ├── video_asset.cpp │ │ │ ├── video_asset.ixx │ │ │ ├── video_scaler.cpp │ │ │ └── video_scaler.ixx │ │ ├── path/ │ │ │ ├── path.cpp │ │ │ └── path.ixx │ │ ├── string/ │ │ │ └── string.ixx │ │ ├── system/ │ │ │ ├── system.cpp │ │ │ └── system.ixx │ │ ├── throttle/ │ │ │ └── throttle.ixx │ │ ├── time.ixx │ │ └── timer/ │ │ ├── timeout.cpp │ │ └── timeout.ixx │ └── vendor/ │ ├── build_config.ixx │ ├── shellapi.ixx │ ├── version.ixx │ ├── wil.ixx │ ├── windows.ixx │ ├── winhttp.ixx │ └── xxhash.ixx ├── tasks/ │ ├── build-all.lua │ ├── release.lua │ └── vs.lua ├── version.json ├── web/ │ ├── .gitignore │ ├── .prettierrc.json │ ├── .vscode/ │ │ └── extensions.json │ ├── README.md │ ├── components.json │ ├── index.html │ ├── package.json │ ├── src/ │ │ ├── App.vue │ │ ├── components/ │ │ │ ├── WindowTitlePickerButton.vue │ │ │ ├── layout/ │ │ │ │ ├── ActivityBar.vue │ │ │ │ ├── AppHeader.vue │ │ │ │ ├── AppLayout.vue │ │ │ │ ├── ContentArea.vue │ │ │ │ ├── GalleryDebugOverlay.vue │ │ │ │ ├── WindowResizeOverlay.vue │ │ │ │ └── index.ts │ │ │ └── ui/ │ │ │ ├── accordion/ │ │ │ │ ├── Accordion.vue │ │ │ │ ├── AccordionContent.vue │ │ │ │ ├── AccordionItem.vue │ │ │ │ ├── AccordionTrigger.vue │ │ │ │ └── index.ts │ │ │ ├── alert/ │ │ │ │ ├── Alert.vue │ │ │ │ ├── AlertDescription.vue │ │ │ │ ├── AlertTitle.vue │ │ │ │ └── index.ts │ │ │ ├── alert-dialog/ │ │ │ │ ├── AlertDialog.vue │ │ │ │ ├── AlertDialogAction.vue │ │ │ │ ├── AlertDialogCancel.vue │ │ │ │ ├── AlertDialogContent.vue │ │ │ │ ├── AlertDialogDescription.vue │ │ │ │ ├── AlertDialogFooter.vue │ │ │ │ ├── AlertDialogHeader.vue │ │ │ │ ├── AlertDialogTitle.vue │ │ │ │ ├── AlertDialogTrigger.vue │ │ │ │ └── index.ts │ │ │ ├── badge/ │ │ │ │ ├── Badge.vue │ │ │ │ └── index.ts │ │ │ ├── button/ │ │ │ │ ├── Button.vue │ │ │ │ └── index.ts │ │ │ ├── checkbox/ │ │ │ │ ├── Checkbox.vue │ │ │ │ └── index.ts │ │ │ ├── color-picker/ │ │ │ │ ├── ColorPicker.vue │ │ │ │ └── colorUtils.ts │ │ │ ├── context-menu/ │ │ │ │ ├── ContextMenu.vue │ │ │ │ ├── ContextMenuCheckboxItem.vue │ │ │ │ ├── ContextMenuContent.vue │ │ │ │ ├── ContextMenuGroup.vue │ │ │ │ ├── ContextMenuItem.vue │ │ │ │ ├── ContextMenuLabel.vue │ │ │ │ ├── ContextMenuPortal.vue │ │ │ │ ├── ContextMenuRadioGroup.vue │ │ │ │ ├── ContextMenuRadioItem.vue │ │ │ │ ├── ContextMenuSeparator.vue │ │ │ │ ├── ContextMenuShortcut.vue │ │ │ │ ├── ContextMenuSub.vue │ │ │ │ ├── ContextMenuSubContent.vue │ │ │ │ ├── ContextMenuSubTrigger.vue │ │ │ │ ├── ContextMenuTrigger.vue │ │ │ │ └── index.ts │ │ │ ├── dialog/ │ │ │ │ ├── Dialog.vue │ │ │ │ ├── DialogClose.vue │ │ │ │ ├── DialogContent.vue │ │ │ │ ├── DialogDescription.vue │ │ │ │ ├── DialogFooter.vue │ │ │ │ ├── DialogHeader.vue │ │ │ │ ├── DialogOverlay.vue │ │ │ │ ├── DialogScrollContent.vue │ │ │ │ ├── DialogTitle.vue │ │ │ │ ├── DialogTrigger.vue │ │ │ │ └── index.ts │ │ │ ├── dropdown-menu/ │ │ │ │ ├── DropdownMenu.vue │ │ │ │ ├── DropdownMenuCheckboxItem.vue │ │ │ │ ├── DropdownMenuContent.vue │ │ │ │ ├── DropdownMenuGroup.vue │ │ │ │ ├── DropdownMenuItem.vue │ │ │ │ ├── DropdownMenuLabel.vue │ │ │ │ ├── DropdownMenuRadioGroup.vue │ │ │ │ ├── DropdownMenuRadioItem.vue │ │ │ │ ├── DropdownMenuSeparator.vue │ │ │ │ ├── DropdownMenuShortcut.vue │ │ │ │ ├── DropdownMenuSub.vue │ │ │ │ ├── DropdownMenuSubContent.vue │ │ │ │ ├── DropdownMenuSubTrigger.vue │ │ │ │ ├── DropdownMenuTrigger.vue │ │ │ │ └── index.ts │ │ │ ├── input/ │ │ │ │ ├── Input.vue │ │ │ │ └── index.ts │ │ │ ├── item/ │ │ │ │ ├── Item.vue │ │ │ │ ├── ItemActions.vue │ │ │ │ ├── ItemContent.vue │ │ │ │ ├── ItemDescription.vue │ │ │ │ ├── ItemFooter.vue │ │ │ │ ├── ItemGroup.vue │ │ │ │ ├── ItemHeader.vue │ │ │ │ ├── ItemMedia.vue │ │ │ │ ├── ItemSeparator.vue │ │ │ │ ├── ItemTitle.vue │ │ │ │ └── index.ts │ │ │ ├── label/ │ │ │ │ ├── Label.vue │ │ │ │ └── index.ts │ │ │ ├── popover/ │ │ │ │ ├── Popover.vue │ │ │ │ ├── PopoverAnchor.vue │ │ │ │ ├── PopoverContent.vue │ │ │ │ ├── PopoverTrigger.vue │ │ │ │ └── index.ts │ │ │ ├── scroll-area/ │ │ │ │ ├── ScrollArea.vue │ │ │ │ ├── ScrollBar.vue │ │ │ │ └── index.ts │ │ │ ├── select/ │ │ │ │ ├── Select.vue │ │ │ │ ├── SelectContent.vue │ │ │ │ ├── SelectGroup.vue │ │ │ │ ├── SelectItem.vue │ │ │ │ ├── SelectItemText.vue │ │ │ │ ├── SelectLabel.vue │ │ │ │ ├── SelectScrollDownButton.vue │ │ │ │ ├── SelectScrollUpButton.vue │ │ │ │ ├── SelectSeparator.vue │ │ │ │ ├── SelectTrigger.vue │ │ │ │ ├── SelectValue.vue │ │ │ │ └── index.ts │ │ │ ├── separator/ │ │ │ │ ├── Separator.vue │ │ │ │ └── index.ts │ │ │ ├── sheet/ │ │ │ │ ├── Sheet.vue │ │ │ │ ├── SheetClose.vue │ │ │ │ ├── SheetContent.vue │ │ │ │ ├── SheetDescription.vue │ │ │ │ ├── SheetFooter.vue │ │ │ │ ├── SheetHeader.vue │ │ │ │ ├── SheetOverlay.vue │ │ │ │ ├── SheetTitle.vue │ │ │ │ ├── SheetTrigger.vue │ │ │ │ └── index.ts │ │ │ ├── sidebar/ │ │ │ │ ├── Sidebar.vue │ │ │ │ ├── SidebarContent.vue │ │ │ │ ├── SidebarFooter.vue │ │ │ │ ├── SidebarGroup.vue │ │ │ │ ├── SidebarGroupAction.vue │ │ │ │ ├── SidebarGroupContent.vue │ │ │ │ ├── SidebarGroupLabel.vue │ │ │ │ ├── SidebarHeader.vue │ │ │ │ ├── SidebarInput.vue │ │ │ │ ├── SidebarInset.vue │ │ │ │ ├── SidebarMenu.vue │ │ │ │ ├── SidebarMenuAction.vue │ │ │ │ ├── SidebarMenuBadge.vue │ │ │ │ ├── SidebarMenuButton.vue │ │ │ │ ├── SidebarMenuButtonChild.vue │ │ │ │ ├── SidebarMenuItem.vue │ │ │ │ ├── SidebarMenuSkeleton.vue │ │ │ │ ├── SidebarMenuSub.vue │ │ │ │ ├── SidebarMenuSubButton.vue │ │ │ │ ├── SidebarMenuSubItem.vue │ │ │ │ ├── SidebarProvider.vue │ │ │ │ ├── SidebarRail.vue │ │ │ │ ├── SidebarSeparator.vue │ │ │ │ ├── SidebarTrigger.vue │ │ │ │ ├── index.ts │ │ │ │ └── utils.ts │ │ │ ├── skeleton/ │ │ │ │ ├── Skeleton.vue │ │ │ │ └── index.ts │ │ │ ├── slider/ │ │ │ │ ├── Slider.vue │ │ │ │ └── index.ts │ │ │ ├── sonner/ │ │ │ │ ├── Sonner.vue │ │ │ │ └── index.ts │ │ │ ├── split/ │ │ │ │ ├── Split.vue │ │ │ │ ├── index.ts │ │ │ │ └── useSplitResize.ts │ │ │ ├── switch/ │ │ │ │ ├── Switch.vue │ │ │ │ └── index.ts │ │ │ ├── tabs/ │ │ │ │ ├── Tabs.vue │ │ │ │ ├── TabsContent.vue │ │ │ │ ├── TabsList.vue │ │ │ │ ├── TabsTrigger.vue │ │ │ │ └── index.ts │ │ │ ├── textarea/ │ │ │ │ ├── Textarea.vue │ │ │ │ └── index.ts │ │ │ ├── toggle/ │ │ │ │ ├── Toggle.vue │ │ │ │ └── index.ts │ │ │ ├── toggle-group/ │ │ │ │ ├── ToggleGroup.vue │ │ │ │ ├── ToggleGroupItem.vue │ │ │ │ └── index.ts │ │ │ └── tooltip/ │ │ │ ├── Tooltip.vue │ │ │ ├── TooltipContent.vue │ │ │ ├── TooltipProvider.vue │ │ │ ├── TooltipTrigger.vue │ │ │ └── index.ts │ │ ├── composables/ │ │ │ ├── useI18n.ts │ │ │ ├── useRpc.ts │ │ │ └── useToast.ts │ │ ├── core/ │ │ │ ├── clipboard.ts │ │ │ ├── env/ │ │ │ │ └── index.ts │ │ │ ├── i18n/ │ │ │ │ ├── index.ts │ │ │ │ ├── locales/ │ │ │ │ │ ├── en-US/ │ │ │ │ │ │ ├── about.json │ │ │ │ │ │ ├── app.json │ │ │ │ │ │ ├── common.json │ │ │ │ │ │ ├── extensions.json │ │ │ │ │ │ ├── gallery.json │ │ │ │ │ │ ├── home.json │ │ │ │ │ │ ├── map.json │ │ │ │ │ │ ├── menu.json │ │ │ │ │ │ ├── onboarding.json │ │ │ │ │ │ └── settings.json │ │ │ │ │ └── zh-CN/ │ │ │ │ │ ├── about.json │ │ │ │ │ ├── app.json │ │ │ │ │ ├── common.json │ │ │ │ │ ├── extensions.json │ │ │ │ │ ├── gallery.json │ │ │ │ │ ├── home.json │ │ │ │ │ ├── map.json │ │ │ │ │ ├── menu.json │ │ │ │ │ ├── onboarding.json │ │ │ │ │ └── settings.json │ │ │ │ └── types.ts │ │ │ ├── rpc/ │ │ │ │ ├── core.ts │ │ │ │ ├── index.ts │ │ │ │ ├── transport/ │ │ │ │ │ ├── http.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── webview.ts │ │ │ │ └── types.ts │ │ │ └── tasks/ │ │ │ ├── store.ts │ │ │ └── types.ts │ │ ├── extensions/ │ │ │ └── infinity_nikki/ │ │ │ └── index.ts │ │ ├── features/ │ │ │ ├── about/ │ │ │ │ └── pages/ │ │ │ │ └── AboutPage.vue │ │ │ ├── common/ │ │ │ │ └── pages/ │ │ │ │ └── NotFoundPage.vue │ │ │ ├── gallery/ │ │ │ │ ├── api/ │ │ │ │ │ ├── dto.ts │ │ │ │ │ └── urls.ts │ │ │ │ ├── api.ts │ │ │ │ ├── components/ │ │ │ │ │ ├── asset/ │ │ │ │ │ │ ├── AssetCard.vue │ │ │ │ │ │ ├── AssetDetailsContent.vue │ │ │ │ │ │ ├── AssetHistogram.vue │ │ │ │ │ │ ├── AssetListRow.vue │ │ │ │ │ │ ├── AssetReviewControls.vue │ │ │ │ │ │ └── MediaStatusChips.vue │ │ │ │ │ ├── dialogs/ │ │ │ │ │ │ └── GalleryScanDialog.vue │ │ │ │ │ ├── folders/ │ │ │ │ │ │ └── FolderTreeItem.vue │ │ │ │ │ ├── infinity_nikki/ │ │ │ │ │ │ ├── AssetInfinityNikkiDetails.vue │ │ │ │ │ │ ├── InfinityNikkiGuidePanel.vue │ │ │ │ │ │ └── InfinityNikkiMetadataExtractDialog.vue │ │ │ │ │ ├── lightbox/ │ │ │ │ │ │ ├── GalleryLightbox.vue │ │ │ │ │ │ ├── LightboxFilmstrip.vue │ │ │ │ │ │ ├── LightboxImage.vue │ │ │ │ │ │ ├── LightboxToolbar.vue │ │ │ │ │ │ └── LightboxVideo.vue │ │ │ │ │ ├── menus/ │ │ │ │ │ │ ├── GalleryAssetContextMenuContent.vue │ │ │ │ │ │ ├── GalleryAssetDropdownMenuContent.vue │ │ │ │ │ │ └── GallerySharedContextMenu.vue │ │ │ │ │ ├── shell/ │ │ │ │ │ │ ├── GalleryContent.vue │ │ │ │ │ │ ├── GalleryDetails.vue │ │ │ │ │ │ ├── GalleryScrollbarRail.vue │ │ │ │ │ │ ├── GallerySidebar.vue │ │ │ │ │ │ ├── GalleryToolbar.vue │ │ │ │ │ │ └── GalleryViewer.vue │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── ReviewFilterPopover.vue │ │ │ │ │ │ ├── TagInlineEditor.vue │ │ │ │ │ │ ├── TagSelectorPopover.vue │ │ │ │ │ │ └── TagTreeItem.vue │ │ │ │ │ └── viewer/ │ │ │ │ │ ├── AdaptiveView.vue │ │ │ │ │ ├── GridTimelineRailBridge.vue │ │ │ │ │ ├── GridView.vue │ │ │ │ │ ├── ListView.vue │ │ │ │ │ └── MasonryView.vue │ │ │ │ ├── composables/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── timelineRail.ts │ │ │ │ │ ├── useAdaptiveVirtualizer.ts │ │ │ │ │ ├── useGalleryAssetActions.ts │ │ │ │ │ ├── useGalleryContextMenu.ts │ │ │ │ │ ├── useGalleryData.ts │ │ │ │ │ ├── useGalleryDragPayload.ts │ │ │ │ │ ├── useGalleryLayout.ts │ │ │ │ │ ├── useGalleryLightbox.ts │ │ │ │ │ ├── useGallerySelection.ts │ │ │ │ │ ├── useGallerySidebar.ts │ │ │ │ │ ├── useGalleryView.ts │ │ │ │ │ ├── useGridVirtualizer.ts │ │ │ │ │ ├── useHeroTransition.ts │ │ │ │ │ ├── useListVirtualizer.ts │ │ │ │ │ └── useMasonryVirtualizer.ts │ │ │ │ ├── index.ts │ │ │ │ ├── pages/ │ │ │ │ │ └── GalleryPage.vue │ │ │ │ ├── queryFilters.ts │ │ │ │ ├── routes.ts │ │ │ │ ├── store/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── interactionSlice.ts │ │ │ │ │ ├── layoutSlice.ts │ │ │ │ │ ├── navigationSlice.ts │ │ │ │ │ ├── persistence.ts │ │ │ │ │ └── querySlice.ts │ │ │ │ └── types.ts │ │ │ ├── home/ │ │ │ │ └── pages/ │ │ │ │ └── HomePage.vue │ │ │ ├── map/ │ │ │ │ ├── README.md │ │ │ │ ├── api.ts │ │ │ │ ├── bridge/ │ │ │ │ │ └── protocol.ts │ │ │ │ ├── components/ │ │ │ │ │ └── MapIframeHost.vue │ │ │ │ ├── composables/ │ │ │ │ │ ├── useMapBridge.ts │ │ │ │ │ └── useMapScene.ts │ │ │ │ ├── domain/ │ │ │ │ │ ├── coordinates.ts │ │ │ │ │ ├── defaults.ts │ │ │ │ │ └── markerMapper.ts │ │ │ │ ├── injection/ │ │ │ │ │ ├── mapDevEvalScript.ts │ │ │ │ │ └── source/ │ │ │ │ │ ├── bridgeScript.js │ │ │ │ │ ├── cluster.js │ │ │ │ │ ├── devEvalRuntimeScript.js │ │ │ │ │ ├── iframeBootstrap.js │ │ │ │ │ ├── index.d.ts │ │ │ │ │ ├── index.js │ │ │ │ │ ├── paneStyle.js │ │ │ │ │ ├── photoCardHtml.js │ │ │ │ │ ├── popup.js │ │ │ │ │ ├── render.js │ │ │ │ │ ├── runtimeCore.js │ │ │ │ │ └── toolbar.js │ │ │ │ ├── pages/ │ │ │ │ │ └── MapPage.vue │ │ │ │ └── store.ts │ │ │ ├── onboarding/ │ │ │ │ ├── api.ts │ │ │ │ ├── pages/ │ │ │ │ │ └── OnboardingPage.vue │ │ │ │ └── types.ts │ │ │ ├── playground/ │ │ │ │ ├── components/ │ │ │ │ │ ├── ApiMethodList.vue │ │ │ │ │ ├── ApiTestPanel.vue │ │ │ │ │ ├── JsonResponseViewer.vue │ │ │ │ │ ├── ParamFormBuilder.vue │ │ │ │ │ ├── ParamFormField.vue │ │ │ │ │ ├── ParamInputPanel.vue │ │ │ │ │ └── ToastDemo.vue │ │ │ │ ├── composables/ │ │ │ │ │ ├── useApiMethods.ts │ │ │ │ │ ├── useApiTest.ts │ │ │ │ │ ├── useIntegrationTest.ts │ │ │ │ │ └── useMethodSignature.ts │ │ │ │ ├── index.ts │ │ │ │ ├── pages/ │ │ │ │ │ ├── ApiPlaygroundPage.vue │ │ │ │ │ ├── IntegrationTestPage.vue │ │ │ │ │ └── PlaygroundPage.vue │ │ │ │ ├── routes.ts │ │ │ │ └── types/ │ │ │ │ ├── index.ts │ │ │ │ └── schema.ts │ │ │ └── settings/ │ │ │ ├── api.ts │ │ │ ├── appearance.ts │ │ │ ├── backgroundPath.ts │ │ │ ├── components/ │ │ │ │ ├── AppearanceContent.vue │ │ │ │ ├── CaptureSettingsContent.vue │ │ │ │ ├── DraggableSettingsList.vue │ │ │ │ ├── ExtensionsContent.vue │ │ │ │ ├── FloatingWindowContent.vue │ │ │ │ ├── GeneralSettingsContent.vue │ │ │ │ ├── HotkeyRecorder.vue │ │ │ │ ├── HotkeySettingsContent.vue │ │ │ │ ├── OverlayPaletteEditor.vue │ │ │ │ ├── ResetSettingsDialog.vue │ │ │ │ ├── SettingsSidebar.vue │ │ │ │ └── WindowSceneContent.vue │ │ │ ├── composables/ │ │ │ │ ├── useAppearanceActions.ts │ │ │ │ ├── useExtensionActions.ts │ │ │ │ ├── useFunctionActions.ts │ │ │ │ ├── useGeneralActions.ts │ │ │ │ ├── useMenuActions.ts │ │ │ │ └── useTheme.ts │ │ │ ├── constants.ts │ │ │ ├── featuresApi.ts │ │ │ ├── overlayPalette.ts │ │ │ ├── overlayPaletteSampler.ts │ │ │ ├── pages/ │ │ │ │ └── SettingsPage.vue │ │ │ ├── store.ts │ │ │ ├── types.ts │ │ │ └── utils/ │ │ │ └── hotkeyUtils.ts │ │ ├── index.css │ │ ├── lib/ │ │ │ └── utils.ts │ │ ├── main.ts │ │ ├── router/ │ │ │ ├── guards.ts │ │ │ ├── index.ts │ │ │ └── viewTransition.ts │ │ └── types/ │ │ └── webview.d.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts └── xmake.lua