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.
@@ -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
  }
@@ -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, useState, useRef } from 'react';
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 != null && _typeof(p) === 'object' && Object.keys(p).length > 0;
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
  })) {
@@ -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;
@@ -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
- if (cur === node) {
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 采纳 hint
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 || sel.rangeCount === 0) {
546
- return false;
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。
@@ -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
  /** 创建一个新的空行容器。 */
@@ -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;
@@ -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
  // 检查是否为选择模式
@@ -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
- var ref = outerRef || innerRef;
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 = ref.current;
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
- }, [ref]);
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 = ref.current || e.currentTarget;
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 = ref.current || e.currentTarget;
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 = ref.current;
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 = ref.current;
383
+ var root = innerRef.current;
383
384
  if (!root) {
384
385
  return;
385
386
  }
386
387
  return observeResize(root, syncBgSize);
387
- }, [ref, syncBgSize]);
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 = ref.current;
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, ref]);
404
- return /*#__PURE__*/React.createElement("div", _extends({
405
- ref: 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
- }, props), /*#__PURE__*/React.createElement("div", {
413
+ }), /*#__PURE__*/React.createElement("div", {
413
414
  "data-odn-hover-fill-content": true
414
415
  }, children), /*#__PURE__*/React.createElement("i", {
415
416
  ref: bgRef,