gitextract_mzu2v0jt/ ├── .dockerignore ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug-report.yml │ │ ├── config.yml │ │ ├── feature-request.yml │ │ ├── optimization.yml │ │ └── suspected-bug.yml │ └── workflows/ │ ├── close-external-prs.yml │ ├── docker-image.yml │ └── release.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── Dockerfile ├── LICENSE ├── README.md ├── apps/ │ ├── electron/ │ │ ├── README.md │ │ ├── assets/ │ │ │ └── icon.icns │ │ ├── electron-builder.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── main.ts │ │ │ ├── preload.ts │ │ │ ├── updater.ts │ │ │ └── utils/ │ │ │ ├── frontmatter.test.ts │ │ │ └── frontmatter.ts │ │ └── tsconfig.json │ ├── server/ │ │ ├── .prettierrc │ │ ├── COS_SETUP.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── nest-cli.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── app.controller.spec.ts │ │ │ ├── app.controller.ts │ │ │ ├── app.module.ts │ │ │ ├── app.service.ts │ │ │ ├── main.ts │ │ │ ├── services/ │ │ │ │ └── cos.service.ts │ │ │ └── upload/ │ │ │ ├── dto/ │ │ │ │ ├── create-upload.dto.ts │ │ │ │ └── update-upload.dto.ts │ │ │ ├── entities/ │ │ │ │ └── upload.entity.ts │ │ │ ├── upload.controller.ts │ │ │ ├── upload.module.ts │ │ │ └── upload.service.ts │ │ ├── test/ │ │ │ ├── app.e2e-spec.ts │ │ │ └── jest-e2e.json │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ └── web/ │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── package.json │ ├── public/ │ │ ├── fonts/ │ │ │ └── local-fonts.css │ │ └── libs/ │ │ └── mathjax/ │ │ └── tex-svg.js │ ├── src/ │ │ ├── App.css │ │ ├── App.tsx │ │ ├── __tests__/ │ │ │ ├── bootstrap/ │ │ │ │ └── installPreloadErrorHandler.test.ts │ │ │ ├── components/ │ │ │ │ ├── FileSystemHistory.test.tsx │ │ │ │ ├── Header.test.tsx │ │ │ │ ├── MobileToolbar.test.tsx │ │ │ │ ├── ThemePanel.test.tsx │ │ │ │ ├── mouseSelectionStyle.test.ts │ │ │ │ ├── searchPanel.test.ts │ │ │ │ ├── sortUtils.test.ts │ │ │ │ └── themeDesignerVariables.test.ts │ │ │ ├── core/ │ │ │ │ └── MarkdownParser.test.ts │ │ │ ├── hooks/ │ │ │ │ ├── useFileSystemEffectGate.test.ts │ │ │ │ ├── useFileSystemEffects.test.ts │ │ │ │ └── useWindowControls.test.ts │ │ │ ├── services/ │ │ │ │ ├── autoCompressImage.test.ts │ │ │ │ ├── cssVariableExpander.test.ts │ │ │ │ ├── htmlCopyService.test.ts │ │ │ │ ├── imageUploadFlow.integration.test.ts │ │ │ │ ├── wechatCopyCssIntegration.test.ts │ │ │ │ ├── wechatCopyNormalizer.test.ts │ │ │ │ ├── wechatCopyService.test.ts │ │ │ │ ├── wechatCounterCompat.test.ts │ │ │ │ ├── wechatMermaidRenderer.test.ts │ │ │ │ └── wechatMermaidSvgText.test.ts │ │ │ ├── storage/ │ │ │ │ └── FileSystemAdapter.test.ts │ │ │ └── utils/ │ │ │ ├── assetPath.test.ts │ │ │ ├── fileName.test.ts │ │ │ ├── markdownFileMeta.test.ts │ │ │ └── newArticleTheme.test.ts │ │ ├── bootstrap/ │ │ │ └── installPreloadErrorHandler.ts │ │ ├── components/ │ │ │ ├── Editor/ │ │ │ │ ├── MarkdownEditor.css │ │ │ │ ├── MarkdownEditor.tsx │ │ │ │ ├── SaveIndicator.tsx │ │ │ │ ├── SearchPanel.css │ │ │ │ ├── SearchPanel.tsx │ │ │ │ ├── SyntaxHelpPopover.css │ │ │ │ ├── SyntaxHelpPopover.tsx │ │ │ │ ├── Toolbar.css │ │ │ │ ├── Toolbar.tsx │ │ │ │ ├── ToolbarState.ts │ │ │ │ ├── editorShortcuts.ts │ │ │ │ ├── markdownTheme.ts │ │ │ │ ├── markdownUnderline.ts │ │ │ │ ├── mouseSelectionStyle.ts │ │ │ │ └── toolbarConfigs.ts │ │ │ ├── ErrorBoundary/ │ │ │ │ └── ErrorBoundary.tsx │ │ │ ├── Header/ │ │ │ │ ├── Header.css │ │ │ │ └── Header.tsx │ │ │ ├── History/ │ │ │ │ ├── FileSystemHistory.tsx │ │ │ │ ├── HistoryManager.tsx │ │ │ │ ├── HistoryPanel.css │ │ │ │ ├── HistoryPanel.tsx │ │ │ │ └── IndexedHistoryPanel.tsx │ │ │ ├── Preview/ │ │ │ │ ├── MarkdownPreview.css │ │ │ │ └── MarkdownPreview.tsx │ │ │ ├── Settings/ │ │ │ │ ├── ImageHostSettings.css │ │ │ │ ├── ImageHostSettings.tsx │ │ │ │ └── ImageHostSettingsPanels.tsx │ │ │ ├── Sidebar/ │ │ │ │ ├── ContextMenu.tsx │ │ │ │ ├── FileSidebar.css │ │ │ │ ├── FileSidebar.tsx │ │ │ │ ├── SidebarFooter.css │ │ │ │ ├── SidebarFooter.tsx │ │ │ │ ├── SidebarModals.tsx │ │ │ │ ├── sidebarStateHelpers.ts │ │ │ │ ├── sortUtils.ts │ │ │ │ └── useSidebarState.ts │ │ │ ├── StorageModeSelector/ │ │ │ │ ├── StorageModeSelector.css │ │ │ │ └── StorageModeSelector.tsx │ │ │ ├── Theme/ │ │ │ │ ├── ColorSelector.tsx │ │ │ │ ├── MobileThemeSelector.css │ │ │ │ ├── MobileThemeSelector.tsx │ │ │ │ ├── ThemeDesigner/ │ │ │ │ │ ├── SliderInput.tsx │ │ │ │ │ ├── Switch.tsx │ │ │ │ │ ├── VARIABLES.md │ │ │ │ │ ├── defaults.ts │ │ │ │ │ ├── generateCSS.ts │ │ │ │ │ ├── generators/ │ │ │ │ │ │ ├── codeTheme.ts │ │ │ │ │ │ ├── components.ts │ │ │ │ │ │ ├── extras.ts │ │ │ │ │ │ ├── global.ts │ │ │ │ │ │ ├── presets.ts │ │ │ │ │ │ ├── typography.ts │ │ │ │ │ │ └── variables.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── sections/ │ │ │ │ │ │ ├── CodeSection.tsx │ │ │ │ │ │ ├── GlobalSection.tsx │ │ │ │ │ │ ├── HeadingSection.tsx │ │ │ │ │ │ ├── ImageSection.tsx │ │ │ │ │ │ ├── ListSection.tsx │ │ │ │ │ │ ├── MermaidSection.tsx │ │ │ │ │ │ ├── OtherSection.tsx │ │ │ │ │ │ ├── ParagraphSection.tsx │ │ │ │ │ │ ├── QuoteSection.tsx │ │ │ │ │ │ ├── TableHrSection.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── ThemeDesigner.css │ │ │ │ ├── ThemeLivePreview.tsx │ │ │ │ ├── ThemePanel.css │ │ │ │ ├── ThemePanel.tsx │ │ │ │ └── ThemePanelView.tsx │ │ │ ├── UpdateModal/ │ │ │ │ ├── UpdateModal.css │ │ │ │ └── UpdateModal.tsx │ │ │ ├── Welcome/ │ │ │ │ ├── Welcome.css │ │ │ │ └── Welcome.tsx │ │ │ └── common/ │ │ │ ├── FloatingToolbarButton.tsx │ │ │ ├── MobileToolbar.css │ │ │ ├── MobileToolbar.tsx │ │ │ ├── Modal.css │ │ │ ├── Modal.tsx │ │ │ └── index.ts │ │ ├── config/ │ │ │ └── styleOptions.ts │ │ ├── hooks/ │ │ │ ├── useFileSystem.ts │ │ │ ├── useFileSystemEffects.ts │ │ │ ├── useFileSystemFolderActions.ts │ │ │ ├── useFileSystemHelpers.ts │ │ │ ├── useMobileView.ts │ │ │ ├── useStorage.ts │ │ │ ├── useUITheme.ts │ │ │ └── useWindowControls.ts │ │ ├── index.css │ │ ├── lib/ │ │ │ └── platformAdapter.ts │ │ ├── main.tsx │ │ ├── services/ │ │ │ ├── cssVarParser.ts │ │ │ ├── cssVariableExpander.ts │ │ │ ├── htmlCopyService.ts │ │ │ ├── image/ │ │ │ │ ├── ImageUploader.ts │ │ │ │ ├── README.md │ │ │ │ ├── autoCompressImage.ts │ │ │ │ ├── compressSearch.ts │ │ │ │ ├── imageUploadFlow.ts │ │ │ │ └── uploaders/ │ │ │ │ ├── AliyunUploader.ts │ │ │ │ ├── OfficialUploader.ts │ │ │ │ ├── QiniuUploader.ts │ │ │ │ ├── S3Uploader.ts │ │ │ │ └── TencentUploader.ts │ │ │ ├── inlineStyleVarResolver.ts │ │ │ ├── wechatCopyNormalizer.ts │ │ │ ├── wechatCopyService.ts │ │ │ ├── wechatCounterCompat.ts │ │ │ ├── wechatMermaidRenderer.ts │ │ │ ├── wechatMermaidSvgText.ts │ │ │ └── wechatTableRenderer.ts │ │ ├── storage/ │ │ │ ├── StorageAdapter.ts │ │ │ ├── StorageContext.tsx │ │ │ ├── StorageManager.ts │ │ │ ├── adapters/ │ │ │ │ ├── FileSystemAdapter.ts │ │ │ │ ├── IndexedDBAdapter.ts │ │ │ │ └── fileSystemAdapterHelpers.ts │ │ │ └── types.ts │ │ ├── store/ │ │ │ ├── editorStore.ts │ │ │ ├── fileStore.ts │ │ │ ├── fileTypes.ts │ │ │ ├── historyDb.ts │ │ │ ├── historyStore.ts │ │ │ ├── historyTypes.ts │ │ │ ├── themeStore.ts │ │ │ └── themes/ │ │ │ └── builtInThemes.ts │ │ ├── styles/ │ │ │ ├── global.css │ │ │ └── local-fonts.css │ │ ├── test/ │ │ │ └── setup.ts │ │ ├── types/ │ │ │ ├── electron.d.ts │ │ │ ├── env.d.ts │ │ │ ├── filesystem.d.ts │ │ │ └── raw-modules.d.ts │ │ └── utils/ │ │ ├── assetPath.ts │ │ ├── fileName.ts │ │ ├── findMatches.ts │ │ ├── katexRenderer.ts │ │ ├── linkFootnote.ts │ │ ├── markdownFileMeta.ts │ │ ├── mathJaxLoader.ts │ │ ├── mermaidConfig.ts │ │ ├── newArticleTheme.ts │ │ └── wordCount.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ ├── vite.config.ts │ └── vitest.config.ts ├── docker-compose.yml ├── eslint.config.mjs ├── nginx.conf ├── package.json ├── packages/ │ └── core/ │ ├── package.json │ ├── src/ │ │ ├── MarkdownParser.ts │ │ ├── ThemeProcessor.ts │ │ ├── __tests__/ │ │ │ ├── MarkdownParser.test.ts │ │ │ ├── ThemeProcessor.test.ts │ │ │ └── wechatDarkMode.test.ts │ │ ├── index.ts │ │ ├── plugins/ │ │ │ ├── markdown-it-checkbox-emoji.ts │ │ │ ├── markdown-it-github-alert.ts │ │ │ ├── markdown-it-imageflow.ts │ │ │ ├── markdown-it-li.ts │ │ │ ├── markdown-it-linkfoot.ts │ │ │ ├── markdown-it-math.ts │ │ │ ├── markdown-it-multiquote.ts │ │ │ ├── markdown-it-span.ts │ │ │ ├── markdown-it-table-container.ts │ │ │ └── markdown-it-underline.ts │ │ ├── themes/ │ │ │ ├── academic-paper.ts │ │ │ ├── aurora-glass.ts │ │ │ ├── basic.ts │ │ │ ├── bauhaus.ts │ │ │ ├── code-github.ts │ │ │ ├── custom-default.ts │ │ │ ├── cyberpunk-neon.ts │ │ │ ├── index.ts │ │ │ ├── knowledge-base.ts │ │ │ ├── luxury-gold.ts │ │ │ ├── morandi-forest.ts │ │ │ ├── neo-brutalism.ts │ │ │ ├── receipt.ts │ │ │ ├── sunset-film.ts │ │ │ └── template.ts │ │ ├── types/ │ │ │ └── markdown-it-plugins.d.ts │ │ ├── utils/ │ │ │ └── langHighlight.ts │ │ └── wechatDarkMode.ts │ ├── tsconfig.json │ └── vitest.config.ts ├── pnpm-workspace.yaml ├── scripts/ │ └── run-desktop-dev.mjs ├── templates/ │ ├── Academic-Paper.css │ ├── Aurora-Glass.css │ ├── Bauhaus.css │ ├── Cyberpunk-Neon.css │ ├── Knowledge-Base.css │ ├── Luxury-Gold.css │ ├── Morandi-Forest.css │ ├── Neo-Brutalism.css │ ├── Receipt.css │ ├── Sunset-Film.css │ └── Template.css └── turbo.json