one-design-next 0.0.115 → 0.0.117
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/dist/agent-step/index.d.ts +1 -1
- package/dist/agent-step/index.js +3 -3
- package/dist/calendar/index.js +0 -4
- package/dist/composer/editor.js +92 -15
- package/dist/composer/style/index.css +68 -0
- package/dist/composer/utils.d.ts +9 -0
- package/dist/composer/utils.js +12 -2
- package/dist/date-picker/index.js +0 -4
- package/dist/date-range-picker/index.js +0 -4
- package/dist/dropdown/index.js +1 -1
- package/dist/hover-fill/index.js +17 -16
- package/dist/icon/types.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/input/index.js +5 -7
- package/dist/message/MessageReact18.js +7 -40
- package/dist/message/index.d.ts +0 -1
- package/dist/message/index.js +2 -3
- package/dist/modal-base/index.js +1 -1
- package/dist/pagination/index.js +0 -2
- package/dist/pop-base/index.js +22 -5
- package/dist/radio/primitive.d.ts +2 -2
- package/dist/select/useIcons.d.ts +3 -3
- package/dist/skill-slot/index.js +30 -18
- package/dist/skill-slot/style/index.css +55 -15
- package/dist/tooltip/index.d.ts +1 -1
- package/package.json +5 -5
- package/dist/message/MessageReact16.d.ts +0 -2
- package/dist/message/MessageReact16.js +0 -84
|
@@ -10,7 +10,7 @@ export interface AgentStepProps {
|
|
|
10
10
|
isFirst?: boolean;
|
|
11
11
|
isLast?: boolean;
|
|
12
12
|
}
|
|
13
|
-
export declare function AgentStep({ tool, defaultOpen, expandWhileRunning, onRetry, isFirst, isLast }: AgentStepProps): React.JSX.Element;
|
|
13
|
+
export declare function AgentStep({ tool, defaultOpen, expandWhileRunning, onRetry, isFirst, isLast, }: AgentStepProps): React.JSX.Element;
|
|
14
14
|
export declare namespace AgentStep {
|
|
15
15
|
var displayName: string;
|
|
16
16
|
}
|
package/dist/agent-step/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _typeof from "@babel/runtime/helpers/esm/typeof";
|
|
2
2
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
3
|
-
import React, { useEffect,
|
|
3
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
4
4
|
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../collapse";
|
|
5
5
|
import HoverFill from "../hover-fill";
|
|
6
6
|
import Icon from "../icon";
|
|
@@ -52,7 +52,7 @@ function formatParams(params) {
|
|
|
52
52
|
/** 折叠区内是否有可展示内容(与下方渲染条件一致) */
|
|
53
53
|
function toolHasExpandableBody(tool) {
|
|
54
54
|
var p = tool.params;
|
|
55
|
-
var hasParams = p
|
|
55
|
+
var hasParams = p !== null && p !== undefined && _typeof(p) === 'object' && Object.keys(p).length > 0;
|
|
56
56
|
return hasParams || Boolean(tool.result) || Boolean(tool.error);
|
|
57
57
|
}
|
|
58
58
|
function RunningTimer(_ref3) {
|
|
@@ -214,7 +214,7 @@ function AgentStepGroup(_ref5) {
|
|
|
214
214
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
215
215
|
settledDone = _useState6[0],
|
|
216
216
|
setSettledDone = _useState6[1];
|
|
217
|
-
var settleTimerRef = useRef();
|
|
217
|
+
var settleTimerRef = useRef(undefined);
|
|
218
218
|
if (tools.some(function (t) {
|
|
219
219
|
return t.status === 'running';
|
|
220
220
|
})) {
|
package/dist/calendar/index.js
CHANGED
|
@@ -71,7 +71,6 @@ var Calendar = function Calendar(_ref) {
|
|
|
71
71
|
};
|
|
72
72
|
var handleCaptionHoverEnter = function handleCaptionHoverEnter(e) {
|
|
73
73
|
var _popupRef$current, _popupRef$current2;
|
|
74
|
-
e.persist();
|
|
75
74
|
clearTimeout(navHoverFillTimer.current);
|
|
76
75
|
if (!navHoverFillInnerRef.current || !navHoverFillRef.current) {
|
|
77
76
|
return;
|
|
@@ -106,7 +105,6 @@ var Calendar = function Calendar(_ref) {
|
|
|
106
105
|
}
|
|
107
106
|
};
|
|
108
107
|
var handleCaptionHoverLeave = function handleCaptionHoverLeave(e) {
|
|
109
|
-
e.persist();
|
|
110
108
|
clearTimeout(navHoverFillTimer.current);
|
|
111
109
|
if (!navHoverFillInnerRef.current || !navHoverFillRef.current) {
|
|
112
110
|
return;
|
|
@@ -133,7 +131,6 @@ var Calendar = function Calendar(_ref) {
|
|
|
133
131
|
};
|
|
134
132
|
var handleTdHoverEnter = function handleTdHoverEnter(e) {
|
|
135
133
|
var _popupRef$current3, _popupRef$current4;
|
|
136
|
-
e.persist();
|
|
137
134
|
clearTimeout(tdHoverFillTimer.current);
|
|
138
135
|
if (!tdHoverFillInnerRef.current || !tdHoverFillRef.current) {
|
|
139
136
|
return;
|
|
@@ -167,7 +164,6 @@ var Calendar = function Calendar(_ref) {
|
|
|
167
164
|
}
|
|
168
165
|
};
|
|
169
166
|
var handleTdHoverLeave = function handleTdHoverLeave(e) {
|
|
170
|
-
e.persist();
|
|
171
167
|
clearTimeout(tdHoverFillTimer.current);
|
|
172
168
|
if (!tdHoverFillInnerRef.current || !tdHoverFillRef.current) {
|
|
173
169
|
return;
|
package/dist/composer/editor.js
CHANGED
|
@@ -29,7 +29,7 @@ import { useChipManager } from "./hooks/useChipManager";
|
|
|
29
29
|
import { useChipSelectionMarker } from "./hooks/useChipSelectionMarker";
|
|
30
30
|
import { chipHasEditableParams, ComposerInlineRef } from "./inline-ref";
|
|
31
31
|
import { resolveHintTarget } from "./segments";
|
|
32
|
-
import { COMPOSER_HINT_ATTR, createLineRoot, createLineRootWithText, ensureCaretAnchorAfter, ensureLineRoots, getPlainText, isEditorEmpty, isLineRoot, LINE_ATTR_NAME, normalizeEditorDom, probeTrigger, stripInvisibleChars, ZWSP } from "./utils";
|
|
32
|
+
import { COMPOSER_HINT_ACCEPT_ATTR, COMPOSER_HINT_ACCEPT_SELECTOR, COMPOSER_HINT_ATTR, createLineRoot, createLineRootWithText, ensureCaretAnchorAfter, ensureLineRoots, getPlainText, isEditorEmpty, isLineRoot, LINE_ATTR_NAME, normalizeEditorDom, probeTrigger, stripInvisibleChars, ZWSP } from "./utils";
|
|
33
33
|
|
|
34
34
|
/** Composer editor 触发态对外信号——告诉父组件该弹浮层选 skill 了。 */
|
|
35
35
|
|
|
@@ -98,6 +98,34 @@ var findDirectHint = function findDirectHint(line) {
|
|
|
98
98
|
return null;
|
|
99
99
|
};
|
|
100
100
|
|
|
101
|
+
/**
|
|
102
|
+
* hint 末尾的「TAB 采纳」小块:点它 = 按 Tab 采纳这段模板文案。
|
|
103
|
+
*
|
|
104
|
+
* 与 hint 文本是同级节点(见 `COMPOSER_HINT_ACCEPT_ATTR` 的说明),由
|
|
105
|
+
* `syncHintNode` 一起插入 / 移除,不进 value / 剪贴板 / segments。
|
|
106
|
+
* 视觉在 `style/index.scss`(`[data-odn-composer-hint-accept]`)。
|
|
107
|
+
*/
|
|
108
|
+
var createHintAcceptNode = function createHintAcceptNode() {
|
|
109
|
+
var accept = document.createElement('span');
|
|
110
|
+
accept.setAttribute(COMPOSER_HINT_ACCEPT_ATTR, '');
|
|
111
|
+
accept.contentEditable = 'false';
|
|
112
|
+
/* 刻意不加 role="button" / aria-label / title:
|
|
113
|
+
* - 它不可聚焦、也没有 Enter/Space 激活逻辑,挂 button 语义等于给读屏用户
|
|
114
|
+
* 一个按不动的控件(无障碍反而变成障碍)。真正的键盘路径就是它写着的
|
|
115
|
+
* Tab 键本身,可见文案已经说清动作。
|
|
116
|
+
* - aria-label 会盖掉可见文案,反而违反「可见标签即无障碍名」。
|
|
117
|
+
* - title 是浏览器原生 tooltip:延迟出现、样式不可控、会盖住灰字。 */
|
|
118
|
+
|
|
119
|
+
var key = document.createElement('span');
|
|
120
|
+
key.setAttribute('data-odn-composer-hint-accept-key', '');
|
|
121
|
+
key.textContent = 'TAB';
|
|
122
|
+
var label = document.createElement('span');
|
|
123
|
+
label.setAttribute('data-odn-composer-hint-accept-label', '');
|
|
124
|
+
label.textContent = '采纳';
|
|
125
|
+
accept.append(key, label);
|
|
126
|
+
return accept;
|
|
127
|
+
};
|
|
128
|
+
|
|
101
129
|
/**
|
|
102
130
|
* insertContent 的插入点:最后一个行容器的内容末尾。
|
|
103
131
|
*
|
|
@@ -359,12 +387,18 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
|
|
|
359
387
|
* 就不存在了,caret 只能落在整个 host 之后(= 提示文本末尾)。
|
|
360
388
|
*
|
|
361
389
|
* 它不归 React 管(editor 的 children 由 contenteditable 自治),由 fireChange
|
|
362
|
-
* 按结构谓词增删/挪位;`getPlainText` 会整棵子树跳过,所以不进 value / 剪贴板。
|
|
390
|
+
* 按结构谓词增删/挪位;`getPlainText` 会整棵子树跳过,所以不进 value / 剪贴板。
|
|
391
|
+
*
|
|
392
|
+
* 末尾的「TAB 采纳」小块是 hint 文本的**兄弟节点**(不是子节点):hint 的
|
|
393
|
+
* textContent 必须保持纯提示文案(采纳时直接落成正文,调试面板也按它读)。 */
|
|
363
394
|
var hintNodeRef = useRef(null);
|
|
395
|
+
var hintAcceptNodeRef = useRef(null);
|
|
364
396
|
var removeHintNode = useCallback(function () {
|
|
365
|
-
var _hintNodeRef$current;
|
|
397
|
+
var _hintNodeRef$current, _hintAcceptNodeRef$cu;
|
|
366
398
|
(_hintNodeRef$current = hintNodeRef.current) === null || _hintNodeRef$current === void 0 || _hintNodeRef$current.remove();
|
|
367
399
|
hintNodeRef.current = null;
|
|
400
|
+
(_hintAcceptNodeRef$cu = hintAcceptNodeRef.current) === null || _hintAcceptNodeRef$cu === void 0 || _hintAcceptNodeRef$cu.remove();
|
|
401
|
+
hintAcceptNodeRef.current = null;
|
|
368
402
|
}, []);
|
|
369
403
|
var syncHintNode = useCallback(function (target) {
|
|
370
404
|
var _Array$from$find, _blankTail;
|
|
@@ -384,6 +418,11 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
|
|
|
384
418
|
hintNodeRef.current = node;
|
|
385
419
|
}
|
|
386
420
|
if (node.textContent !== target.text) node.textContent = target.text;
|
|
421
|
+
var accept = hintAcceptNodeRef.current;
|
|
422
|
+
if (!accept || !accept.isConnected) {
|
|
423
|
+
accept = createHintAcceptNode();
|
|
424
|
+
hintAcceptNodeRef.current = accept;
|
|
425
|
+
}
|
|
387
426
|
|
|
388
427
|
/* 落位:命中 chip 之后、**紧随其后的不可见锚点文本(ZWSP)之后**。
|
|
389
428
|
*
|
|
@@ -398,8 +437,9 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
|
|
|
398
437
|
var cur = host.nextSibling;
|
|
399
438
|
while (cur) {
|
|
400
439
|
var _cur$textContent;
|
|
401
|
-
// 跳过 hint
|
|
402
|
-
|
|
440
|
+
// 跳过 hint 自身与它的「TAB 采纳」小块:上一轮若排到了锚点前面,
|
|
441
|
+
// 这里顺手挪回末尾
|
|
442
|
+
if (cur === node || cur === accept) {
|
|
403
443
|
cur = cur.nextSibling;
|
|
404
444
|
continue;
|
|
405
445
|
}
|
|
@@ -426,6 +466,12 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
|
|
|
426
466
|
if (node.parentNode !== parent || node.previousSibling !== anchor) {
|
|
427
467
|
parent.insertBefore(node, anchor.nextSibling);
|
|
428
468
|
}
|
|
469
|
+
/* 「TAB 采纳」小块紧跟 hint 文案之后(同一套行内流),顺序必须是
|
|
470
|
+
* hint → 小块:caret 的合法落点只到 hint 之前,块本身
|
|
471
|
+
* contentEditable=false,不会成为落点。 */
|
|
472
|
+
if (accept.parentNode !== parent || accept.previousSibling !== node) {
|
|
473
|
+
parent.insertBefore(accept, node.nextSibling);
|
|
474
|
+
}
|
|
429
475
|
}, [removeHintNode]);
|
|
430
476
|
|
|
431
477
|
/** 把 caret 直接落到 hint 之前(= chip 右侧);没有 hint 时不动。 */
|
|
@@ -530,26 +576,45 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
|
|
|
530
576
|
recomputeTriggerRef.current = recomputeTrigger;
|
|
531
577
|
|
|
532
578
|
/* ─────────────────────────────────────
|
|
533
|
-
* Tab
|
|
579
|
+
* 采纳 hint(Tab / 点击「TAB 采纳」小块)
|
|
534
580
|
*
|
|
535
581
|
* hint 只是结构投影(不进 value);caret 恰好停在 chip 与 hint 之间
|
|
536
582
|
* (= 内容末尾)时按 Tab,表示用户接受这段模板,于是把提示文案落成正文:
|
|
537
583
|
* chip 之后出现内容 → 结构谓词不再命中 → 灰字自动移除,onChange 抛出的
|
|
538
584
|
* value 里带上这段文案,与用户自己敲进去的效果一致。
|
|
585
|
+
*
|
|
586
|
+
* 鼠标点末尾的「TAB 采纳」小块走**同一条链路**,只是带 `force`:
|
|
587
|
+
* 不要求点击前 caret 就停在 hint 之前,先把 caret 归位到 chip 右侧再落。
|
|
539
588
|
* ───────────────────────────────────── */
|
|
540
|
-
var acceptHintAsText = useCallback(function () {
|
|
589
|
+
var acceptHintAsText = useCallback(function (options) {
|
|
541
590
|
var _hint$textContent;
|
|
542
591
|
var el = editorRef.current;
|
|
543
592
|
var hint = hintNodeRef.current;
|
|
544
593
|
var sel = window.getSelection();
|
|
545
|
-
if (!el || !hint || !hint.isConnected || !sel
|
|
546
|
-
|
|
594
|
+
if (!el || !hint || !hint.isConnected || !sel) return false;
|
|
595
|
+
var range;
|
|
596
|
+
if (options !== null && options !== void 0 && options.force) {
|
|
597
|
+
/* 点击路径:mousedown 已被 preventDefault,焦点 / caret 都还没进来,
|
|
598
|
+
* 先聚焦再把 caret 落到 hint 之前(= 内容末尾),避免原生落点乱跳。 */
|
|
599
|
+
el.focus({
|
|
600
|
+
preventScroll: true
|
|
601
|
+
});
|
|
602
|
+
var target = caretBeforeHintIn(el);
|
|
603
|
+
if (!target) return false;
|
|
604
|
+
range = document.createRange();
|
|
605
|
+
range.setStart(target.node, target.offset);
|
|
606
|
+
range.collapse(true);
|
|
607
|
+
sel.removeAllRanges();
|
|
608
|
+
sel.addRange(range);
|
|
609
|
+
lastEditorRangeRef.current = range.cloneRange();
|
|
610
|
+
} else {
|
|
611
|
+
if (sel.rangeCount === 0) return false;
|
|
612
|
+
range = sel.getRangeAt(0);
|
|
613
|
+
if (!range.collapsed || !el.contains(range.startContainer)) return false;
|
|
614
|
+
/* 只认「chip 之后、hint 之前」这一个落点;caret 在别处时 Tab 仍归浏览器,
|
|
615
|
+
* 避免在任意位置误吞焦点切换。 */
|
|
616
|
+
if (!isCaretBeforeHint(range, el)) return false;
|
|
547
617
|
}
|
|
548
|
-
var range = sel.getRangeAt(0);
|
|
549
|
-
if (!range.collapsed || !el.contains(range.startContainer)) return false;
|
|
550
|
-
/* 只认「chip 之后、hint 之前」这一个落点;caret 在别处时 Tab 仍归浏览器,
|
|
551
|
-
* 避免在任意位置误吞焦点切换。 */
|
|
552
|
-
if (!isCaretBeforeHint(range, el)) return false;
|
|
553
618
|
var text = (_hint$textContent = hint.textContent) !== null && _hint$textContent !== void 0 ? _hint$textContent : '';
|
|
554
619
|
if (!text) return false;
|
|
555
620
|
|
|
@@ -566,6 +631,7 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
|
|
|
566
631
|
caret.collapse(true);
|
|
567
632
|
sel.removeAllRanges();
|
|
568
633
|
sel.addRange(caret);
|
|
634
|
+
lastEditorRangeRef.current = caret.cloneRange();
|
|
569
635
|
}
|
|
570
636
|
fireChange();
|
|
571
637
|
recomputeTrigger();
|
|
@@ -1061,6 +1127,17 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
|
|
|
1061
1127
|
if (e.button !== 0 || disabled) return;
|
|
1062
1128
|
// shift+click 是扩选,不劫持
|
|
1063
1129
|
if (e.shiftKey) return;
|
|
1130
|
+
|
|
1131
|
+
/* 「TAB 采纳」小块:点它等价于按 Tab(同一条采纳链路),且不要求点击前
|
|
1132
|
+
* caret 就停在 hint 之前。在 mousedown 阶段接管 + preventDefault,
|
|
1133
|
+
* 原生 caret 一帧都不会落到 hint 之后。 */
|
|
1134
|
+
if (e.target instanceof Element && e.target.closest(COMPOSER_HINT_ACCEPT_SELECTOR)) {
|
|
1135
|
+
e.preventDefault();
|
|
1136
|
+
acceptHintAsText({
|
|
1137
|
+
force: true
|
|
1138
|
+
});
|
|
1139
|
+
return;
|
|
1140
|
+
}
|
|
1064
1141
|
var el = editorRef.current;
|
|
1065
1142
|
var hint = hintNodeRef.current;
|
|
1066
1143
|
if (!el || !hint || !hint.isConnected) return;
|
|
@@ -1091,7 +1168,7 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
|
|
|
1091
1168
|
});
|
|
1092
1169
|
placeCaretBeforeHint();
|
|
1093
1170
|
requestScrollCaretIntoView();
|
|
1094
|
-
}, [disabled, handlePointerInput, placeCaretBeforeHint, requestScrollCaretIntoView]);
|
|
1171
|
+
}, [acceptHintAsText, disabled, handlePointerInput, placeCaretBeforeHint, requestScrollCaretIntoView]);
|
|
1095
1172
|
var writeClipboardPayload = useCallback(function (e, payload) {
|
|
1096
1173
|
if (!payload) return false;
|
|
1097
1174
|
e.clipboardData.setData(COMPOSER_CLIPBOARD_MIME, JSON.stringify(payload));
|
|
@@ -309,6 +309,74 @@
|
|
|
309
309
|
white-space: pre-wrap;
|
|
310
310
|
}
|
|
311
311
|
|
|
312
|
+
/* ------------------------------------------------------------------
|
|
313
|
+
* hint 末尾的「TAB 采纳」小块(点击 = 按 Tab 采纳,见 editor.tsx)
|
|
314
|
+
*
|
|
315
|
+
* 与 hint 文本是同级节点,一起增删。它不是正文:contentEditable=false、
|
|
316
|
+
* getPlainText 整棵跳过,点它走 force 版 acceptHintAsText。
|
|
317
|
+
* 尺寸对齐 Figma 9857:75425(62 × 22 / 圆角 6 / 内层键帽 28 × 16):
|
|
318
|
+
* - 编辑器固定 font-size 14 / line-height 24,块高 22 + top 1 → 视觉居中
|
|
319
|
+
* 且不撑高行盒(改编辑器行高时要同步调这个 1px)
|
|
320
|
+
* - 底色 black-2(5%)、键帽 bg-elevated + black-5(12%) 1px 描边
|
|
321
|
+
* ----------------------------------------------------------------- */
|
|
322
|
+
[data-odn-composer] [data-odn-composer-hint-accept] {
|
|
323
|
+
display: inline-flex;
|
|
324
|
+
align-items: center;
|
|
325
|
+
justify-content: center;
|
|
326
|
+
gap: 3px;
|
|
327
|
+
box-sizing: border-box;
|
|
328
|
+
height: 22px;
|
|
329
|
+
margin: 1px 0 0 4px;
|
|
330
|
+
padding: 0 4px 0 3px;
|
|
331
|
+
border-radius: 6px;
|
|
332
|
+
background: var(--odn-color-black-2);
|
|
333
|
+
color: var(--odn-color-solid-black-9);
|
|
334
|
+
font-size: 12px;
|
|
335
|
+
line-height: 20px;
|
|
336
|
+
white-space: nowrap;
|
|
337
|
+
vertical-align: top;
|
|
338
|
+
cursor: pointer;
|
|
339
|
+
user-select: none;
|
|
340
|
+
pointer-events: auto;
|
|
341
|
+
transition: background 0.15s ease-out, color 0.15s ease-out;
|
|
342
|
+
/* 底部 5% 太淡,hover 抬到 12%(约 2.4 倍)并加深文字,让「可点」更明确;
|
|
343
|
+
* active 再深一档。 */
|
|
344
|
+
}
|
|
345
|
+
[data-odn-composer] [data-odn-composer-hint-accept]:hover {
|
|
346
|
+
background: var(--odn-color-black-5);
|
|
347
|
+
color: var(--odn-color-solid-black-10);
|
|
348
|
+
}
|
|
349
|
+
[data-odn-composer] [data-odn-composer-hint-accept]:active {
|
|
350
|
+
background: var(--odn-color-black-6);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
[data-odn-composer] [data-odn-composer-hint-accept-key] {
|
|
354
|
+
display: inline-flex;
|
|
355
|
+
align-items: center;
|
|
356
|
+
justify-content: center;
|
|
357
|
+
box-sizing: border-box;
|
|
358
|
+
height: 16px;
|
|
359
|
+
padding: 0 4px;
|
|
360
|
+
border: 1px solid var(--odn-color-black-5);
|
|
361
|
+
border-radius: 4px;
|
|
362
|
+
/* 与 composer box 同为「浮在底层之上的面」,跟随主题变量而不是写死白色 */
|
|
363
|
+
background: var(--odn-color-bg-elevated);
|
|
364
|
+
font-size: 10px;
|
|
365
|
+
line-height: 10px;
|
|
366
|
+
letter-spacing: 0;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
[data-odn-composer] [data-odn-composer-hint-accept-label] {
|
|
370
|
+
font-size: 12px;
|
|
371
|
+
line-height: 20px;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/* 禁用态:hint 仍按内容结构展示,但小块不可点(与 editor 冻结一致) */
|
|
375
|
+
[data-odn-composer] [data-odn-composer-editor][data-odn-composer-editor-disabled] [data-odn-composer-hint-accept] {
|
|
376
|
+
cursor: not-allowed;
|
|
377
|
+
pointer-events: none;
|
|
378
|
+
}
|
|
379
|
+
|
|
312
380
|
/* ------------------------------------------------------------------
|
|
313
381
|
* Block 行模型(caret-rewrite step 1/5)
|
|
314
382
|
* editor 直接子节点都是 [data-composer-line] div,每行渲染为独立 block。
|
package/dist/composer/utils.d.ts
CHANGED
|
@@ -22,6 +22,15 @@ export declare const LINE_ATTR_NAME = "data-composer-line";
|
|
|
22
22
|
*/
|
|
23
23
|
export declare const COMPOSER_HINT_ATTR = "data-odn-composer-skill-hint";
|
|
24
24
|
export declare const COMPOSER_HINT_SELECTOR = "[data-odn-composer-skill-hint]";
|
|
25
|
+
/**
|
|
26
|
+
* 派生 hint 末尾的「TAB 采纳」小块(可点击采纳)。
|
|
27
|
+
*
|
|
28
|
+
* 与 hint 文本是**兄弟节点**(不是子节点):hint 自身的 `textContent` 必须
|
|
29
|
+
* 保持纯提示文案——采纳时直接把这段文字落成正文,且 `getPlainText` /
|
|
30
|
+
* 调试面板都按 textContent 读它。小块同样不是正文,遍历时整棵跳过。
|
|
31
|
+
*/
|
|
32
|
+
export declare const COMPOSER_HINT_ACCEPT_ATTR = "data-odn-composer-hint-accept";
|
|
33
|
+
export declare const COMPOSER_HINT_ACCEPT_SELECTOR = "[data-odn-composer-hint-accept]";
|
|
25
34
|
/** 是否是行容器。 */
|
|
26
35
|
export declare function isLineRoot(node: Node | null | undefined): node is HTMLDivElement;
|
|
27
36
|
/** 创建一个新的空行容器。 */
|
package/dist/composer/utils.js
CHANGED
|
@@ -39,6 +39,16 @@ export var LINE_ATTR_NAME = 'data-composer-line';
|
|
|
39
39
|
export var COMPOSER_HINT_ATTR = 'data-odn-composer-skill-hint';
|
|
40
40
|
export var COMPOSER_HINT_SELECTOR = "[".concat(COMPOSER_HINT_ATTR, "]");
|
|
41
41
|
|
|
42
|
+
/**
|
|
43
|
+
* 派生 hint 末尾的「TAB 采纳」小块(可点击采纳)。
|
|
44
|
+
*
|
|
45
|
+
* 与 hint 文本是**兄弟节点**(不是子节点):hint 自身的 `textContent` 必须
|
|
46
|
+
* 保持纯提示文案——采纳时直接把这段文字落成正文,且 `getPlainText` /
|
|
47
|
+
* 调试面板都按 textContent 读它。小块同样不是正文,遍历时整棵跳过。
|
|
48
|
+
*/
|
|
49
|
+
export var COMPOSER_HINT_ACCEPT_ATTR = 'data-odn-composer-hint-accept';
|
|
50
|
+
export var COMPOSER_HINT_ACCEPT_SELECTOR = "[".concat(COMPOSER_HINT_ACCEPT_ATTR, "]");
|
|
51
|
+
|
|
42
52
|
/** 是否是行容器。 */
|
|
43
53
|
export function isLineRoot(node) {
|
|
44
54
|
var _hasAttribute, _ref;
|
|
@@ -292,8 +302,8 @@ export function getPlainText(editor) {
|
|
|
292
302
|
var out = '';
|
|
293
303
|
var visit = function visit(node) {
|
|
294
304
|
if (node instanceof HTMLElement) {
|
|
295
|
-
// 派生 hint
|
|
296
|
-
if (node.hasAttribute(COMPOSER_HINT_ATTR)) return;
|
|
305
|
+
// 派生 hint(含末尾的「TAB 采纳」小块)整棵子树都不是正文,直接跳过
|
|
306
|
+
if (node.hasAttribute(COMPOSER_HINT_ATTR) || node.hasAttribute(COMPOSER_HINT_ACCEPT_ATTR)) return;
|
|
297
307
|
var id = node.dataset[chipIdAttr];
|
|
298
308
|
if (id) {
|
|
299
309
|
out += createMarker(id);
|
|
@@ -482,7 +482,6 @@ var DatePicker = function DatePicker(props) {
|
|
|
482
482
|
};
|
|
483
483
|
var handleCaptionHoverEnter = function handleCaptionHoverEnter(e) {
|
|
484
484
|
var _popupRef$current2, _popupRef$current3;
|
|
485
|
-
e.persist();
|
|
486
485
|
clearTimeout(navHoverFillTimer.current);
|
|
487
486
|
if (!navHoverFillInnerRef.current || !navHoverFillRef.current) {
|
|
488
487
|
return;
|
|
@@ -517,7 +516,6 @@ var DatePicker = function DatePicker(props) {
|
|
|
517
516
|
}
|
|
518
517
|
};
|
|
519
518
|
var handleCaptionHoverLeave = function handleCaptionHoverLeave(e) {
|
|
520
|
-
e.persist();
|
|
521
519
|
clearTimeout(navHoverFillTimer.current);
|
|
522
520
|
if (!navHoverFillInnerRef.current || !navHoverFillRef.current) {
|
|
523
521
|
return;
|
|
@@ -567,7 +565,6 @@ var DatePicker = function DatePicker(props) {
|
|
|
567
565
|
};
|
|
568
566
|
var handleTdHoverEnter = function handleTdHoverEnter(e) {
|
|
569
567
|
var _popupRef$current4, _popupRef$current5, _target$parentElement;
|
|
570
|
-
e.persist();
|
|
571
568
|
clearTimeout(tdHoverFillTimer.current);
|
|
572
569
|
if (!tdHoverFillInnerRef.current || !tdHoverFillRef.current) {
|
|
573
570
|
return;
|
|
@@ -607,7 +604,6 @@ var DatePicker = function DatePicker(props) {
|
|
|
607
604
|
}
|
|
608
605
|
};
|
|
609
606
|
var handleTdHoverLeave = function handleTdHoverLeave(e) {
|
|
610
|
-
e.persist();
|
|
611
607
|
clearTimeout(tdHoverFillTimer.current);
|
|
612
608
|
if (!tdHoverFillInnerRef.current || !tdHoverFillRef.current) {
|
|
613
609
|
return;
|
|
@@ -340,7 +340,6 @@ var DateRangePicker = function DateRangePicker(_ref) {
|
|
|
340
340
|
};
|
|
341
341
|
var handleCaptionHoverEnter = function handleCaptionHoverEnter(e) {
|
|
342
342
|
var _popupRef$current2, _popupRef$current3;
|
|
343
|
-
e.persist();
|
|
344
343
|
clearTimeout(navHoverFillTimer.current);
|
|
345
344
|
if (!navHoverFillInnerRef.current || !navHoverFillRef.current) {
|
|
346
345
|
return;
|
|
@@ -375,7 +374,6 @@ var DateRangePicker = function DateRangePicker(_ref) {
|
|
|
375
374
|
}
|
|
376
375
|
};
|
|
377
376
|
var handleCaptionHoverLeave = function handleCaptionHoverLeave(e) {
|
|
378
|
-
e.persist();
|
|
379
377
|
clearTimeout(navHoverFillTimer.current);
|
|
380
378
|
if (!navHoverFillInnerRef.current || !navHoverFillRef.current) {
|
|
381
379
|
return;
|
|
@@ -425,7 +423,6 @@ var DateRangePicker = function DateRangePicker(_ref) {
|
|
|
425
423
|
};
|
|
426
424
|
var handleTdHoverEnter = function handleTdHoverEnter(e) {
|
|
427
425
|
var _popupRef$current4, _popupRef$current5;
|
|
428
|
-
e.persist();
|
|
429
426
|
clearTimeout(tdHoverFillTimer.current);
|
|
430
427
|
if (!tdHoverFillInnerRef.current || !tdHoverFillRef.current) {
|
|
431
428
|
return;
|
|
@@ -459,7 +456,6 @@ var DateRangePicker = function DateRangePicker(_ref) {
|
|
|
459
456
|
}
|
|
460
457
|
};
|
|
461
458
|
var handleTdHoverLeave = function handleTdHoverLeave(e) {
|
|
462
|
-
e.persist();
|
|
463
459
|
clearTimeout(tdHoverFillTimer.current);
|
|
464
460
|
if (!tdHoverFillInnerRef.current || !tdHoverFillRef.current) {
|
|
465
461
|
return;
|
package/dist/dropdown/index.js
CHANGED
|
@@ -612,7 +612,7 @@ var Dropdown = function Dropdown(props) {
|
|
|
612
612
|
_useState2 = _slicedToArray(_useState, 2),
|
|
613
613
|
hoverOpen = _useState2[0],
|
|
614
614
|
setHoverOpen = _useState2[1];
|
|
615
|
-
var hoverTimeoutRef = useRef();
|
|
615
|
+
var hoverTimeoutRef = useRef(undefined);
|
|
616
616
|
var containerRef = useRef(null);
|
|
617
617
|
|
|
618
618
|
// 检查是否为选择模式
|
package/dist/hover-fill/index.js
CHANGED
|
@@ -8,6 +8,7 @@ var _excluded = ["bgClassName", "bgStyle", "children", "onMouseEnter", "onMouseL
|
|
|
8
8
|
import React, { forwardRef, useCallback, useContext, useEffect, useLayoutEffect, useRef } from 'react';
|
|
9
9
|
import { observeResize } from "../_util/sharedResizeObserver";
|
|
10
10
|
import { ConfigContext } from "../config-provider";
|
|
11
|
+
import { useForkRef } from "../pop-base/useForkRef";
|
|
11
12
|
import "./style";
|
|
12
13
|
var DEFAULT_HOVER_COLOR = 'var(--odn-color-black-2)';
|
|
13
14
|
var DEFAULT_ACTIVE_COLOR = 'var(--odn-color-black-6)';
|
|
@@ -141,7 +142,10 @@ var HoverFill = /*#__PURE__*/forwardRef(function (_ref, outerRef) {
|
|
|
141
142
|
_useContext$hoverFill = _useContext.hoverFill,
|
|
142
143
|
hoverFillConfig = _useContext$hoverFill === void 0 ? {} : _useContext$hoverFill;
|
|
143
144
|
var innerRef = useRef(null);
|
|
144
|
-
|
|
145
|
+
/* Keep innerRef for .current; merge outer (Popover/Tooltip setReference)
|
|
146
|
+
* via useForkRef. `outerRef || innerRef` breaks when outerRef is a
|
|
147
|
+
* callback under React 19 / floating-ui. */
|
|
148
|
+
var setRef = useForkRef(outerRef, innerRef);
|
|
145
149
|
var bgRef = useRef(null);
|
|
146
150
|
var disabledRef = useRef(disabled);
|
|
147
151
|
var hoverColorRef = useRef(hoverColor);
|
|
@@ -149,7 +153,7 @@ var HoverFill = /*#__PURE__*/forwardRef(function (_ref, outerRef) {
|
|
|
149
153
|
hoverColorRef.current = hoverColor;
|
|
150
154
|
var syncBgSize = useCallback(function () {
|
|
151
155
|
var _window$odnHoverFillS4;
|
|
152
|
-
var root =
|
|
156
|
+
var root = innerRef.current;
|
|
153
157
|
if (!root || !bgRef.current) {
|
|
154
158
|
return;
|
|
155
159
|
}
|
|
@@ -157,17 +161,16 @@ var HoverFill = /*#__PURE__*/forwardRef(function (_ref, outerRef) {
|
|
|
157
161
|
bgRef.current.style.width = "".concat(root.offsetWidth, "px");
|
|
158
162
|
bgRef.current.style.height = "".concat(root.offsetHeight, "px");
|
|
159
163
|
}
|
|
160
|
-
}, [
|
|
164
|
+
}, []);
|
|
161
165
|
var handleMouseEnter = function handleMouseEnter(e) {
|
|
162
166
|
var _window$odnHoverFillS5;
|
|
163
|
-
e.persist();
|
|
164
167
|
if (disabled) {
|
|
165
168
|
return;
|
|
166
169
|
}
|
|
167
170
|
if ((_window$odnHoverFillS5 = window.odnHoverFillState) !== null && _window$odnHoverFillS5 !== void 0 && _window$odnHoverFillS5.timer) {
|
|
168
171
|
clearTimeout(window.odnHoverFillState.timer);
|
|
169
172
|
}
|
|
170
|
-
var root =
|
|
173
|
+
var root = innerRef.current || e.currentTarget;
|
|
171
174
|
if (onMouseEnter) {
|
|
172
175
|
onMouseEnter(e);
|
|
173
176
|
}
|
|
@@ -246,11 +249,10 @@ var HoverFill = /*#__PURE__*/forwardRef(function (_ref, outerRef) {
|
|
|
246
249
|
};
|
|
247
250
|
var handleMouseLeave = function handleMouseLeave(e) {
|
|
248
251
|
var _window$odnHoverFillS9;
|
|
249
|
-
e.persist();
|
|
250
252
|
if (disabled) {
|
|
251
253
|
return;
|
|
252
254
|
}
|
|
253
|
-
var root =
|
|
255
|
+
var root = innerRef.current || e.currentTarget;
|
|
254
256
|
if (root && e.relatedTarget instanceof Node && root.contains(e.relatedTarget)) {
|
|
255
257
|
return;
|
|
256
258
|
}
|
|
@@ -338,7 +340,7 @@ var HoverFill = /*#__PURE__*/forwardRef(function (_ref, outerRef) {
|
|
|
338
340
|
if (!bg) {
|
|
339
341
|
return;
|
|
340
342
|
}
|
|
341
|
-
var root =
|
|
343
|
+
var root = innerRef.current;
|
|
342
344
|
var hovering = Boolean(root === null || root === void 0 ? void 0 : root.matches(':hover'));
|
|
343
345
|
bg.style.background = hovering ? hoverColorRef.current : 'transparent';
|
|
344
346
|
if (!hovering && (state === null || state === void 0 ? void 0 : state.bgNode) === bg) {
|
|
@@ -347,7 +349,6 @@ var HoverFill = /*#__PURE__*/forwardRef(function (_ref, outerRef) {
|
|
|
347
349
|
});
|
|
348
350
|
};
|
|
349
351
|
var handleMouseDown = function handleMouseDown(e) {
|
|
350
|
-
e.persist();
|
|
351
352
|
if (disabled) {
|
|
352
353
|
return;
|
|
353
354
|
}
|
|
@@ -379,12 +380,12 @@ var HoverFill = /*#__PURE__*/forwardRef(function (_ref, outerRef) {
|
|
|
379
380
|
};
|
|
380
381
|
}, []);
|
|
381
382
|
useEffect(function () {
|
|
382
|
-
var root =
|
|
383
|
+
var root = innerRef.current;
|
|
383
384
|
if (!root) {
|
|
384
385
|
return;
|
|
385
386
|
}
|
|
386
387
|
return observeResize(root, syncBgSize);
|
|
387
|
-
}, [
|
|
388
|
+
}, [syncBgSize]);
|
|
388
389
|
useLayoutEffect(function () {
|
|
389
390
|
if (!disabled) {
|
|
390
391
|
return;
|
|
@@ -392,7 +393,7 @@ var HoverFill = /*#__PURE__*/forwardRef(function (_ref, outerRef) {
|
|
|
392
393
|
cancelPendingHandoff();
|
|
393
394
|
resetBgInline(bgRef.current);
|
|
394
395
|
var state = window.odnHoverFillState;
|
|
395
|
-
var root =
|
|
396
|
+
var root = innerRef.current;
|
|
396
397
|
if (state !== null && state !== void 0 && state.bgVisible && root !== null && root !== void 0 && root.matches(':hover')) {
|
|
397
398
|
clearHoverFillState(true);
|
|
398
399
|
return;
|
|
@@ -400,16 +401,16 @@ var HoverFill = /*#__PURE__*/forwardRef(function (_ref, outerRef) {
|
|
|
400
401
|
if ((state === null || state === void 0 ? void 0 : state.bgNode) === bgRef.current || (state === null || state === void 0 ? void 0 : state.baseNode) === root) {
|
|
401
402
|
clearHoverFillState(true);
|
|
402
403
|
}
|
|
403
|
-
}, [disabled
|
|
404
|
-
return /*#__PURE__*/React.createElement("div", _extends({
|
|
405
|
-
ref:
|
|
404
|
+
}, [disabled]);
|
|
405
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, props, {
|
|
406
|
+
ref: setRef,
|
|
406
407
|
"data-odn-hover-fill": true,
|
|
407
408
|
"data-odn-hover-fill-disabled": disabled,
|
|
408
409
|
onMouseEnter: handleMouseEnter,
|
|
409
410
|
onMouseLeave: handleMouseLeave,
|
|
410
411
|
onMouseDown: handleMouseDown,
|
|
411
412
|
style: _objectSpread(_objectSpread({}, props.style), {}, _defineProperty({}, '--odn-hoverfill-cursor', hoverCursor))
|
|
412
|
-
}
|
|
413
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
413
414
|
"data-odn-hover-fill-content": true
|
|
414
415
|
}, children), /*#__PURE__*/React.createElement("i", {
|
|
415
416
|
ref: bgRef,
|