niuma-ui 2.1.4 → 2.1.6

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/CHANGELOG.md CHANGED
@@ -6,6 +6,21 @@
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.1.6] - 2026-10-08
10
+
11
+ ### 修复
12
+
13
+ - `RsContextMenu`:页面上任意元素滚动都会关掉已打开的菜单。旁边面板(例如流式输出把消息列表往下滚)会把另一侧的右键清掉。现在只在触发器自己的滚动链上关闭:滚动的节点包含触发器,或触发器包含该节点。菜单内部滚动仍不关闭;点菜单外空白处仍关闭。
14
+
15
+ ## [2.1.5] - 2026-09-28
16
+
17
+ ### 变更
18
+
19
+ - 发版:推到 `main` 后,**Release** 读取 changelog 第一条 `## [x.y.z]`(含 `x.y.z-beta.1` 这类预发布)。与 `package.json` 的 `version` 不一致则失败;`vX.Y.Z` 已存在则跳过。新版本先跑 `pnpm test` 和 `pnpm build`,再打附注 tag(说明是 `niuma-ui X.Y.Z` 加上该版本段落)。Actions 令牌推 tag 不会触发其它工作流,随后以 `workflow_dispatch` 启动 **Publish**(npm 与 GitHub Release)。同一提交的文档站仍由推 `main` 时的 **Deploy Docs** 部署。步骤见 `CONTRIBUTING.md`。
20
+
21
+ ### 修复
22
+
23
+ - `RsMenu`:折叠后悬停弹出的子菜单,模板 ref 可能不是元素,`ResizeObserver.observe` 会抛错,浮层尺寸变化后不再重新摆放。ref 现在只保留 `HTMLElement`;定位和点击外部关闭也先确认是元素。
9
24
 
10
25
  ## [2.1.4] - 2026-09-23
11
26
 
@@ -522,6 +522,10 @@ var RsContextMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
522
522
  if (!open.value) return;
523
523
  const target = event.target;
524
524
  if (target instanceof Node && isInsideMenu(target)) return;
525
+ const trigger = triggerEl.value;
526
+ if (trigger && target instanceof Node) {
527
+ if (!(target.contains(trigger) || trigger.contains(target))) return;
528
+ }
525
529
  restoreOnClose = false;
526
530
  setOpen(false);
527
531
  }
@@ -214,12 +214,16 @@ var RsMenuItems_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
214
214
  const themed = el.closest("[data-rs-theme]");
215
215
  flyoutTheme.value = themed instanceof HTMLElement ? themed.dataset.rsTheme : void 0;
216
216
  }
217
+ function setFlyoutEl(el) {
218
+ flyoutEl.value = el instanceof HTMLElement ? el : null;
219
+ }
217
220
  function placeFlyout() {
218
221
  if (typeof window === "undefined" || !flyoutKey.value) return;
219
222
  const trigger = triggerEls.get(flyoutKey.value);
220
223
  if (!trigger) return;
221
224
  const anchor = trigger.getBoundingClientRect();
222
- const measured = flyoutEl.value?.getBoundingClientRect();
225
+ const panel = flyoutEl.value;
226
+ const measured = panel instanceof HTMLElement ? panel.getBoundingClientRect() : void 0;
223
227
  flyoutBox.value = placeSidePopup({
224
228
  top: anchor.top,
225
229
  left: anchor.left,
@@ -245,7 +249,7 @@ var RsMenuItems_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
245
249
  const target = event.target;
246
250
  if (!(target instanceof Node)) return;
247
251
  if ((flyoutKey.value ? triggerEls.get(flyoutKey.value) : null)?.contains(target)) return;
248
- if (flyoutEl.value?.contains(target)) return;
252
+ if (flyoutEl.value instanceof HTMLElement && flyoutEl.value.contains(target)) return;
249
253
  closeFlyout();
250
254
  }
251
255
  function onDocKeydown(event) {
@@ -291,10 +295,11 @@ var RsMenuItems_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
291
295
  syncFlyoutTheme(triggerEls.get(key) ?? null);
292
296
  attachOverlay();
293
297
  nextTick(() => {
294
- if (flyoutEl.value && typeof ResizeObserver !== "undefined") {
298
+ const panel = flyoutEl.value;
299
+ if (panel instanceof HTMLElement && typeof ResizeObserver !== "undefined") {
295
300
  panelResize?.disconnect();
296
301
  panelResize = new ResizeObserver(() => requestPlace());
297
- panelResize.observe(flyoutEl.value);
302
+ panelResize.observe(panel);
298
303
  }
299
304
  requestPlace();
300
305
  });
@@ -540,8 +545,7 @@ var RsMenuItems_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
540
545
  to: portalTarget.value
541
546
  }, [createElementVNode("section", {
542
547
  ref_for: true,
543
- ref_key: "flyoutEl",
544
- ref: flyoutEl,
548
+ ref: setFlyoutEl,
545
549
  class: "rs-menu__flyout",
546
550
  "aria-label": item.label,
547
551
  "data-rs-theme": flyoutTheme.value,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "niuma-ui",
3
- "version": "2.1.4",
3
+ "version": "2.1.6",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "description": "Vue 3 workbench design system — Rs* components, --rs-* tokens, optional Monaco / CodeMirror / xterm",