knight-ui 1.1.5 → 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.
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
2
  import { AbstractUI, type UIProps, type UIState } from "../../base";
3
+ import { type LayoutSiderContextValue } from "../basic/Layout";
3
4
  export interface NavItem {
4
5
  key: string;
5
6
  label: string;
@@ -12,7 +13,26 @@ type TriggerMode = "hover" | "click";
12
13
  * 导航菜单。
13
14
  */
14
15
  export declare class Navigation extends AbstractUI<NavigationProps, NavigationState> {
16
+ /** 放进 Layout.Sider 时自动跟着折叠 —— 折叠钮只改 Sider 自己的 state, 子组件靠这个 context 才看得见。 */
17
+ static contextType: React.Context<LayoutSiderContextValue>;
18
+ context: LayoutSiderContextValue | null;
15
19
  constructor(props: NavigationProps);
20
+ /** 上一次更新时的折叠态。null 只在 componentDidMount 之前成立(那时不可能有更新)。 */
21
+ private _lastCollapsed;
22
+ componentDidMount(): void;
23
+ /** 折叠态三级: 显式 isCollapsed > 所在 Sider 的折叠态 > 自己的 defaultIsCollapsed。 */
24
+ private isCollapsed;
25
+ /**
26
+ * 折叠态**翻转那一帧**要做的两件事: 通知外部, 以及把展开的子菜单收起来。
27
+ *
28
+ * 判断"那一刻"要知道上一次的折叠态, 而折叠态可能来自 context —— context 不在 prevProps 里, 所以自己记一笔
29
+ * (基线在 componentDidMount 落地)。注意"折叠态"在 Sider 里是**延迟版**的: 侧栏宽度先走完, context 才翻,
30
+ * 所以这两件事都落在"图标出现"那一帧上, 而不是点下去就凭空发生。
31
+ *
32
+ * 为什么收起子菜单: 折叠态下子项本来就画不出来(iconOnly 会把内联子项整段拿掉), 但 openKeys 还留着 ——
33
+ * 再展开侧栏时子菜单会**自己弹回来**。用户按了折叠, 期望的是"收起来", 而不是"暂时看不见"。
34
+ */
35
+ private syncCollapseState;
16
36
  componentDidUpdate(prevProps: Readonly<NavigationProps>): void;
17
37
  protected OnRenderContent(): React.ReactElement;
18
38
  private renderItem;
@@ -24,19 +44,39 @@ export declare class Navigation extends AbstractUI<NavigationProps, NavigationSt
24
44
  private select;
25
45
  }
26
46
  export interface NavigationProps extends UIProps {
47
+ /** 菜单数据。**key 在一份菜单里必须唯一**(选中/展开/回调都用它)。折叠后每行只剩图标, 所以每一项都该配
48
+ icon —— 没有图标的那一行在折叠态就是**一行空白**(描边和 hover 气泡还在, 但看起来像坏了)。
49
+ 子菜单写在 NavItem.children 里: 竖排逐级内联(每级多缩进 16px), 横排的浮层只画一层。 */
27
50
  items?: NavItem[];
51
+ /** 竖排(默认): 子菜单**内联**在下方, 点父项展开; 横排: 子菜单是浮层, 由 trigger 决定怎么开。
52
+ 折叠只对竖排有意义 —— 横排没有"收成图标"这回事, 传了 isCollapsed 也不会把标签收掉。 */
28
53
  mode?: "horizontal" | "vertical";
54
+ /** 折叠态(收成只显示图标)。不传时读所在 Layout.Sider 的折叠态, 再退到 defaultIsCollapsed。 */
29
55
  isCollapsed?: boolean;
56
+ /** 非受控初始值。放进 Sider 时以 Sider 的折叠态为准, 它只是独立使用时的起点。 */
30
57
  defaultIsCollapsed?: boolean;
58
+ /**
59
+ * 折叠态变化回调 —— 不管这一下是谁改的(传进来的 isCollapsed / 所在 Sider 的折叠钮 / 自己的默认值)。
60
+ * 要"用户点下按钮那一刻"就用 Layout.Sider 的 onCollapseChange; 这个是"菜单内容真的换成图标形态了"
61
+ * 那一刻(在 Sider 里比按钮晚一个过渡时长)。挂载时不发。
62
+ */
31
63
  onCollapseChange?: (isCollapsed: boolean) => void;
32
- /** 水平模式子菜单触发方式,默认 "hover" */
64
+ /** 横排子菜单的触发方式, 默认 "hover"(鼠标移入就开)。竖排不看它 —— 竖排一律点击展开。 */
33
65
  trigger?: TriggerMode;
66
+ /** 受控: 当前展开的子菜单 key。传了它菜单就不自己改内部 state, 只发 onOpenChange, 由调用方回写。
67
+ **要传新数组**(内部按引用比较, 原地 push 不会同步)。折叠那一刻会发一次 [] —— 受控方要照着自己置空。 */
34
68
  openKeys?: string[];
69
+ /** 非受控初始展开项。只在挂载时读一次(受控的 openKeys 优先)。 */
35
70
  defaultOpenKeys?: string[];
71
+ /** 受控: 当前选中项。单选时点谁换谁; multiple 时叠加/取消。传新数组的理由同 openKeys。 */
36
72
  selectedKeys?: string[];
73
+ /** 非受控初始选中项。只在挂载时读一次(受控的 selectedKeys 优先)。 */
37
74
  defaultSelectedKeys?: string[];
75
+ /** 多选: 再点已选中项就取消, 选中项可以有好几个。默认单选 —— 点谁谁亮, 与已有选中项无关。 */
38
76
  multiple?: boolean;
77
+ /** 选中回调。受控/非受控都会发(受控方靠它拿新值回写), 点已选中项也会发一次。 */
39
78
  onSelect?: (key: string) => void;
79
+ /** 展开集合变化回调: 点父项开/关, 以及折叠那一刻被清空(收到 [])。叶子项永远不发。 */
40
80
  onOpenChange?: (openKeys: string[]) => void;
41
81
  }
42
82
  interface NavigationState extends UIState {
@@ -49,6 +49,9 @@ 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(暗 #131620 / 亮 #f5f6f8, 即灰阶第 1 档), 与 AIChatDialogue /
53
+ AIChatInput 同一档。 */
54
+ backgroundColor?: string;
52
55
  showInput?: boolean;
53
56
  placeholder?: string;
54
57
  sendText?: 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 环境,稳定诊断/IntelliSense */
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 "vs-dark" —— 代码面按 VS Code 自己的暗色一套, **不随本库明暗主题变化** */
61
- theme?: "vs-dark" | "light" | "hc-black";
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 "vs-dark" —— 代码面按 VS Code 自己的暗色一套, **不随本库明暗主题变化** */
25
- theme?: "vs-dark" | "light" | "hc-black";
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 "vs-dark" —— 代码面按 VS Code 自己的暗色一套, **不随本库明暗主题变化** */
30
- theme?: "vs-dark" | "light";
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 那一版已整体撤掉: 代码面现在完全用 VS 自带的 `vs-dark`, 不注册自定义主题,
18
- * 于是 `valueToHex`(为"只吃 #RRGGBB 的注册表"而写)也一并没了用处。
17
+ * ② Monaco 那一版已整体撤掉, 代码面现在用 VS 自带的 `vs-dark`, 只换底(见 ./codeTheme.ts)。
18
+ * 它是**写死一个字面量**进 Monaco 的注册表, 不需要把 CSS 值读出来 —— 所以
19
+ * `valueToHex`(为"读了再转 #RRGGBB"而写)依然没有用处。
19
20
  * 所以按"整族剪"处理, 一个不留 —— 养一批无人调用的导出, 比真要用时重写它们(~70 行:
20
21
  * `getComputedStyle` + 展开嵌套 `var()` + 十六进制转换)贵得多。
21
22
  *