diff --git a/MiniApp/Demo/git-graph/source/style.css b/MiniApp/Demo/git-graph/source/style.css index 4a9c0340..611feace 100644 --- a/MiniApp/Demo/git-graph/source/style.css +++ b/MiniApp/Demo/git-graph/source/style.css @@ -124,8 +124,8 @@ body { color: #fff; border-color: rgba(88,166,255,.4); } -.btn--primary:hover { background: #2d72c7; } -.btn--primary:active { background: #2563b5; } +.btn--primary:hover { background: var(--accent); } +.btn--primary:active { background: var(--accent-dim); } .btn--secondary { background: var(--bg-active); color: var(--text); @@ -229,7 +229,7 @@ body { .main { display: flex; flex: 1; min-height: 0; min-width: 0; } /* ── Graph area (commit list) ────── */ -.graph-area { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 0; } +.graph-area { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 0; background: var(--bg); } .graph-area__scroll { flex: 1; min-width: 0; diff --git a/MiniApp/Demo/git-graph/source/styles/layout.css b/MiniApp/Demo/git-graph/source/styles/layout.css index 933bcee8..866044d0 100644 --- a/MiniApp/Demo/git-graph/source/styles/layout.css +++ b/MiniApp/Demo/git-graph/source/styles/layout.css @@ -77,8 +77,8 @@ color: #fff; border-color: rgba(88,166,255,.4); } -.btn--primary:hover { background: #2d72c7; } -.btn--primary:active { background: #2563b5; } +.btn--primary:hover { background: var(--accent); } +.btn--primary:active { background: var(--accent-dim); } .btn--secondary { background: var(--bg-active); color: var(--text); @@ -182,7 +182,7 @@ .main { display: flex; flex: 1; min-height: 0; min-width: 0; } /* ── Graph area (commit list) ────── */ -.graph-area { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 0; } +.graph-area { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 0; background: var(--bg); } .graph-area__scroll { flex: 1; min-width: 0; diff --git a/README.md b/README.md index ad97aff9..808c6d64 100644 --- a/README.md +++ b/README.md @@ -1,177 +1,115 @@ [中文](README.zh-CN.md) | **English** -
+[GitHub release](https://github.com/GCWing/BitFun/releases) +[Website](https://openbitfun.com/) +[License: MIT](https://github.com/GCWing/BitFun/blob/main/LICENSE) +[Platform](https://github.com/GCWing/BitFun) -![BitFun](./png/BitFun_title.png) - -**AI assistant with personality and memory** - -Hand over the work, keep the life +--- -AI Agent workspace for coding and knowledge work +## Introduction -
-
+BitFun is an Agentic OS—and a companion right beside you. -[![GitHub release](https://img.shields.io/github/v/release/GCWing/BitFun?style=flat-square&color=blue)](https://github.com/GCWing/BitFun/releases) -[![Website](https://img.shields.io/badge/Website-openbitfun.com-6f42c1?style=flat-square)](https://openbitfun.com/) -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow?style=flat-square)](https://github.com/GCWing/BitFun/blob/main/LICENSE) -[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-blue?style=flat-square)](https://github.com/GCWing/BitFun) +It will interact through phones, watches, desktop robots, and more. It is part of your everyday life, and it evolves with you. -
+![first_screen_screenshot](./png/first_screen_screenshot.png) --- -## Introduction - -In the age of AI, true human-machine collaboration is not just a ChatBox, but a partner that understands you, works with you, keeps evolving, and gets things done anytime, anywhere. That is where BitFun begins. -BitFun is a next-generation AI assistant with built-in **Code Agent** and **Cowork Agent**. It has memory, personality, and the ability to evolve over time. You can remotely control the desktop through mobile QR pairing or Telegram / Feishu bots, send instructions, and watch each execution step in real time while the Agent keeps working in the background. +## Remote Control -Built with **Rust + TypeScript** for an ultra-lightweight, fluid, cross-platform experience. +Pair by scanning a QR code, and your phone instantly becomes a remote command center for the desktop Agent. Send one message, and the AI on the desktop starts working right away. -![BitFun](./png/first_screen_screenshot.png) +Besides the mobile browser scan, BitFun also supports Telegram / Feishu bots / WeChat bots for remote commands, with real-time visibility into Agent progress. --- ## Dual Modes -BitFun provides two modes for different kinds of work: +BitFun offers two modes for different scenarios: -- **Assistant Mode**: warmer, preference-aware, and backed by long-term memory. Best for ongoing collaboration, such as maintaining a project or preserving your writing and design style. -- **Professional Mode**: token-efficient, execution-first, and context-clean. Best for short, focused tasks like fixing a bug or updating a small feature. +- **Assistant Mode**: warm, remembers your preferences, with long-term memory. Best for ongoing collaboration—maintaining a project, continuing your aesthetic and working habits. +- **Professional Mode**: saves tokens, execution-first, clean context. Best for immediate tasks—fixing a bug, tweaking a style. --- -## Remote Control - -With QR pairing, your phone instantly becomes a remote command center for the desktop Agent. Send one message and the desktop AI starts working right away. - -The desktop generates a QR code, and the mobile browser opens the remote interface after scanning it, with no app installation required. - -Besides mobile QR pairing, BitFun also supports Telegram / Feishu bots for remote instructions and real-time progress tracking. +## Agent System -| Feature | Description | -|---|---| -| **QR Pairing** | Scan a QR code generated by the desktop, complete key exchange, and bind a long-lived connection | -| **Full Control** | View sessions, switch modes, send instructions, and control the desktop workflow remotely | -| **Real-time Streaming** | Every Agent step and tool call can be viewed live on your phone | -## Agent System +| Agent | Role | Core Capabilities | +| ---------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Personal Assistant** | Your dedicated AI companion | Long-term memory and personality; orchestrates Code / Cowork / custom Agents on demand, and can iterate and grow | +| **Code Agent** | Coding agent | Four modes: Agentic (autonomous read / edit / run / verify) / Plan (plan first, then execute) / Debug (instrument → gather evidence → root cause) / Review (repo-standard review) | +| **Cowork Agent** | Knowledge-work agent | Built-in PDF / DOCX / XLSX / PPTX; fetch and extend capability packs from the Skill marketplace as needed | +| **Custom Agent** | Domain specialist | Quickly define a domain-specific Agent with Markdown | -| Agent | Role | Core Capabilities | -|---|---|---| -| **Personal Assistant** (Beta) | Your dedicated AI companion | Long-term memory and personality settings; can orchestrate Code / Cowork / custom Agents on demand, and continuously evolve | -| **Code Agent** | Coding assistant | Four modes: Agentic (autonomous read / edit / run / verify) / Plan (plan first, then execute) / Debug (instrumentation to root cause) / Review (repository-aware code review) | -| **Cowork Agent** | Knowledge work assistant | Built-in PDF / DOCX / XLSX / PPTX handling, and can fetch and extend suitable capability packages from the Skill marketplace | -| **Custom Agent** | Domain specialist | Quickly define a domain-specific Agent with Markdown | --- ## Ecosystem -> It keeps growing. - -Mini Apps emerge from conversations, Skills evolve in the community, and Agents improve through collaboration. +> It grows on its own. -| Layer | Description | -|---|---| -| **Mini Apps** | Generate runnable interfaces from a prompt and package them into desktop apps with one click | -| **Skill Marketplace** | Install community capability packs so Agents can learn new skills quickly | -| **MCP Protocol** | Connect external tools and resources to extend Agent capabilities beyond the local system | -| **Custom Agents** | Define roles, memory, and capability boundaries with Markdown | -| **ACP Protocol (WIP)** | A structured multi-Agent communication standard for interoperating with mainstream AI tools | +Supports Skills, MCP (including MCP App), and custom Agents; also on-demand Mini Apps (from one line of requirements to a runnable UI, with one-click packaging into a desktop app). --- ## Platform Support -The project is built with Rust + TypeScript for cross-platform reuse, keeping your Agent available wherever you work. - -| Form Factor | Supported Platforms | Status | -|---|---|---| -| **Desktop** | Windows, macOS, Linux | ✅ Supported (Tauri) | -| **Remote Control** | Mobile browser, Telegram, Feishu | ✅ Supported | +Built with Tauri for Windows, macOS, and Linux; mobile control works through the phone browser, Telegram, Feishu, WeChat, and more. --- ## Quick Start -### Download and Use +### Download and use Download the latest desktop installer from [Releases](https://github.com/GCWing/BitFun/releases). After installation, configure your model and start using BitFun. -> CLI, Server, and native mobile apps are still in planning or development. Desktop and remote control are already supported. - -### Build from Source +### Build from source -Make sure you have the following prerequisites installed: +**Prerequisites:** -- Node.js (LTS recommended) -- pnpm -- Rust toolchain (install via [rustup](https://rustup.rs/)) -- [Tauri prerequisites](https://v2.tauri.app/start/prerequisites/) for desktop development +- [Node.js](https://nodejs.org/) (LTS recommended) +- [pnpm](https://pnpm.io/) +- [Rust toolchain](https://rustup.rs/) +- [Tauri prerequisites](https://v2.tauri.app/start/prerequisites/) (required for desktop development) -**Windows only**: The desktop build links against a **prebuilt** OpenSSL (no OpenSSL source compile). You do **not** need to download the ZIP by hand: the first time OpenSSL is required, tooling fetches [FireDaemon OpenSSL 3.5.5](https://download.firedaemon.com/FireDaemon-OpenSSL/openssl-3.5.5.zip) into **`.bitfun/cache/`** and later runs reuse that cache. **`pnpm run desktop:dev`** and all **`pnpm run desktop:build*`** scripts run `ensure-openssl-windows.mjs` (builds use `desktop-tauri-build.mjs`). **If you compile with plain `cargo`** (without those pnpm entrypoints), run **`node scripts/ensure-openssl-windows.mjs`** once from the repo root first — it performs the same download and prints **`OPENSSL_*`** lines for PowerShell. Override with `OPENSSL_DIR` pointing at the **`x64`** folder from the ZIP, or `BITFUN_SKIP_OPENSSL_BOOTSTRAP=1` and your own `OPENSSL_*`. +**Commands:** ```bash # Install dependencies pnpm install -# Run desktop app in development mode +# Run desktop in development mode pnpm run desktop:dev -# Build desktop app +# Build desktop pnpm run desktop:build ``` -For more details, see the [Chinese Contributing Guide](./CONTRIBUTING_CN.md). - -### Linux Build - -#### Prerequisites - -Install system dependencies: - -```bash -# Debian/Ubuntu -sudo apt install libwebkit2gtk-4.1-dev build-essential libgtk-3-dev \ - libayatana-appindicator3-dev librsvg2-dev patchelf -``` - -See [docs/linux-setup.md](docs/linux-setup.md) for other distributions (Arch, Fedora, etc.). - -#### Build - -```bash -pnpm install -pnpm run desktop:build:linux -``` - -Output will be in `src/apps/desktop/target/release/bundle/` (`.deb`, `.rpm`, `.AppImage`). +For more details, see the [Contributing guide](./CONTRIBUTING_CN.md). --- ## Contributing -We welcome great ideas and code contributions. We are maximally accepting of AI-generated code. Please submit PRs to the `dev` branch first; we will periodically review and sync to the main branch. +We welcome great ideas and code; we are maximally open to AI-generated code. Please submit PRs to the `dev` branch first; we review periodically and sync to the main branch. + +**Contribution directions we care about most:** -Key contribution areas we focus on: -1. Contributing good ideas and creativity in features, interaction, and visual design via Issues -2. Optimizing the Agent system and overall quality -3. Improving system stability and foundational capabilities -4. Expanding the ecosystem, including Skills, MCP, LSP plugins, and support for vertical development scenarios +1. Good ideas / creativity (features, interaction, visuals, etc.)—via Issues +2. Improving the Agent system and outcomes +3. Improving stability and foundational capabilities +4. Growing the ecosystem (Skills, MCP, LSP plugins, or better support for certain vertical development scenarios) --- ## Disclaimer -1. This project is built in spare time for exploring and researching next-generation human-machine collaboration, not for commercial profit. -2. 97%+ of this project was built with Vibe Coding. Feedback on code issues is also welcome, and refactoring or optimization through AI is encouraged. -3. This project depends on and references many open-source projects. Thanks to all open-source authors. **If your rights are affected, please contact us for rectification.** +1. This project is spare-time exploration and research into next-generation human–machine collaboration, not a commercial profit-making project. +2. More than 97% was built with Vibe Coding. Code feedback is welcome; refactoring and optimization via AI is encouraged. +3. This project depends on and references many open-source projects. Thanks to all open-source authors. **If your rights are affected, please contact us for remediation.** --- -
- -The world is being rewritten, and this time, we are all holding the pen. - -
diff --git a/README.zh-CN.md b/README.zh-CN.md index dd78412b..a9255a7a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,30 +1,19 @@ -**中文** | [English](README.md) +**中文** [English](README.md) [GitHub release](https://github.com/GCWing/BitFun/releases) [Website](https://openbitfun.com/) [License: MIT](https://github.com/GCWing/BitFun/blob/main/LICENSE) [Platform](https://github.com/GCWing/BitFun) - - --- ## 简介 -AI 时代,真正的人机协同不是简单的 ChatBox,而是一个懂你、陪你、自我成长并且随时随地替你做事的伙伴。BitFun 的探索,从这里开始。 +BitFun 是一个Agentic OS,更是你亲密无间的伙伴。 -BitFun 是一款内置 **Code Agent** 与 **Cowork Agent** 的新一代 AI 助理,有记忆、有个性,能自我迭代。可通过手机扫码或 Telegram / 飞书 Bot 随时遥控桌面端——下达指令、实时查看每一步执行过程,让 Agent 在后台替你做事。 +它将能够通过手机、手表、桌面机器人等多样的方式进行交互,它在你的生活中无处不在,它会根据你来进行自我迭代。 -BitFun 产品界面 - ---- - -## 双模式协同 - -BitFun 提供两种模式,适配不同场景需求: - -- **助理模式(Assistant Mode)**:有温度,记住偏好,具备长期记忆。适合持续协作类任务,如维护项目、延续你的审美与工作习惯。 -- **专业模式(Professional Mode)**:省 token,直达执行,干净上下文。适合即时执行类任务,如修一个 bug、改一处样式。 +![first_screen_screenshot](./png/first_screen_screenshot_CN.png) --- @@ -32,24 +21,23 @@ BitFun 提供两种模式,适配不同场景需求: 扫码配对,手机即刻变成桌面 Agent 的远程指挥中心。一条消息,桌面上的 AI 立刻开始工作。 -桌面端生成二维码,手机浏览器扫码打开即可使用,无需安装 App。 +除手机浏览器扫码外,也支持接入 Telegram / 飞书 Bot/ 微信 Bot 远程下达指令,并实时查看 Agent 的执行进度。 -除手机扫码外,也支持接入 Telegram / 飞书 Bot 远程下达指令,并实时查看 Agent 的执行进度。 +## 双模式协同 +BitFun 提供两种模式,适配不同场景需求: -| 特性 | 说明 | -| -------- | --------------------------- | -| **扫码配对** | 扫描桌面端二维码,密钥交换完成,一次绑定长期连接 | -| **完整遥控** | 查看会话列表、切换模式、下达指令,桌面端一切尽在掌控 | -| **实时推流** | Agent 执行的每一步、每个工具调用,手机端实时可见 | +- **助理模式(Assistant Mode)**:有温度,记住偏好,具备长期记忆。适合持续协作类任务,如维护项目、延续你的审美与工作习惯。 +- **专业模式(Professional Mode)**:省 token,直达执行,干净上下文。适合即时执行类任务,如修一个 bug、改一处样式。 +--- ## Agent 体系 | Agent | 定位 | 核心能力 | | ---------------- | ---------- | ----------------------------------------------------------------------- | -| **个人助理**(Beta) | 你专属的 AI 伙伴 | 长期记忆、个性设定;按需调度 Code / Cowork / 自定义 Agent,并可自我迭代成长 | +| **个人助理** | 你专属的 AI 伙伴 | 长期记忆、个性设定;按需调度 Code / Cowork / 自定义 Agent,并可自我迭代成长 | | **Code Agent** | 代码代理 | 四种模式:Agentic(自主读改跑验证)/ Plan(先规划后执行)/ Debug(插桩取证→根因定位)/ Review(基于仓库规范审查) | | **Cowork Agent** | 知识工作代理 | 内置 PDF / DOCX / XLSX / PPTX 处理,可从 Skill 市场按需获取和扩展能力包 | | **自定义 Agent** | 垂域专家 | 通过 Markdown 快速定义专属领域 Agent | @@ -59,30 +47,13 @@ BitFun 提供两种模式,适配不同场景需求: > 它会自己成长。 -Mini Apps 从对话中涌现,Skills 在社区里更新,Agent 在协作中进化。 - - -| 扩展层 | 说明 | -| --------------- | -------------------------------------- | -| **Mini Apps** | 从一句需求生成可运行界面,并可一键打包成桌面应用 | -| **Skills 市场** | 安装社区能力包,让 Agent 快速获得新技能 | -| **MCP 协议** | 接入外部工具和资源,把 Agent 的能力延伸到系统之外 | -| **自定义 Agent** | 用 Markdown 定义角色、记忆和能力范围 | -| **ACP 协议(WIP)** | 结构化多 Agent 通信标准,让 BitFun 与主流 AI 工具互联协作 | - +支持 Skill、MCP(包含MCP App)、自定义Agent,此外还支持即用即生的Mini App(从一句需求生成可运行界面,并可一键打包成桌面应用) --- ## 平台支持 -项目采用 Rust + TypeScript 技术栈,支持跨平台和多形态复用,确保你的 Agent 助理随时在线、随处可达。 - - -| 形态 | 支持平台 | 状态 | -| ----------- | ----------------- | ------------- | -| **Desktop** | Windows、macOS | ✅ 已支持 (Tauri) | -| **远程控制** | 手机浏览器、Telegram、飞书 | ✅ 已支持 | - +项目采用tauri,支持Windows、macOS、Linux,同时支持移动控制手机浏览器、Telegram、飞书、微信等。 --- @@ -92,8 +63,6 @@ Mini Apps 从对话中涌现,Skills 在社区里更新,Agent 在协作中进 在 [Releases](https://github.com/GCWing/BitFun/releases) 页面下载最新桌面端安装包,安装后配置模型即可开始使用。 -> CLI、Server 和原生移动 App 仍在规划或开发中;当前已支持桌面端与远程控制能力。 - ### 从源码构建 **前置依赖:** @@ -103,7 +72,7 @@ Mini Apps 从对话中涌现,Skills 在社区里更新,Agent 在协作中进 - [Rust 工具链](https://rustup.rs/) - [Tauri 前置依赖](https://v2.tauri.app/start/prerequisites/)(桌面端开发需要) -**Windows 特别说明**:桌面使用**预编译 OpenSSL**(不编译 OpenSSL 源码)。**无需手动下载 ZIP**:首次需要时会自动拉取 [FireDaemon OpenSSL 3.5.5](https://download.firedaemon.com/FireDaemon-OpenSSL/openssl-3.5.5.zip) 到 `.bitfun/cache/`,之后复用缓存。`pnpm run desktop:dev` 与全部 `desktop:build`* 会调用 `ensure-openssl-windows.mjs`(构建经 `desktop-tauri-build.mjs`)。**若只用** `cargo` **手动编译**(不经过上述 pnpm 入口),请先在仓库根目录执行一次 `node scripts/ensure-openssl-windows.mjs`,脚本会完成相同下载并打印可在 PowerShell 中粘贴的 `OPENSSL_`* 环境变量。也可自行将 `OPENSSL_DIR` 设为 ZIP 内 `x64` 目录,或设 `BITFUN_SKIP_OPENSSL_BOOTSTRAP=1` 并自行配置 `OPENSSL_*`。 +**运行指令:** ```bash # 安装依赖 @@ -141,7 +110,3 @@ pnpm run desktop:build --- - - -世界正在被改写,这一次,你我皆是执笔人 - diff --git a/png/first_screen_screenshot-zh-CN.png b/png/first_screen_screenshot-zh-CN.png deleted file mode 100644 index 6bc8131a..00000000 Binary files a/png/first_screen_screenshot-zh-CN.png and /dev/null differ diff --git a/png/first_screen_screenshot.png b/png/first_screen_screenshot.png index 8931e01a..0ce4857a 100644 Binary files a/png/first_screen_screenshot.png and b/png/first_screen_screenshot.png differ diff --git a/png/first_screen_screenshot_CN.png b/png/first_screen_screenshot_CN.png new file mode 100644 index 00000000..451f037b Binary files /dev/null and b/png/first_screen_screenshot_CN.png differ diff --git a/src/web-ui/src/component-library/components/Modal/Modal.tsx b/src/web-ui/src/component-library/components/Modal/Modal.tsx index dc3ba1e6..45c161ed 100644 --- a/src/web-ui/src/component-library/components/Modal/Modal.tsx +++ b/src/web-ui/src/component-library/components/Modal/Modal.tsx @@ -18,6 +18,10 @@ export interface ModalProps { /** Extra class on `.modal__content` (e.g. flex layout for scroll regions inside children) */ contentClassName?: string; showCloseButton?: boolean; + /** When false, clicks on the backdrop do not call onClose. Default true. */ + closeOnOverlayClick?: boolean; + /** Extra class on `.modal-overlay` (stacking / theme hooks for specific dialogs only). */ + overlayClassName?: string; draggable?: boolean; resizable?: boolean; placement?: 'center' | 'bottom-left' | 'bottom-right'; @@ -33,6 +37,8 @@ export const Modal: React.FC = ({ contentInset = false, contentClassName, showCloseButton = true, + closeOnOverlayClick = true, + overlayClassName, draggable = false, resizable = false, placement = 'center', @@ -246,7 +252,16 @@ export const Modal: React.FC = ({ } : {}; return createPortal( -
+
= ({ title={t('ssh.remote.title') || 'SSH Remote'} size="medium" showCloseButton + closeOnOverlayClick={false} + overlayClassName="ssh-connection-dialog__modal-overlay" contentClassName="modal__content--fill-flex" >
diff --git a/src/web-ui/src/flow_chat/components/ChatInput.scss b/src/web-ui/src/flow_chat/components/ChatInput.scss index d23dd56f..01dc915d 100644 --- a/src/web-ui/src/flow_chat/components/ChatInput.scss +++ b/src/web-ui/src/flow_chat/components/ChatInput.scss @@ -145,8 +145,7 @@ &:empty::before { display: block; - color: var(--color-text-primary); - opacity: 0.6; + color: color-mix(in srgb, var(--color-text-muted) 52%, transparent); font-size: var(--flowchat-font-size-base); line-height: 24px; text-align: center; @@ -164,8 +163,7 @@ width: 100%; font-size: var(--flowchat-font-size-sm); line-height: 24px; - color: var(--color-text-muted); - opacity: 0.62; + color: color-mix(in srgb, var(--color-text-muted) 48%, transparent); white-space: nowrap; pointer-events: none; letter-spacing: 0.01em; @@ -220,7 +218,7 @@ } &:hover .bitfun-chat-input__space-hint { - opacity: 0.9; + color: color-mix(in srgb, var(--color-text-muted) 62%, transparent); } &.bitfun-chat-input--pet-visible { @@ -238,7 +236,8 @@ } &:hover .bitfun-chat-input__space-hint { - opacity: 0.88; + opacity: 1; + color: color-mix(in srgb, var(--color-text-muted) 58%, transparent); } &.bitfun-chat-input--pet-split-send.bitfun-chat-input--processing { diff --git a/src/web-ui/src/flow_chat/components/RichTextInput.scss b/src/web-ui/src/flow_chat/components/RichTextInput.scss index dccb87f8..83697a8d 100644 --- a/src/web-ui/src/flow_chat/components/RichTextInput.scss +++ b/src/web-ui/src/flow_chat/components/RichTextInput.scss @@ -27,7 +27,7 @@ &:empty::before { content: attr(data-placeholder); - color: var(--color-text-muted); + color: color-mix(in srgb, var(--color-text-muted) 52%, transparent); pointer-events: none; animation: rich-text-placeholder-fade-in 0.25s ease-out; } @@ -54,12 +54,12 @@ } -// Improve placeholder contrast in light theme. +// Light theme: placeholder slightly softer than body text. :root[data-theme="light"] .rich-text-input, :root[data-theme-type="light"] .rich-text-input, .light .rich-text-input { &:empty::before { - color: var(--color-text-secondary, #6b7280); + color: color-mix(in srgb, var(--color-text-secondary, #6b7280) 48%, transparent); } } diff --git a/src/web-ui/src/infrastructure/theme/presets/slate-theme.ts b/src/web-ui/src/infrastructure/theme/presets/slate-theme.ts index f8fe069c..2aabcea7 100644 --- a/src/web-ui/src/infrastructure/theme/presets/slate-theme.ts +++ b/src/web-ui/src/infrastructure/theme/presets/slate-theme.ts @@ -10,7 +10,10 @@ export const bitfunSlateTheme: ThemeConfig = { description: 'Slate gray geometric theme - Deep immersion, high contrast grayscale aesthetics', author: 'BitFun Team', version: '1.3.0', - + + layout: { + sceneViewportBorder: false, + }, colors: { background: { diff --git a/src/web-ui/src/tools/editor/meditor/components/EditArea.scss b/src/web-ui/src/tools/editor/meditor/components/EditArea.scss index 90f658b9..7e3f9d27 100644 --- a/src/web-ui/src/tools/editor/meditor/components/EditArea.scss +++ b/src/web-ui/src/tools/editor/meditor/components/EditArea.scss @@ -14,7 +14,8 @@ background: transparent; color: inherit; - &:focus { + &:focus, + &:focus-visible { border: none !important; outline: none !important; box-shadow: none !important; diff --git a/src/web-ui/src/tools/editor/meditor/components/MEditor.scss b/src/web-ui/src/tools/editor/meditor/components/MEditor.scss index 48cfcdda..cb72d985 100644 --- a/src/web-ui/src/tools/editor/meditor/components/MEditor.scss +++ b/src/web-ui/src/tools/editor/meditor/components/MEditor.scss @@ -3,7 +3,7 @@ .m-editor { display: flex; flex-direction: column; - border-radius: $size-radius-base; + border-radius: 0; overflow: hidden; &-toolbar { @@ -17,6 +17,7 @@ flex: 1; display: flex; overflow: hidden; + border-radius: 0; } &-edit-panel, @@ -24,6 +25,7 @@ &-ir-panel { flex: 1; overflow: hidden; + border-radius: 0; } &-mode-split { diff --git a/src/web-ui/src/tools/editor/meditor/components/TiptapEditor.scss b/src/web-ui/src/tools/editor/meditor/components/TiptapEditor.scss index 70d56231..5d2572f3 100644 --- a/src/web-ui/src/tools/editor/meditor/components/TiptapEditor.scss +++ b/src/web-ui/src/tools/editor/meditor/components/TiptapEditor.scss @@ -11,6 +11,15 @@ height: 100%; overflow-y: auto; padding: $size-gap-4; + border-radius: 0; + + /* Single contenteditable surface: suppress global :focus-visible ring on the whole editor */ + [contenteditable='true']:focus, + [contenteditable='true']:focus-visible { + outline: none !important; + outline-offset: 0 !important; + box-shadow: none !important; + } .ProseMirror { min-height: 100%; @@ -23,7 +32,7 @@ > [data-block-id]:not(hr) { margin-bottom: $size-gap-2; padding: $size-gap-2; - border-radius: $size-radius-base; + border-radius: 0; transition: background $motion-base $easing-standard; &:hover {