one-design-next 0.0.83 → 0.0.85

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.
@@ -187,27 +187,35 @@ export var Composer = /*#__PURE__*/forwardRef(function Composer(_ref, ref) {
187
187
  setTriggerActiveIndex = _useState8[1];
188
188
  /** trigger menu 的命令式句柄:导航语义在 SkillSlot 内,composer 只转发 ↑↓。 */
189
189
  var triggerSkillSlotRef = useRef(null);
190
- /** lite 模式下由内容高度驱动的单行 / 多行布局状态。 */
190
+ /** 同步标记:handleTriggerKeyDown 已在本轮事件中取消了 trigger,
191
+ * onPressEnter 检测此标记以跳过 stale triggerMenuVisible 拦截。 */
192
+ var triggerDismissedRef = useRef(false);
193
+ /** 当 trigger 被 dismiss(无匹配 skill 按 Enter)时跳过 Popover 关闭动画 */
191
194
  var _useState9 = useState(false),
192
195
  _useState10 = _slicedToArray(_useState9, 2),
193
- expanded = _useState10[0],
194
- setExpanded = _useState10[1];
195
- /** full 模式下由右上角按钮控制的 50vh 展开态。 */
196
+ skipTriggerTransition = _useState10[0],
197
+ setSkipTriggerTransition = _useState10[1];
198
+ /** lite 模式下由内容高度驱动的单行 / 多行布局状态。 */
196
199
  var _useState11 = useState(false),
197
200
  _useState12 = _slicedToArray(_useState11, 2),
198
- fullExpanded = _useState12[0],
199
- setFullExpanded = _useState12[1];
200
- /** ComposerEditor 反馈的 editor 自然高度(offsetHeight,未 clamp),用于 lite 升格判断 */
201
- var _useState13 = useState(0),
201
+ expanded = _useState12[0],
202
+ setExpanded = _useState12[1];
203
+ /** full 模式下由右上角按钮控制的 50vh 展开态。 */
204
+ var _useState13 = useState(false),
202
205
  _useState14 = _slicedToArray(_useState13, 2),
203
- editorHeight = _useState14[0],
204
- setEditorHeight = _useState14[1];
206
+ fullExpanded = _useState14[0],
207
+ setFullExpanded = _useState14[1];
208
+ /** ComposerEditor 反馈的 editor 自然高度(offsetHeight,未 clamp),用于 lite 升格判断 */
209
+ var _useState15 = useState(0),
210
+ _useState16 = _slicedToArray(_useState15, 2),
211
+ editorHeight = _useState16[0],
212
+ setEditorHeight = _useState16[1];
205
213
  /** editor 内容是否真正达到 maxRows 触顶——配合 SCSS 控制 viewport overflow,
206
214
  * 阻止升格 transition / 换行未触顶时的 scrollbar 闪现 */
207
- var _useState15 = useState(false),
208
- _useState16 = _slicedToArray(_useState15, 2),
209
- atMax = _useState16[0],
210
- setAtMax = _useState16[1];
215
+ var _useState17 = useState(false),
216
+ _useState18 = _slicedToArray(_useState17, 2),
217
+ atMax = _useState18[0],
218
+ setAtMax = _useState18[1];
211
219
  var fileInputRef = useRef(null);
212
220
  var editorRef = useRef(null);
213
221
  var boxRef = useRef(null);
@@ -226,10 +234,10 @@ export var Composer = /*#__PURE__*/forwardRef(function Composer(_ref, ref) {
226
234
  preventScroll: true
227
235
  });
228
236
  }, [disabled]);
229
- var _useState17 = useState(null),
230
- _useState18 = _slicedToArray(_useState17, 2),
231
- paramEdit = _useState18[0],
232
- setParamEdit = _useState18[1];
237
+ var _useState19 = useState(null),
238
+ _useState20 = _slicedToArray(_useState19, 2),
239
+ paramEdit = _useState20[0],
240
+ setParamEdit = _useState20[1];
233
241
  var openParamPanel = useCallback(function (chipId) {
234
242
  if (!renderParamPanel) return;
235
243
  requestAnimationFrame(function () {
@@ -564,10 +572,10 @@ export var Composer = /*#__PURE__*/forwardRef(function Composer(_ref, ref) {
564
572
  * 不夺回焦点时 Enter 会再次激活按钮而不是发送 */
565
573
  (_editorRef$current15 = editorRef.current) === null || _editorRef$current15 === void 0 || _editorRef$current15.focus();
566
574
  };
567
- var _useState19 = useState(false),
568
- _useState20 = _slicedToArray(_useState19, 2),
569
- fileDragOver = _useState20[0],
570
- setFileDragOver = _useState20[1];
575
+ var _useState21 = useState(false),
576
+ _useState22 = _slicedToArray(_useState21, 2),
577
+ fileDragOver = _useState22[0],
578
+ setFileDragOver = _useState22[1];
571
579
  var composerBoxFileDragAttrs = fileDragOver ? {
572
580
  'data-odn-composer-file-drag': ''
573
581
  } : {};
@@ -686,18 +694,26 @@ export var Composer = /*#__PURE__*/forwardRef(function Composer(_ref, ref) {
686
694
  return true;
687
695
  }
688
696
  if (e.key === 'Enter' && !e.shiftKey || e.key === 'Tab') {
689
- var _ref6, _triggerSkillSlotRef$3, _triggerSkillSlotRef$4;
690
- e.preventDefault();
697
+ var _ref6, _triggerSkillSlotRef$3, _triggerSkillSlotRef$4, _editorRef$current19;
691
698
  var _skill = (_ref6 = (_triggerSkillSlotRef$3 = (_triggerSkillSlotRef$4 = triggerSkillSlotRef.current) === null || _triggerSkillSlotRef$4 === void 0 ? void 0 : _triggerSkillSlotRef$4.getActiveSkill()) !== null && _triggerSkillSlotRef$3 !== void 0 ? _triggerSkillSlotRef$3 : filteredSkills === null || filteredSkills === void 0 ? void 0 : filteredSkills[triggerActiveIndex]) !== null && _ref6 !== void 0 ? _ref6 : filteredSkillGroups === null || filteredSkillGroups === void 0 ? void 0 : filteredSkillGroups.flatMap(function (g) {
692
699
  return g.skills;
693
700
  })[triggerActiveIndex];
694
- if (_skill) handleSelectSkill(_skill, 'trigger');
695
- return true;
701
+ if (_skill) {
702
+ e.preventDefault();
703
+ handleSelectSkill(_skill, 'trigger');
704
+ return true;
705
+ }
706
+ /* 过滤后列表为空(无匹配 skill):取消 trigger,让 Enter 继续走发送流程 */
707
+ (_editorRef$current19 = editorRef.current) === null || _editorRef$current19 === void 0 || _editorRef$current19.cancelTrigger();
708
+ setTriggerInfo(null);
709
+ setSkipTriggerTransition(true);
710
+ triggerDismissedRef.current = true;
711
+ return false;
696
712
  }
697
713
  if (e.key === 'Escape') {
698
- var _editorRef$current19;
714
+ var _editorRef$current20;
699
715
  e.preventDefault();
700
- (_editorRef$current19 = editorRef.current) === null || _editorRef$current19 === void 0 || _editorRef$current19.cancelTrigger();
716
+ (_editorRef$current20 = editorRef.current) === null || _editorRef$current20 === void 0 || _editorRef$current20.cancelTrigger();
701
717
  setTriggerInfo(null);
702
718
  return true;
703
719
  }
@@ -705,15 +721,26 @@ export var Composer = /*#__PURE__*/forwardRef(function Composer(_ref, ref) {
705
721
  }, [filteredSkills, filteredSkillGroups, handleSelectSkill, triggerActiveIndex, triggerMenuVisible]);
706
722
 
707
723
  /* trigger 浮 anchor:跟随 caret 的 0×0 隐形元素,给 Popover 当 children。
708
- * Popover 需要 DOM children 当 reference,没有"虚拟 anchor" API,只能这么搞。 */
724
+ * Popover 需要 DOM children 当 reference,没有"虚拟 anchor" API,只能这么搞。
725
+ *
726
+ * 使用 position: absolute 而非 fixed——Drawer 等容器的 transform 会创建
727
+ * 新的 containing block,导致 fixed 定位失准。absolute 相对于最近 positioned
728
+ * 祖先([data-odn-composer] 有 position:relative),通过减去 offsetParent
729
+ * 的 viewport rect 得到正确的局部坐标。 */
709
730
  var triggerAnchorRef = useRef(null);
710
731
  useLayoutEffect(function () {
711
732
  var el = triggerAnchorRef.current;
712
733
  if (!el || !triggerInfo) return;
713
- el.style.left = "".concat(triggerInfo.rect.left, "px");
714
- /* 锚到 caret 行顶部,配合 placement=topLeft 让 menu 浮在输入内容上方,
715
- * 不遮挡正在输入的文字(空间不足时 Popover flip 会自动回落到下方)。 */
716
- el.style.top = "".concat(triggerInfo.rect.top, "px");
734
+ var offsetParent = el.offsetParent;
735
+ if (offsetParent) {
736
+ var parentRect = offsetParent.getBoundingClientRect();
737
+ el.style.left = "".concat(triggerInfo.rect.left - parentRect.left, "px");
738
+ el.style.top = "".concat(triggerInfo.rect.top - parentRect.top, "px");
739
+ } else {
740
+ // fallback:没有 offsetParent(比如 display:none),用 viewport 坐标
741
+ el.style.left = "".concat(triggerInfo.rect.left, "px");
742
+ el.style.top = "".concat(triggerInfo.rect.top, "px");
743
+ }
717
744
  }, [triggerInfo]);
718
745
 
719
746
  /* ---- Derived ---- */
@@ -1025,9 +1052,9 @@ export var Composer = /*#__PURE__*/forwardRef(function Composer(_ref, ref) {
1025
1052
  "data-odn-composer-file-input": true,
1026
1053
  onChange: handleFileChange
1027
1054
  });
1028
- var paramPanelNode = function (_editorRef$current$ge4, _editorRef$current20, _boxRef$current) {
1055
+ var paramPanelNode = function (_editorRef$current$ge4, _editorRef$current21, _boxRef$current) {
1029
1056
  if (!paramEdit || !renderParamPanel) return null;
1030
- var chips = (_editorRef$current$ge4 = (_editorRef$current20 = editorRef.current) === null || _editorRef$current20 === void 0 ? void 0 : _editorRef$current20.getChips()) !== null && _editorRef$current$ge4 !== void 0 ? _editorRef$current$ge4 : [];
1057
+ var chips = (_editorRef$current$ge4 = (_editorRef$current21 = editorRef.current) === null || _editorRef$current21 === void 0 ? void 0 : _editorRef$current21.getChips()) !== null && _editorRef$current$ge4 !== void 0 ? _editorRef$current$ge4 : [];
1031
1058
  var chip = chips.find(function (c) {
1032
1059
  return c.id === paramEdit.chipId;
1033
1060
  });
@@ -1037,8 +1064,8 @@ export var Composer = /*#__PURE__*/forwardRef(function Composer(_ref, ref) {
1037
1064
  chip: chip,
1038
1065
  anchor: paramEdit.anchor,
1039
1066
  onApply: function onApply(patch) {
1040
- var _editorRef$current21;
1041
- (_editorRef$current21 = editorRef.current) === null || _editorRef$current21 === void 0 || _editorRef$current21.updateChipData(chip.id, patch);
1067
+ var _editorRef$current22;
1068
+ (_editorRef$current22 = editorRef.current) === null || _editorRef$current22 === void 0 || _editorRef$current22.updateChipData(chip.id, patch);
1042
1069
  },
1043
1070
  onClose: closeParamPanel
1044
1071
  };
@@ -1067,7 +1094,10 @@ export var Composer = /*#__PURE__*/forwardRef(function Composer(_ref, ref) {
1067
1094
  onInlineRefClick: renderParamPanel ? handleInlineRefClick : undefined
1068
1095
  /* 本轮只接 `/`,`@` 留给业务接 mention 搜索时再加 */,
1069
1096
  triggers: ['/'],
1070
- onTriggerChange: setTriggerInfo,
1097
+ onTriggerChange: function onTriggerChange(info) {
1098
+ setTriggerInfo(info);
1099
+ if (info) setSkipTriggerTransition(false);
1100
+ },
1071
1101
  onTriggerKeyDown: handleTriggerKeyDown,
1072
1102
  onPasteFiles: addFilesFromList,
1073
1103
  onHeightChange: function onHeightChange(height, overflow) {
@@ -1079,9 +1109,14 @@ export var Composer = /*#__PURE__*/forwardRef(function Composer(_ref, ref) {
1079
1109
  onPressEnter: function onPressEnter(e) {
1080
1110
  if (e.nativeEvent.isComposing || e.keyCode === 229) return;
1081
1111
  // trigger 浮层激活时,普通 Enter 留给浮层做选择;Shift+Enter 继续换行
1112
+ // 但若 handleTriggerKeyDown 已在本轮事件中取消了 trigger(列表为空),则放行
1082
1113
  if (triggerMenuVisible && !e.shiftKey) {
1083
- e.preventDefault();
1084
- return false;
1114
+ if (triggerDismissedRef.current) {
1115
+ triggerDismissedRef.current = false;
1116
+ } else {
1117
+ e.preventDefault();
1118
+ return false;
1119
+ }
1085
1120
  }
1086
1121
  var isSubmitKey = submitType === 'enter' ? !e.shiftKey : e.shiftKey;
1087
1122
  if (!isSubmitKey) return; // 不阻止 → 让 editor 走默认 <br>
@@ -1103,11 +1138,14 @@ export var Composer = /*#__PURE__*/forwardRef(function Composer(_ref, ref) {
1103
1138
  placement: "topLeft",
1104
1139
  offset: 4,
1105
1140
  visible: triggerMenuVisible,
1141
+ transitionDuration: skipTriggerTransition ? 0 : undefined,
1106
1142
  onVisibleChange: function onVisibleChange(v) {
1107
1143
  if (!v) {
1108
- var _editorRef$current22;
1109
- (_editorRef$current22 = editorRef.current) === null || _editorRef$current22 === void 0 || _editorRef$current22.cancelTrigger();
1144
+ var _editorRef$current23;
1145
+ (_editorRef$current23 = editorRef.current) === null || _editorRef$current23 === void 0 || _editorRef$current23.cancelTrigger();
1110
1146
  setTriggerInfo(null);
1147
+ } else {
1148
+ setSkipTriggerTransition(false);
1111
1149
  }
1112
1150
  },
1113
1151
  popupClassName: "odn-composer-skill-popup",
@@ -1131,7 +1169,7 @@ export var Composer = /*#__PURE__*/forwardRef(function Composer(_ref, ref) {
1131
1169
  ref: triggerAnchorRef,
1132
1170
  "data-odn-composer-trigger-anchor": true,
1133
1171
  style: {
1134
- position: 'fixed',
1172
+ position: 'absolute',
1135
1173
  width: 0,
1136
1174
  height: 0,
1137
1175
  pointerEvents: 'none'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "one-design-next",
3
- "version": "0.0.83",
3
+ "version": "0.0.85",
4
4
  "description": "One Design Next from TAD@tencent.com",
5
5
  "license": "MIT",
6
6
  "type": "module",