docs: clarify AI model capabilities in README and optimize button tooltip bundle
This commit is contained in:
1 parent
87705fd493
commit
37b1631ed5
6 files changed
+44
-9
No files matched your search
@@ -39,7 +39,7 @@ The public demo resets every day at 3:00 AM (China Standard Time) and restores s
|
||||
- **Open Data, No Vendor Lock-in**: Built on standard SQLite with complete REST API, MCP, and CLI access. Your knowledge is stored transparently and accessible anytime without being locked to a single app.
|
||||
- **Lossless ZIP Backup & Portability**: Export your complete library as a clean archive containing Markdown, Front Matter, nested folders, relative attachment links, and version histories for instant restoration anywhere.
|
||||
- **Native AI Agent Synergy**: Deep integration with Model Context Protocol (MCP) allows AI tools like Claude Code, Codex, and Antigravity to read, organize, and summarize your notes, or sync seamlessly with Notion and Feishu Bitable.
|
||||
- **Bring Your Own AI Models**: Add multiple OpenAI-compatible model services, third-party API relays, and model aggregation platforms.
|
||||
- **Bring Your Own AI Models**: Connect OpenAI, Anthropic, or Gemini-compatible services and third-party API relays to empower your editor with smart note summarization, key point extraction, proofreading, translation, and text continuation on full notes or selected text.
|
||||
- **Unlimited Multi-Device Sync**: No commercial device caps or paywalls. Enjoy seamless synchronization across PC, tablet, and mobile via web, PWA, or browser.
|
||||
- **Classic Three-Pane Layout & Focus Mode**: Clean navigation featuring notebook trees, note lists, and an expansive editor, with a desktop focus mode to eliminate distractions.
|
||||
- **Unlimited Nested Notebooks**: Organize your knowledge with arbitrary folder depth.
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ EdgeEver 是一款现代化的开源笔记工作区。它为你找回经典印
|
||||
- **数据开放,不设围墙**:基于标准 SQLite 存储,提供 REST API、MCP 与 CLI 接口。数据随时可读可导,不再担心被任何特定平台绑定。
|
||||
- **无损 ZIP 打包与无缝迁移**:一键打包导出包含 Markdown、Front Matter、嵌套目录及附件的完整档案,同时保留历史版本与结构化数据,方便在不同实例间完整还原。
|
||||
- **原生 AI Agent 智脑联动**:内置 MCP(Model Context Protocol)协议,支持 Claude Code、Codex、Antigravity 等 AI 助手直接读取与整理笔记,也可与 Notion Database、飞书多维表格轻松打通。
|
||||
- **接入自己的 AI 模型**:可添加多个 OpenAI 兼容的模型服务、第三方中转站与模型聚合平台。
|
||||
- **接入自己的 AI 模型**:支持添加多个 OpenAI、Anthropic、Gemini 兼容服务与第三方中转平台,在编辑器中随时对全文或选区进行智能总结、要点提炼、语法校对、翻译与续写润色。
|
||||
- **多端无缝同步,无设备限制**:自托管数据无商业限制,摆脱免费账号仅限 2 台设备的束缚,在 PC、平板与手机上随心同步。
|
||||
- **经典三栏布局与专注模式**:笔记本树、笔记列表与编辑区一目了然;桌面端一键开启专注模式,让思绪尽情铺满屏幕。
|
||||
- **无限层级笔记本**:轻松构建清晰的多级目录结构。
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
import type { ReactNode } from "react";
|
||||
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./tooltip";
|
||||
|
||||
interface ButtonTooltipProps {
|
||||
children: ReactNode;
|
||||
title: string;
|
||||
}
|
||||
|
||||
export const ButtonTooltip = ({ children, title }: ButtonTooltipProps) => (
|
||||
<TooltipProvider delayDuration={0} skipDelayDuration={0}>
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>{children}</TooltipTrigger>
|
||||
<TooltipContent side="bottom">{title}</TooltipContent>
|
||||
</Tooltip>
|
||||
</TooltipProvider>
|
||||
);
|
||||
@@ -1,9 +1,12 @@
|
||||
import { cn } from "@/lib/utils";
|
||||
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
|
||||
import { Slot } from "@radix-ui/react-slot";
|
||||
import { cva, type VariantProps } from "class-variance-authority";
|
||||
import * as React from "react";
|
||||
|
||||
const ButtonTooltip = React.lazy(() =>
|
||||
import("./button-tooltip").then((module) => ({ default: module.ButtonTooltip }))
|
||||
);
|
||||
|
||||
const buttonVariants = cva(
|
||||
"inline-flex shrink-0 items-center justify-center rounded-md font-medium transition-[color,background-color,border-color,box-shadow,transform] duration-150 active:scale-[0.98] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500/70 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
||||
{
|
||||
@@ -51,12 +54,9 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
||||
}
|
||||
|
||||
return (
|
||||
<TooltipProvider delayDuration={0} skipDelayDuration={0}>
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>{button}</TooltipTrigger>
|
||||
<TooltipContent side="bottom">{title}</TooltipContent>
|
||||
</Tooltip>
|
||||
</TooltipProvider>
|
||||
<React.Suspense fallback={button}>
|
||||
<ButtonTooltip title={title}>{button}</ButtonTooltip>
|
||||
</React.Suspense>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
@@ -343,6 +343,13 @@ export default defineConfig({
|
||||
test: /node_modules[\\/]lucide-react[\\/]/,
|
||||
priority: 18,
|
||||
},
|
||||
{
|
||||
name: "vendor-radix-slot",
|
||||
test: /node_modules[\\/]@radix-ui[\\/](?:react-slot|react-compose-refs)[\\/]/,
|
||||
priority: 17,
|
||||
// Button needs Slot in the app shell. Keep this tiny primitive
|
||||
// separate from overlays that are loaded with lazy screens.
|
||||
},
|
||||
{
|
||||
name: "vendor-radix",
|
||||
test: /node_modules[\\/](@radix-ui|cmdk|vaul)[\\/]/,
|
||||
@@ -376,6 +383,16 @@ export default defineConfig({
|
||||
priority: 13,
|
||||
maxSize: TARGET_VENDOR_CHUNK_BYTES,
|
||||
},
|
||||
{
|
||||
name: "ui-button",
|
||||
test: /src[\\/]components[\\/]ui[\\/]button\.tsx$/,
|
||||
priority: 12,
|
||||
},
|
||||
{
|
||||
name: "ui-button-tooltip",
|
||||
test: /src[\\/]components[\\/]ui[\\/]button-tooltip\.tsx$/,
|
||||
priority: 12,
|
||||
},
|
||||
{
|
||||
name: "ui-primitives",
|
||||
test: /src[\\/]components[\\/]ui[\\/]/,
|
||||
|
||||
@@ -37,6 +37,8 @@ assert.ok(precacheBytes <= PRECACHE_BUDGET, `PWA precache budget exceeded: ${pre
|
||||
const modulePreloads = indexHtml.match(/<link rel="modulepreload"[^>]+>/g)?.join("\n") ?? "";
|
||||
const initialOptionalPattern = /vendor-code-highlight|vendor-D3|beautiful-mermaid|vendor-(?:mermaid|tiptap|prosemirror|floating)|ui-primitives|mermaid\.core|[^"']*Diagram-/;
|
||||
assert.doesNotMatch(modulePreloads, initialOptionalPattern, "Optional editor and diagram chunks must remain out of the initial HTML modulepreload list");
|
||||
assert.doesNotMatch(modulePreloads, /ui-button-tooltip/, "Button tooltips must load only when a titled button is rendered");
|
||||
assert.doesNotMatch(modulePreloads, /vendor-radix(?!-slot)/, "Radix overlays must remain out of the initial HTML modulepreload list");
|
||||
const initialModulePreloadBytes = [...indexHtml.matchAll(/<link rel="modulepreload"[^>]+href="([^"]+)"[^>]*>/g)]
|
||||
.map((match) => statSync(join(distDirectory, match[1].replace(/^\//, ""))).size)
|
||||
.reduce((total, size) => total + size, 0);
|
||||
|
||||
Reference in new issue
Block a user