knight-ui 1.1.6 → 1.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -20
- package/component/ai/AIChatDialogue.d.ts +2 -2
- package/component/ai/AIChatInput.d.ts +2 -2
- package/component/plus/Chat.d.ts +2 -1
- package/component/plus/CodeEditor.d.ts +4 -3
- package/component/plus/CodeHighlight.d.ts +3 -2
- package/component/plus/JsonViewer.d.ts +3 -2
- package/component/tokens/codeTheme.d.ts +26 -0
- package/component/tokens/index.d.ts +3 -2
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/tokens/tokens.css +32 -19
package/README.md
CHANGED
|
@@ -151,7 +151,7 @@ Knight-UI 通过 CSS 自定义属性(CSS Variables)实现主题系统。在
|
|
|
151
151
|
|
|
152
152
|
> **例外:内容色板(`--ku-content-*`)不带 fallback** —— 它由 JS 按主题现值拼进内联样式(`rgb(var(--ku-content-blue))`),写不了兜底:过期的兜底会静默画出**旧主题**(表现成"主题切换失灵"),而缺失的兜底立刻可见。因此 `tokens.css` 必须被引入,见下。
|
|
153
153
|
|
|
154
|
-
> **亮色主题状态**:色阶、语义重绑、缺失/写反的覆盖都已就位 —— 包括 `--ku-color-glass-menu` 与 `--ku-color-mask` 两处此前会继承暗色值、导致亮色下弹层是一块暗板 / 遮罩压过头的**真 bug**;`Monaco`
|
|
154
|
+
> **亮色主题状态**:色阶、语义重绑、缺失/写反的覆盖都已就位 —— 包括 `--ku-color-glass-menu` 与 `--ku-color-mask` 两处此前会继承暗色值、导致亮色下弹层是一块暗板 / 遮罩压过头的**真 bug**;`Monaco` 的代码面则刻意**不跟随**本库主题(代码区底固定 `#131620`,见「代码面」一节)。语义与方向现在在两个主题下都成立。**表面分档与玻璃分档都已重推过一轮**(见下方「亮色的表面分档」与「亮色的玻璃分档」),阴影重量也在同一轮补了亮色值。**已知缺口三处**:① `Markdown` 的代码块仍注入仅暗色的 highlight.js 样式表(亮色下浅底浅字,需第二份样式表);② 玻璃在**浅色内容**上方的对比度——这是暗色侧的问题,本轮按范围只重标了亮色,见「亮色的玻璃分档」末尾的实测表;③ 亮色 `--ku-color-glass-tip` 的 α 现在停在 `.40`(沿革 `.48 → .38 → .28 → .40`,见「气泡的第二轮」),压在近黑内容上约 **`3.7:1`**,**仍低于 WCAG AA 正文下限**(`4.5`)——这是一处有意接受的、尚未收回的缺口,收回办法是把 `tip` 抬到 `.46–.48`。更早一轮里还把五个 `--ku-blur-*` 的半径整体砍半(`22/30/40/48/36` → `10/14/18/22/16px`)——**半径是两个主题共用的,所以暗色的玻璃也一起变清了**,见「同一轮的第二步」。
|
|
155
155
|
|
|
156
156
|
### Token 总览
|
|
157
157
|
|
|
@@ -166,7 +166,7 @@ Knight-UI 通过 CSS 自定义属性(CSS Variables)实现主题系统。在
|
|
|
166
166
|
| `--ku-color-bg-0` … `--ku-color-bg-3` | 背景阶(0 最深) |
|
|
167
167
|
| `--ku-color-fill-0` … `--ku-color-fill-3` | 交互面填充阶(输入框底、悬停底、滚动条) |
|
|
168
168
|
| `--ku-color-border` | 描边色 |
|
|
169
|
-
| `--ku-color-chat-surface` |
|
|
169
|
+
| `--ku-color-chat-surface` | **对话区 / 代码区**共用的一档底,由 `.ku-chat-surface` 消费(`AIChatDialogue` / `AIChatInput` / `Chat` / `CodeEditor` / `CodeHighlight` / `JsonViewer`)。**不透明**,取灰阶**第 1 档**:只声明一次 `rgb(var(--ku-grey-1))`,两个主题各取自己那份(暗 `#131620` / 亮 `#f5f6f8`),两边都恰好比 `bg-0` 亮一档(而 `bg-0` 的落点两个主题不同:暗第 0 档 / 亮第 2 档)。见下方「对话区的面」 |
|
|
170
170
|
| `--ku-color-link` | 链接色(与 `primary` 同档;需要 hover/active 直接用 primary 家族) |
|
|
171
171
|
| `--ku-color-fill-translucent` / `-hover` | 半透明填充(玻璃面上的条纹/悬停底;用不透的 `fill-*` 会把玻璃糊死) |
|
|
172
172
|
| `--ku-color-fill-translucent-strong` | 半透明填充的第二档(0.06)。给**必须读得出来**的静态带子用——目前只有代码三件套的工具条。0.03 那一档的定位是"叠在已有底上的极浅着色",暗色下够用,亮色下只有约 2/255,工具条会整条消失。值与 `-hover` 相同但**角色不同**,故独立命名(调 hover 的深浅不该顺手把工具条挪走)。 |
|
|
@@ -286,16 +286,16 @@ Token(`--ku-color-glass` / `-strong` / `-head`、`--ku-blur-base` … `-xl`)
|
|
|
286
286
|
>
|
|
287
287
|
> **"颗粒太粗"要调的是 `baseFrequency` 和 `numOctaves`,不是 `opacity`,也不是把颗粒关掉。** 粗细由 `baseFrequency` 定(贴图 140 用户单位 = 140 CSS px,故基本颗粒 = `1/f` CSS px):现值 `f = 1.0` 是**不越过像素栅格的前提下能取到的最细**,再往上抬只是把细节推到像素以下,1× 下就已走样、缩放时更明显。`numOctaves` 取 `1`(只留基频):每多一阶频率翻倍、振幅减半,而**每一阶都会在放大时长出新细节**——分形噪声越放大越细是它的本性。这正是**画布场景**暴露的问题:ReactFlow 用 `transform: scale()` 缩放(不是页面缩放那套"按新分辨率重画"),贴图被整体放大,于是 1× 下渲染不出来的高阶细节全冒出来,观感就是"磨砂面的颗粒突然变得很重"。只留基频后,放大只把现有颗粒等比放大,不会凭空长新的。代价是少了泛音阶、对比度降一档——嫌淡先抬 `opacity`,**不要**把 `numOctaves` 加回去。这条治不了"放大后颗粒变大"(那是整张贴图被跟着放大),只能靠抵消缩放。
|
|
288
288
|
|
|
289
|
-
**哪些面刻意不玻璃化**:`Markdown` 的**面板**是玻璃,但它块内的代码块 `pre` 保持不透明的 `bg-1`——`pre` 是嵌在玻璃面**里面**的一块内嵌面,跟着玻璃化就是玻璃套玻璃(使用前提 3
|
|
289
|
+
**哪些面刻意不玻璃化**:`Markdown` 的**面板**是玻璃,但它块内的代码块 `pre` 保持不透明的 `bg-1`——`pre` 是嵌在玻璃面**里面**的一块内嵌面,跟着玻璃化就是玻璃套玻璃(使用前提 3),语法高亮色板也校准在实色暗底上,所以它读成一块实心内嵌面。同理不玻璃化的还有:**代码面三件套**(`CodeEditor` / `CodeHighlight` / `JsonViewer`,改挂 `.ku-chat-surface`,因为 Monaco 把外框盖住了,玻璃挂着只是白付一次 `backdrop-filter`)、`Lottie` / `AudioPlayer` / `VideoPlayer` 的"暂无内容"占位框(`fill-0` + 虚线边,是"这里没有东西"的示意而非面板),以及 `VideoPlayer` 的播放舞台与中央播放键(`#000` 与 rgba 黑白蒙层,校准在视频画面上而不是页面上)。
|
|
290
290
|
|
|
291
|
-
**代码面(`CodeEditor` / `CodeHighlight` / `JsonViewer
|
|
291
|
+
**代码面(`CodeEditor` / `CodeHighlight` / `JsonViewer`)**:**底色是本库灰阶第 1 档 `#131620`,语法配色整套继承 Monaco 自带的 `vs-dark`。** 三个组件挂 `.ku-chat-surface`(不透明面,与对话区同一档,见「对话区的面」),代码区的底由一个只覆盖**一个槽位**的小主题 `ku-code` 提供(`editor.background` → `#131620`,其余全部 `inherit`,见 `tokens/codeTheme.ts`)。`theme` prop 默认值就是这个 `"ku-code"`,仍可显式传 `"vs-dark"` / `"light"` / `"hc-black"` 回到未改底的那一套。
|
|
292
292
|
|
|
293
|
-
-
|
|
294
|
-
-
|
|
295
|
-
- 改造前那次"把 49 个手抄十六进制值逐槽位换成本库色板"的做法已整体撤销,**现在源码里没有任何复制的颜色值**,随之消失的还有那批手抄值与 token 真值之间的漂移(旧值里 `fill-2` 抄的是 `#2f3440`、`bg-2` 抄的是阶梯化之前的 `#14161f`)。**"读已解析颜色"的那一族导出也已一并剪掉**(`readToken` / `readTokens` / `readTriplet` / `rgb` / `hex` / `valueToHex` / `currentTheme` / `contentStep` / `contentColor` / `contentHex`)—— 它们服务的两个消费者都不在了:内容色板靠 `rgb(var(--ku-content-blue))`
|
|
293
|
+
- **代码面的底固定,不随本库的明暗主题变化。** 一整套会翻面的自定义主题(`ku-dark` / `ku-light`,`base` 分别是 `vs-dark` / `vs`)曾经存在过,切换主题时代码配色会**整套从暗翻到亮**——观感上像是编辑器被换掉了,而不是主题在变。所以那两个主题连同 `tokens/monacoTheme.ts` 与 `KU_MONACO_THEME` 导出已移除。**现在的 `ku-code` 不是它们回来了**:它不注册两套、也不翻面,只换底。**底也不能跟着 `--ku-grey-1` 翻转**——亮色的 `grey-1` 是 `#f5f6f8`(近白),而 `vs-dark` 的语法色(`#9cdcfe` / `#dcdcaa` / `#ce9178`…)是给深底配的浅色,铺在近白底上会大面积糊掉。所以那个底色在 `codeTheme.ts` 里是**写死的字面量**:Monaco 的 `colors` 只吃 `#RRGGBB`,CSS 变量在这里无效——与它 options 里 `fontSize` 只吃数字是同一类限制。
|
|
294
|
+
- **代价:亮色主题下代码面仍是一块深色面板。** 它铺的是固定的 `#131620`,在浅色页面里读成一块稳定的深色代码块。这是"代码区在两个主题下长得一样"的直接交换条件。顺带把外框从 `.ku-glass` 换成了实色面:玻璃在代码面里本来就看不见(下面的 Monaco 铺的是不透明底,把外框整个盖住),挂着只是白付一次 `backdrop-filter`。
|
|
295
|
+
- 改造前那次"把 49 个手抄十六进制值逐槽位换成本库色板"的做法已整体撤销,**现在源码里没有任何复制的颜色值**,随之消失的还有那批手抄值与 token 真值之间的漂移(旧值里 `fill-2` 抄的是 `#2f3440`、`bg-2` 抄的是阶梯化之前的 `#14161f`)。**"读已解析颜色"的那一族导出也已一并剪掉**(`readToken` / `readTokens` / `readTriplet` / `rgb` / `hex` / `valueToHex` / `currentTheme` / `contentStep` / `contentColor` / `contentHex`)—— 它们服务的两个消费者都不在了:内容色板靠 `rgb(var(--ku-content-blue))` 这样的字符串拼装就够,而代码面那边只需要往 `colors` 里写一个 `#RRGGBB` 字面量、根本不读 CSS 值。所以 `tokens/index.ts` 现在只剩 `contentVar` / `contentTintVar` 两个函数,**一个色值都不存**。真要再给别的槽位换回本库色板,得把那套解析(`getComputedStyle` + 展开嵌套 `var()` + 转 `#RRGGBBAA`,约 70 行)重新写一遍;同时 `palette.gen.ts`(色板的 JS 常量镜像,原本给 SSR 兜底)也从生成器里删掉了,所以连"不依赖 document 的兜底三元组"都没有现成来源。
|
|
296
296
|
- **已知缺口:`Markdown` 的代码块仍是仅暗色的 highlight.js 样式表**(见「哪些面刻意不玻璃化」)。它现在与代码面的取向一致了——两者都是暗色高亮压在各自的面板上——但亮色下周围是浅色面板、块内是暗色语法色,仍需第二份样式表才能对齐。
|
|
297
297
|
|
|
298
|
-
工具条(语言切换 +
|
|
298
|
+
工具条(语言切换 + 格式化/复制)是这块面**内部**的带子,改用 `--ku-color-fill-translucent-strong` 压一档 + 一条下边框——与 `Chat` 输入区同一套两级半透。**这里必须是 `-strong`(0.06)而不是 `-translucent`(0.03)**:两个值都是"中性膜叠在本面底上",`--ku-grey-9` 随主题翻转,所以在亮色面板底 `#f5f6f8` 上按 `rgba(28, 31, 35, α)` 合成,`.03` 只有约 **6/255**、`.06` 约 **13/255**。(本节早先记过 `.03` 在亮色下"约 2/255"——那是外框还是玻璃时的数:玻璃膜先把带子往页面方向抬,余下的净差才 2/255,症状是"页面从代码块上方漏了出来"。外框换成实色面之后这个抵消没有了,`-strong` 的理由反而是更直接的"6/255 太淡"。)加厚到 `.06` 之后约 13/255,与 `.ku-table-th` 那条表头带子重量相当;暗色是白膜压 `#131620`,同样是约 13/255,两个主题一起成立(一个声明两处)。
|
|
299
299
|
|
|
300
300
|
三件套的按钮统一是 `Button` 的 `type="primary" size="small"`;注意 `CodeHighlight` **没有工具条**——它全文只有一个绝对定位在右上角、悬浮在代码之上的复制键(且是实底主色,不是白的),背后就是正在滚动的代码,是三者里唯一"背后没有稳定底色"的控件——若它读不清,就是这里需要单独换实底档。
|
|
301
301
|
|
|
@@ -472,7 +472,7 @@ Token(`--ku-color-glass` / `-strong` / `-head`、`--ku-blur-base` … `-xl`)
|
|
|
472
472
|
| `ku-tag` / `ku-scrollbar` / `ku-float-button` | 过渡、滚动条伪元素、悬浮/展开态、玻璃档 | 内联未涉及这些属性;`ku-float-button` 还独占了三项:**底色**(内联已不再写 `background-color`)、**UA 重置**(`appearance: none` / `border: none` —— 少了下标就会露出 UA 的原生 `outset` 斜角环)、以及**阴影的两个状态**(`:hover` 的 `-lg` 与 `box-shadow` 过渡都写不了内联,组件里那句内联 `boxShadow` 因此是删掉的) |
|
|
473
473
|
| `ku-layout-sider-trigger` | 折叠钮的**几何**(绝对定位骑在侧栏右边缘、24px 圆钮)、**UA 重置**(`appearance: none` 等)与不透明底色 | 这些属性内联没写——钮要压出侧栏边缘,位置只能由类给;UA 重置同理,写不进内联的语义里 |
|
|
474
474
|
| `ku-userguide-card` | UserGuide 引导卡片的**不透明**底(`--ku-color-bg-3`) | 卡片不挂玻璃,底色改由类提供(内联原本就没写 `background-color`) |
|
|
475
|
-
| `ku-chat-surface` | 对话区(`AIChatDialogue` / `AIChatInput` / `Chat
|
|
475
|
+
| `ku-chat-surface` | 对话区(`AIChatDialogue` / `AIChatInput` / `Chat`)与**代码面三件套**(`CodeEditor` / `CodeHighlight` / `JsonViewer`)共用的**不透明**底(`--ku-color-chat-surface`) | 同上:这些组件都不挂玻璃,底色由类提供。对话区三件套的内联只落一个**有条件**的 `backgroundColor`——调用方没传时那一行根本不写,否则内联会把类盖死(见「对话区的面」);代码面三件套的内联完全不写 `background-color` |
|
|
476
476
|
| `ku-focus-ring` | 键盘焦点环(见下) | `Button` / `FloatButton` 原先内联 `outline: none` 关掉了 UA 环又不给替代,现已移除该内联——不删内联,挂类也出不来环 |
|
|
477
477
|
| `ku-modal-close` | 关闭按钮的悬停底 | 内联没写 `background-color`(`color` 被内联占了,所以悬停只改底、不改色) |
|
|
478
478
|
| `ku-modal-btn-primary` | 主按钮的悬停 / 按下 | 底色内联恒有值(还要随 `confirmLoading` 变),只有 `filter` 没被内联占住 |
|
|
@@ -501,9 +501,15 @@ Token(`--ku-color-glass` / `-strong` / `-head`、`--ku-blur-base` … `-xl`)
|
|
|
501
501
|
|
|
502
502
|
### 对话区的面(`.ku-chat-surface`)
|
|
503
503
|
|
|
504
|
-
`AIChatDialogue`(会话列表)/ `AIChatInput`(输入框)/ `Chat
|
|
504
|
+
`AIChatDialogue`(会话列表)/ `AIChatInput`(输入框)/ `Chat`(通用对话列表),以及**代码面三件套** `CodeEditor` / `CodeHighlight` / `JsonViewer`,**共用一条类规则、一个 token**(`--ku-color-chat-surface`,暗 `#131620` / 亮 `#f5f6f8`)。它们都是同一类面 —— 一块要读字的面 —— 底色必须一致,所以是一条规则多个消费者,而不是各写一条。
|
|
505
505
|
|
|
506
|
-
|
|
506
|
+
> 代码面那边有一层错位要知道:Monaco 铺自己的不透明底把外框整个盖住,所以这个类在代码面里**只有工具条那条带子看得见**(`CodeHighlight` 连带子都没有,外框底色完全不出现),而且代码区本身是**固定 `#131620`**、不跟这一档翻主题 —— 所以亮色下是"浅色带子 + 深色代码块"。这是有意的,见「代码面」一节。
|
|
507
|
+
|
|
508
|
+
**它是灰阶第 1 档,只声明一次。** 写的是 `rgb(var(--ku-grey-1))` 而不分主题各写一个值:`grey-1` 本身随主题翻转(暗 `#131620` / 亮 `#f5f6f8`),一个声明两个主题都成立。这与 `--ku-color-fill-translucent` 是同一种情况(见它那里的说明)。
|
|
509
|
+
|
|
510
|
+
**但它和 `bg-0` 的关系要说准确,别当成"两个主题同档"。** `bg-0` 的落点两个主题并不相同 —— 暗色是第 **0** 档(`#0c0e12`),亮色是第 **2** 档(`#ecedf0`);面板取第 1 档,于是两个主题里都**恰好比 `bg-0` 亮一档**。可页面上真正铺的不是 `bg-0`,而是那条底纹渐变(暗 `grey-2→grey-1→grey-0`、亮 `grey-0→…→grey-3`),而第 1 档**本来就是这个渐变里的一档** —— 所以面板不会浮在页面之上,而是读成"从页面里挖出来的一块对话区"。这正是原先那个手挑值 `#151517` 想做的事,区别只在于这次它落在阶梯上:跟着 `--ku-grey-1` 走,两个主题各自成立,不再需要为亮色单独写一条。
|
|
511
|
+
|
|
512
|
+
**跑回玻璃档是走不通的,这是这块面必须单列的原因。** 半透底会让身后的内容透上来,而对话区是**要读字**的面,底不该参与;膜也帮不上忙 —— 它只能往**自己主题的浅端**加厚(暗色是灰膜压暗底,`grey-3` 比 `grey-2` 亮,α 越大越亮;亮色是白膜压亮底),**两个主题都往"更浮起来"走**,拿它当"加深"的手段方向就是反的。所以这里要的是一个**实色面**,不是一层膜。
|
|
507
513
|
|
|
508
514
|
**它是唯一一处"不透明的用途面",与玻璃家族并列、而不是其中一员。** 顺带省掉一次 `backdrop-filter`:不透明的面上那层模糊本来就糊不到东西。视觉上另有一个连带效果值得记:面板从玻璃换成不透明面之后,`AIChatDialogue` 内的 Markdown 更要按平了 —— 它自己的那层玻璃膜现在只会白付一次合成,并在每条助手消息周围画出一个**更亮**的矩形(暗色膜是加亮的),所以 `FLAT_MARKDOWN_STYLE` 里的 `backdropFilter: none` 要留着。
|
|
509
515
|
|
|
@@ -2545,13 +2551,15 @@ import { CodeEditor } from "knight-ui";
|
|
|
2545
2551
|
| 属性 | 类型 | 默认值 | 说明 |
|
|
2546
2552
|
|---|---|---|---|
|
|
2547
2553
|
| `language` | `string` | — | 语言 |
|
|
2548
|
-
| `theme` | `"vs-dark" \| "light" \| "hc-black"` | `"
|
|
2554
|
+
| `theme` | `"ku-code" \| "vs-dark" \| "light" \| "hc-black"` | `"ku-code"` | Monaco 主题;`ku-code` = `vs-dark` 只换底(`#131620`),**不随本库明暗主题变化**(见「代码面」一节) |
|
|
2549
2555
|
| `readOnly` | `boolean` | `false` | 只读 |
|
|
2550
2556
|
| `height / minHeight` | `number` | — | 高度 |
|
|
2551
2557
|
| `showCopyBtn / showFormatBtn` | `boolean` | `true` | 复制/格式化按钮 |
|
|
2552
2558
|
| `fontSize` | `number` | — | 字号 |
|
|
2553
2559
|
| `onChange` | `(value: string) => void` | — | 变更回调 |
|
|
2554
2560
|
|
|
2561
|
+
> **面**:外框挂 `.ku-chat-surface`(**不透明**底,灰阶第 1 档,与对话区三件套共用一条规则一个 token)。但这个底**只有工具条那条带子看得见** —— 代码区被 Monaco 自己的不透明底盖住了,而那一块是**固定 `#131620`**、不跟主题翻转。展开见「代码面」与「对话区的面」。
|
|
2562
|
+
|
|
2555
2563
|
### CodeHighlight 代码高亮
|
|
2556
2564
|
|
|
2557
2565
|
```tsx
|
|
@@ -2569,7 +2577,7 @@ const code = `function hello() {
|
|
|
2569
2577
|
|---|---|---|---|
|
|
2570
2578
|
| `code` | `string` | — | 代码文本 |
|
|
2571
2579
|
| `language` | `string` | — | 语言 |
|
|
2572
|
-
| `theme` | `"vs-dark" \| "light" \| "hc-black"` | `"
|
|
2580
|
+
| `theme` | `"ku-code" \| "vs-dark" \| "light" \| "hc-black"` | `"ku-code"` | Monaco 主题;`ku-code` = `vs-dark` 只换底(`#131620`),**不随本库明暗主题变化**(见「代码面」一节) |
|
|
2573
2581
|
| `showLineNumbers` | `boolean` | — | 行号 |
|
|
2574
2582
|
| `copyable` | `boolean` | `true` | 可复制 |
|
|
2575
2583
|
|
|
@@ -2588,7 +2596,7 @@ import { JsonViewer } from "knight-ui";
|
|
|
2588
2596
|
| `value` | `string \| object` | — | JSON 内容 |
|
|
2589
2597
|
| `readOnly` | `boolean` | `true` | 只读 |
|
|
2590
2598
|
| `height` | `number` | `200` | 高度 |
|
|
2591
|
-
| `theme` | `"vs-dark" \| "light"` | `"
|
|
2599
|
+
| `theme` | `"ku-code" \| "vs-dark" \| "light"` | `"ku-code"` | Monaco 主题;`ku-code` = `vs-dark` 只换底(`#131620`),**不随本库明暗主题变化** |
|
|
2592
2600
|
| `onChange` | `(value: string) => void` | — | 变更回调 |
|
|
2593
2601
|
|
|
2594
2602
|
### Chat 聊天
|
|
@@ -2634,9 +2642,9 @@ const messages = [
|
|
|
2634
2642
|
| `rows` | `number` | `1` | 输入框初始行数(最小高度) |
|
|
2635
2643
|
| `maxRows` | `number` | `5` | 输入框最多撑到几行,超出后框内滚动 |
|
|
2636
2644
|
| `showEmoji` | `boolean` | `true` | 输入框左下角的表情按钮与表情面板(仅 `showInput` 时有效) |
|
|
2637
|
-
| `backgroundColor` | `string` | — | 面板底色。缺省走 `.ku-chat-surface`(暗 `#
|
|
2645
|
+
| `backgroundColor` | `string` | — | 面板底色。缺省走 `.ku-chat-surface`(暗 `#131620` / 亮 `#f5f6f8`),与 `AIChatDialogue` / `AIChatInput` 同一档 |
|
|
2638
2646
|
|
|
2639
|
-
> **面**:面板挂 `.ku-chat-surface
|
|
2647
|
+
> **面**:面板挂 `.ku-chat-surface`(**不透明**底,灰阶第 1 档,与 `AIChatDialogue` / `AIChatInput` 共用一条规则一个 token)。原先挂的是 `.ku-glass`(容器档),改成不透明面是因为对话区要读字、底不该参与,而膜只能往自己主题的浅端加厚(方向与"加深"相反)——见「对话区的面」。
|
|
2640
2648
|
>
|
|
2641
2649
|
> 传了 `backgroundColor` 它就落成**内联**、盖过类;不传时那一行根本不写(写的是 `...(backgroundColor ? { backgroundColor } : {})`)。**不能无条件写死一个内联默认值**——内联优先级高于类,那样调 `--ku-color-chat-surface` 会看起来"改了没生效"。
|
|
2642
2650
|
>
|
|
@@ -2830,9 +2838,9 @@ import { AIChatInput } from "knight-ui";
|
|
|
2830
2838
|
| `maxRows` | `number` | `4` | 最大行数,超出后框内竖直滚动 |
|
|
2831
2839
|
| `attachments` | `Attachment[]` | — | 附件列表 |
|
|
2832
2840
|
| `onSend` | `(value, attachments) => void` | — | 发送回调 |
|
|
2833
|
-
| `backgroundColor` | `string` | — | 输入框底色。缺省走 `.ku-chat-surface`(暗 `#
|
|
2841
|
+
| `backgroundColor` | `string` | — | 输入框底色。缺省走 `.ku-chat-surface`(暗 `#131620` / 亮 `#f5f6f8`)。**要与 `AIChatDialogue` 一起改** |
|
|
2834
2842
|
|
|
2835
|
-
> **面**:面板挂 `.ku-chat-surface`(**不透明**底,暗 `#
|
|
2843
|
+
> **面**:面板挂 `.ku-chat-surface`(**不透明**底,暗 `#131620` / 亮 `#f5f6f8`),与 `AIChatDialogue` / `Chat` **共用这一条类规则**。它是**同一个对话区的下半块**——两块底色必须一致,只改一边会在中间露出一条分界线,所以它跟着对话面板走,而不是像别的输入类控件那样走 `fill-0`(见 `input/Input.tsx`)。它仍是一个**面板**——自带内边距,里面装着 textarea + 附件条 + 发送键——不是 `Input` 那种单字段控件,那个分野没变。内部 textarea 本来就是透明的,附件标签走不透明的 `fill-1`(在这块面上是**更亮**的一档,读起来是一枚筹码)。
|
|
2836
2844
|
>
|
|
2837
2845
|
> **`backgroundColor` 只在传了的时候落内联**(`...(backgroundColor ? { backgroundColor } : {})`)。**不能无条件写内联 `backgroundColor`**——内联优先级高于类,写死就把 `.ku-chat-surface` 那一档盖死了。要与 `AIChatDialogue` 一起改,理由同上一段。展开见「对话区的面」。
|
|
2838
2846
|
>
|
|
@@ -2876,7 +2884,7 @@ const messages = [
|
|
|
2876
2884
|
| `onCopy` | `(msg) => void` | — | 复制回调(复制按钮仅在传入时出现) |
|
|
2877
2885
|
| `copyTip` | `React.ReactNode \| false` | `"已复制"` | 复制后的 Toast 文案;传 `false` 关闭提示 |
|
|
2878
2886
|
| `onRetry` | `(msg, index) => void` | — | 重试回调 |
|
|
2879
|
-
| `backgroundColor` | `string` | — | 面板底色。缺省走 `.ku-chat-surface`(暗 `#
|
|
2887
|
+
| `backgroundColor` | `string` | — | 面板底色。缺省走 `.ku-chat-surface`(暗 `#131620` / 亮 `#f5f6f8`)。**要与 `AIChatInput` 一起改** —— 两块是同一对话区的上下两半 |
|
|
2880
2888
|
|
|
2881
2889
|
> **AIMessage 思考内容支持(assistant 专用)**:`thinkingContent?: React.ReactNode` 思考/推理内容(Markdown 字符串或节点),展示为消息上方可折叠的灰色思考块;`thinkingTokens?: number` 真实 token 数(缺省按 ~3.5 字符/token 估算,展示时**千位进制、保留一位小数**:`1200 → "1.2 k"`,不足 `1000` 原样显示,再拼上 `" token"`,即渲染成 `12.3 k token`。**不做单位换算**(不出现 `万` / `M`)——这一列是同一量级的横向对比,统一乘数比"换个单位"更好读);`thinkingDurationMs?: number` 思考耗时(ms),完整消息可传,流式思考期间由组件自动计时无需传入。
|
|
2882
2890
|
> 流式阶段约定:仅思考时消息为 `{ role:"assistant", thinkingContent: 增量, status:"streaming" }`(正文留空、与 content 互斥增长);结束后替换为带 `content`(与可选 `thinkingDurationMs`)的完整消息。
|
|
@@ -2892,7 +2900,7 @@ const messages = [
|
|
|
2892
2900
|
> **复制反馈**:点"复制"会在调用 `onCopy` 之后弹 `Toast.success("已复制")`(文案用 `copyTip` 改,传 `copyTip={false}` 关掉,反馈交回调用方)。
|
|
2893
2901
|
> **组件自己不碰剪贴板**——`content` 是 `React.ReactNode`,可能是节点而不是文本,"该拷什么"只有调用方说得清,所以写入始终发生在 `onCopy` 里(见上方示例)。也正因如此,这个提示代表的是"复制动作已发出",**不是组件核实过的结果**:`onCopy` 里若是异步写入且被浏览器拒绝,组件无从得知。要拿到真结果,就得把组件改成自己写剪贴板,并把 `content` 收窄成 `string`。
|
|
2894
2902
|
|
|
2895
|
-
> **面**:面板挂 `.ku-chat-surface`(**不透明**底,暗 `#
|
|
2903
|
+
> **面**:面板挂 `.ku-chat-surface`(**不透明**底,暗 `#131620` / 亮 `#f5f6f8`),与 `AIChatInput` / `Chat` 共用一条规则一个 token。原先挂的是 `.ku-glass`(容器档);改成不透明面是因为对话区要读字、底不该参与,而膜只能往自己主题的浅端加厚(方向与"加深"相反)——见「对话区的面」。
|
|
2896
2904
|
>
|
|
2897
2905
|
> `backgroundColor` 传了才落**内联**、盖过类;不传时那一行根本不写。**不能无条件写一个内联默认值**——内联优先级高于类,那样调 `--ku-color-chat-surface` 会看起来"改了没生效"。要改就与 `AIChatInput` **一起改**:两块是同一对话区的上下两半,只改一边会在中间露出一条分界线。
|
|
2898
2906
|
>
|
|
@@ -98,8 +98,8 @@ export interface AIChatDialogueProps extends UIProps {
|
|
|
98
98
|
/** 思考正文最大高度(px),超出后内部滚动 @default 320 */
|
|
99
99
|
thinkingBodyMaxHeight?: number;
|
|
100
100
|
emptyContent?: React.ReactNode;
|
|
101
|
-
/** 面板底色。缺省走 .ku-chat-surface(暗 #
|
|
102
|
-
|
|
101
|
+
/** 面板底色。缺省走 .ku-chat-surface(暗 #131620 / 亮 #f5f6f8, 即灰阶第 1 档)。要与 AIChatInput
|
|
102
|
+
一起改 —— 两块是同一对话区的上下两半, 只改一边会在中间露出一条分界线。 */
|
|
103
103
|
backgroundColor?: string;
|
|
104
104
|
onCopy?: (msg: AIMessage) => void;
|
|
105
105
|
/** 点击复制后弹出的 Toast 文案;传 false 关闭提示,反馈由调用方自理 @default "已复制" */
|
|
@@ -30,8 +30,8 @@ export interface AIChatInputProps extends UIProps {
|
|
|
30
30
|
onChange?: (value: string) => void;
|
|
31
31
|
onSend?: (value: string, attachments: Attachment[]) => void;
|
|
32
32
|
placeholder?: string;
|
|
33
|
-
/** 输入框底色。缺省走 .ku-chat-surface(暗 #
|
|
34
|
-
|
|
33
|
+
/** 输入框底色。缺省走 .ku-chat-surface(暗 #131620 / 亮 #f5f6f8, 即灰阶第 1 档)。要与 AIChatDialogue
|
|
34
|
+
一起改 —— 两块是同一对话区的上下两半, 只改一边会在中间露出一条分界线。 */
|
|
35
35
|
backgroundColor?: string;
|
|
36
36
|
disabled?: boolean;
|
|
37
37
|
loading?: boolean;
|
package/component/plus/Chat.d.ts
CHANGED
|
@@ -49,7 +49,8 @@ export interface ChatProps extends UIProps {
|
|
|
49
49
|
onRetry?: (msg: ChatMessage, index: number) => void;
|
|
50
50
|
loading?: boolean;
|
|
51
51
|
emptyContent?: React.ReactNode;
|
|
52
|
-
/** 面板底色。缺省走 .ku-chat-surface(暗 #
|
|
52
|
+
/** 面板底色。缺省走 .ku-chat-surface(暗 #131620 / 亮 #f5f6f8, 即灰阶第 1 档), 与 AIChatDialogue /
|
|
53
|
+
AIChatInput 同一档。 */
|
|
53
54
|
backgroundColor?: string;
|
|
54
55
|
showInput?: boolean;
|
|
55
56
|
placeholder?: string;
|
|
@@ -26,7 +26,7 @@ export declare class CodeEditor extends AbstractUI<CodeEditorProps, CodeEditorSt
|
|
|
26
26
|
getEditor(): any;
|
|
27
27
|
/** Monaco 挂载回调 */
|
|
28
28
|
private OnEditorMount;
|
|
29
|
-
/** 挂载前配置 Monaco
|
|
29
|
+
/** 挂载前配置 Monaco 环境: 先登记代码面主题, 再稳定诊断/IntelliSense */
|
|
30
30
|
private beforeMount;
|
|
31
31
|
/** 切换语言 — 更新内部状态 + 回调 + 直接操作 Monaco 模型 */
|
|
32
32
|
private handleLanguageChange;
|
|
@@ -57,8 +57,9 @@ export interface CodeEditorProps extends UIProps {
|
|
|
57
57
|
width?: number | string;
|
|
58
58
|
/** 编辑器最小宽度(px) */
|
|
59
59
|
minWidth?: number;
|
|
60
|
-
/** Monaco 主题 @default "
|
|
61
|
-
|
|
60
|
+
/** Monaco 主题 @default "ku-code" —— `vs-dark` 原样继承, 只把底换成灰阶第 1 档 #131620(见
|
|
61
|
+
tokens/codeTheme.ts)。**不随本库明暗主题变化**: 两个主题下代码面都是这一块深底。 */
|
|
62
|
+
theme?: "ku-code" | "vs-dark" | "light" | "hc-black";
|
|
62
63
|
/** 只读 @default false */
|
|
63
64
|
readOnly?: boolean;
|
|
64
65
|
/** 显示缩略图 @default false */
|
|
@@ -21,8 +21,9 @@ export declare class CodeHighlight extends AbstractUI<CodeHighlightProps, CodeHi
|
|
|
21
21
|
export interface CodeHighlightProps extends UIProps {
|
|
22
22
|
code?: string;
|
|
23
23
|
language?: string;
|
|
24
|
-
/** Monaco 主题 @default "
|
|
25
|
-
|
|
24
|
+
/** Monaco 主题 @default "ku-code" —— `vs-dark` 原样继承, 只把底换成灰阶第 1 档 #131620(见
|
|
25
|
+
tokens/codeTheme.ts)。**不随本库明暗主题变化**: 两个主题下代码面都是这一块深底。 */
|
|
26
|
+
theme?: "ku-code" | "vs-dark" | "light" | "hc-black";
|
|
26
27
|
showLineNumbers?: boolean;
|
|
27
28
|
height?: number | string;
|
|
28
29
|
maxHeight?: number | string;
|
|
@@ -26,8 +26,9 @@ export interface JsonViewerProps extends UIProps {
|
|
|
26
26
|
readOnly?: boolean;
|
|
27
27
|
onChange?: (value: string) => void;
|
|
28
28
|
height?: number;
|
|
29
|
-
/** Monaco 主题 @default "
|
|
30
|
-
|
|
29
|
+
/** Monaco 主题 @default "ku-code" —— `vs-dark` 原样继承, 只把底换成灰阶第 1 档 #131620(见
|
|
30
|
+
tokens/codeTheme.ts)。**不随本库明暗主题变化**: 两个主题下代码面都是这一块深底。 */
|
|
31
|
+
theme?: "ku-code" | "vs-dark" | "light";
|
|
31
32
|
}
|
|
32
33
|
interface JsonViewerState extends UIState {
|
|
33
34
|
lastExternalValue: string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 代码面的 Monaco 主题 —— 只改一件事: 把 `vs-dark` 的底(#1e1e1e)换成本库灰阶第 1 档 #131620,
|
|
3
|
+
* 其余**全部继承 vs-dark**(`inherit: true` + 空 rules)。
|
|
4
|
+
*
|
|
5
|
+
* 为什么只改底: 语法配色是一整套(几十个槽位), 换任何一个都得重新标定一遍; 而代码面与页面脱节
|
|
6
|
+
* 的地方只有"底"这一处 —— #1e1e1e 是中性深灰, 页面是带蓝的深灰, 两块并排就是两种黑。底对上之后,
|
|
7
|
+
* 剩下的中性灰面(建议列表 / 悬停气泡 / 缩略图)面积小, 且都要用户主动触发才出现, 不在第一眼里。
|
|
8
|
+
*
|
|
9
|
+
* **底色是固定的 #131620, 不跟 `--ku-grey-1` 随主题翻转。** 亮色的 grey-1 是 #f5f6f8(近白),
|
|
10
|
+
* 而 vs-dark 的语法色(#9cdcfe / #dcdcaa / #ce9178…)是给深底配的浅色 —— 铺在近白底上会大面积糊掉。
|
|
11
|
+
* 所以代码面在**两个主题下都是这一块深底**, 与「代码面不随主题变化」是同一条取向(见 README「代码面」
|
|
12
|
+
* 一节)。也正因为如此这里必须写死字面量: Monaco 的 colors 只吃 #RRGGBB, CSS 变量在这里无效 ——
|
|
13
|
+
* 和它 options 里 fontSize 只吃数字是同一类限制。
|
|
14
|
+
*/
|
|
15
|
+
export declare const KU_CODE_THEME = "ku-code";
|
|
16
|
+
/**
|
|
17
|
+
* 注册代码面主题。
|
|
18
|
+
*
|
|
19
|
+
* **必须在 `beforeMount` 里调用**: @monaco-editor/react 的顺序是 beforeMount → editor.create →
|
|
20
|
+
* setTheme, 赶在 create 之前登记, 那个名字才已经存在。
|
|
21
|
+
*
|
|
22
|
+
* 每次挂载都重新 define、不加"只注册一次"的模块开关: defineTheme 只是登记一份定义(不应用),
|
|
23
|
+
* 开销可忽略; 而开关一旦因为 Monaco 实例被重建或重新加载而失真, 表现是"主题悄悄不生效",
|
|
24
|
+
* 比多登记一次难查得多。
|
|
25
|
+
*/
|
|
26
|
+
export declare function ensureKuCodeTheme(monaco: any): void;
|
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
* `rgb` / `hex` / `valueToHex` / `contentStep` / `contentColor` / `contentHex`。它们服务的两个
|
|
15
15
|
* 消费者现在都不存在了 ——
|
|
16
16
|
* ① 内容色板不需要读色: 字符串拼装就够了(这正是 contentVar 存在的理由);
|
|
17
|
-
* ② Monaco
|
|
18
|
-
*
|
|
17
|
+
* ② Monaco 那一版已整体撤掉, 代码面现在用 VS 自带的 `vs-dark`, 只换底(见 ./codeTheme.ts)。
|
|
18
|
+
* 它是**写死一个字面量**进 Monaco 的注册表, 不需要把 CSS 值读出来 —— 所以
|
|
19
|
+
* `valueToHex`(为"读了再转 #RRGGBB"而写)依然没有用处。
|
|
19
20
|
* 所以按"整族剪"处理, 一个不留 —— 养一批无人调用的导出, 比真要用时重写它们(~70 行:
|
|
20
21
|
* `getComputedStyle` + 展开嵌套 `var()` + 十六进制转换)贵得多。
|
|
21
22
|
*
|