one-design-next 0.0.71 → 0.0.72
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/chat-item/index.js +39 -7
- package/dist/dialog/style/index.css +1 -1
- package/dist/drawer/style/index.css +2 -0
- package/dist/dropdown/index.js +5 -2
- package/dist/icon/svg-data.d.ts +4 -0
- package/dist/icon/svg-data.js +1 -1
- package/dist/icon/types.d.ts +1 -1
- package/dist/preview-panel/index.js +55 -8
- package/dist/preview-panel/style/index.css +84 -6
- package/dist/stream-text/highlight-query-text.d.ts +8 -0
- package/dist/stream-text/highlight-query-text.js +44 -0
- package/dist/stream-text/index.d.ts +4 -2
- package/dist/stream-text/index.js +21 -16
- package/dist/stream-text/style/index.css +16 -0
- package/dist/style/base.css +1 -1
- package/dist/tooltip/index.js +25 -9
- package/dist/user-bubble/index.d.ts +4 -2
- package/dist/user-bubble/index.js +5 -3
- package/dist/user-bubble/render-segments.d.ts +1 -1
- package/dist/user-bubble/render-segments.js +7 -4
- package/package.json +1 -1
package/dist/chat-item/index.js
CHANGED
|
@@ -17,17 +17,23 @@ var ELLIPSIS = '…';
|
|
|
17
17
|
|
|
18
18
|
/** 可用宽度变化小于该值时跳过重算(与二分容差同量级) */
|
|
19
19
|
var FIT_WIDTH_EPS = 0.5;
|
|
20
|
+
/**
|
|
21
|
+
* 可用宽度低于该阈值时视为测量不可靠(布局未完成 / 被瞬时压扁)。
|
|
22
|
+
* 此时保留上一帧可读结果或原文,避免把标题裁成单独的「…」。
|
|
23
|
+
*/
|
|
24
|
+
var FIT_MIN_RELIABLE_WIDTH = 24;
|
|
20
25
|
|
|
21
26
|
/**
|
|
22
27
|
* 有 trailing(客服 icon / status / 时间)时,用 DOM 实测把标题裁到可用宽度。
|
|
23
28
|
* 解决 CSS text-overflow 按字符边界截断后,省略号右侧留白把 trailing 顶开的问题。
|
|
24
29
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
30
|
+
* 性能:RO 监听行 / label / trailing(active 时时间让位不改变行宽,必须听内部);
|
|
31
|
+
* 回调经 rAF 合并;缓存 maxWidth / trailingWidth / 裁切结果。
|
|
27
32
|
*/
|
|
28
33
|
function useFittedTitle(title, enabled, labelRef, titleRef, /** 右对齐区(状态 / 时间),量宽预留 */
|
|
29
34
|
trailingRef, /** 紧跟标题的类型 icon,量宽预留 */
|
|
30
|
-
typeIconRef
|
|
35
|
+
typeIconRef, /** active 时时间让位 / 字重变化,需强制重测 */
|
|
36
|
+
layoutKey) {
|
|
31
37
|
var _useState = useState(title),
|
|
32
38
|
_useState2 = _slicedToArray(_useState, 2),
|
|
33
39
|
fitted = _useState2[0],
|
|
@@ -41,11 +47,14 @@ typeIconRef) {
|
|
|
41
47
|
var label = labelRef.current;
|
|
42
48
|
var titleEl = titleRef.current;
|
|
43
49
|
if (!label || !titleEl) return;
|
|
50
|
+
|
|
51
|
+
// 标题变更时先回到原文,避免沿用上一会话裁成的「…」
|
|
52
|
+
setFitted(title);
|
|
44
53
|
var cancelled = false;
|
|
45
54
|
var rafId = 0;
|
|
46
55
|
var lastMaxWidth = Number.NaN;
|
|
47
56
|
var lastTrailingWidth = Number.NaN;
|
|
48
|
-
var lastFitted =
|
|
57
|
+
var lastFitted = title;
|
|
49
58
|
var probe = document.createElement('span');
|
|
50
59
|
probe.setAttribute('aria-hidden', 'true');
|
|
51
60
|
probe.style.cssText = 'position:absolute;visibility:hidden;pointer-events:none;white-space:nowrap;left:-9999px;top:0;';
|
|
@@ -80,13 +89,24 @@ typeIconRef) {
|
|
|
80
89
|
if (Number.isFinite(lastMaxWidth) && Math.abs(maxWidth - lastMaxWidth) < FIT_WIDTH_EPS && Math.abs(trailingWidth - lastTrailingWidth) < FIT_WIDTH_EPS) {
|
|
81
90
|
return;
|
|
82
91
|
}
|
|
92
|
+
|
|
93
|
+
// 布局未就绪时不要写成单独的「…」,否则行宽不变时 RO 不触发会永久卡住
|
|
94
|
+
if (maxWidth < FIT_MIN_RELIABLE_WIDTH) {
|
|
95
|
+
lastMaxWidth = Number.NaN;
|
|
96
|
+
lastTrailingWidth = Number.NaN;
|
|
97
|
+
if (lastFitted !== title) {
|
|
98
|
+
lastFitted = title;
|
|
99
|
+
setFitted(title);
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
83
103
|
lastMaxWidth = maxWidth;
|
|
84
104
|
lastTrailingWidth = trailingWidth;
|
|
85
105
|
var next = title;
|
|
86
106
|
if (measure(title) > maxWidth + FIT_WIDTH_EPS) {
|
|
87
107
|
var lo = 0;
|
|
88
108
|
var hi = title.length;
|
|
89
|
-
next =
|
|
109
|
+
next = title;
|
|
90
110
|
while (lo <= hi) {
|
|
91
111
|
var mid = lo + hi >> 1;
|
|
92
112
|
var candidate = "".concat(title.slice(0, mid)).concat(ELLIPSIS);
|
|
@@ -97,6 +117,11 @@ typeIconRef) {
|
|
|
97
117
|
hi = mid - 1;
|
|
98
118
|
}
|
|
99
119
|
}
|
|
120
|
+
// 极端窄宽仍放不下「字+…」时交给 CSS ellipsis,保留原文
|
|
121
|
+
if (next === ELLIPSIS || next === title && measure(title) > maxWidth + FIT_WIDTH_EPS) {
|
|
122
|
+
var withEllipsis = "".concat(title.slice(0, 1)).concat(ELLIPSIS);
|
|
123
|
+
next = measure(withEllipsis) <= maxWidth + FIT_WIDTH_EPS ? withEllipsis : title;
|
|
124
|
+
}
|
|
100
125
|
}
|
|
101
126
|
if (next === lastFitted) return;
|
|
102
127
|
lastFitted = next;
|
|
@@ -121,13 +146,18 @@ typeIconRef) {
|
|
|
121
146
|
var row = (_label$closest = label.closest('[data-odn-chat-item-btn]')) !== null && _label$closest !== void 0 ? _label$closest : label;
|
|
122
147
|
var ro = new ResizeObserver(scheduleFit);
|
|
123
148
|
ro.observe(row);
|
|
149
|
+
ro.observe(label);
|
|
150
|
+
var trailing = trailingRef.current;
|
|
151
|
+
if (trailing) ro.observe(trailing);
|
|
152
|
+
var typeIcon = typeIconRef.current;
|
|
153
|
+
if (typeIcon) ro.observe(typeIcon);
|
|
124
154
|
return function () {
|
|
125
155
|
cancelled = true;
|
|
126
156
|
if (rafId) window.cancelAnimationFrame(rafId);
|
|
127
157
|
ro.disconnect();
|
|
128
158
|
probe.remove();
|
|
129
159
|
};
|
|
130
|
-
}, [title, enabled, labelRef, titleRef, trailingRef, typeIconRef]);
|
|
160
|
+
}, [title, enabled, layoutKey, labelRef, titleRef, trailingRef, typeIconRef]);
|
|
131
161
|
return enabled ? fitted : title;
|
|
132
162
|
}
|
|
133
163
|
function ChatItemStatus(_ref) {
|
|
@@ -248,7 +278,8 @@ export function ChatItem(_ref2) {
|
|
|
248
278
|
var showTime = Boolean(timeLabel);
|
|
249
279
|
var showTrailing = showStatus || showTime;
|
|
250
280
|
var fitTitle = showTypeIcon || showTrailing;
|
|
251
|
-
var displayTitle = useFittedTitle(title, fitTitle, labelRef, titleRef, trailingRef, typeIconRef
|
|
281
|
+
var displayTitle = useFittedTitle(title, fitTitle, labelRef, titleRef, trailingRef, typeIconRef, // active / 菜单开合都会改时间让位与字重,行宽可能不变
|
|
282
|
+
"".concat(active ? 1 : 0, ":").concat(menuOpen ? 1 : 0));
|
|
252
283
|
useEffect(function () {
|
|
253
284
|
if (!renaming) setDraft(title);
|
|
254
285
|
}, [title, renaming]);
|
|
@@ -300,6 +331,7 @@ export function ChatItem(_ref2) {
|
|
|
300
331
|
}] : []));
|
|
301
332
|
return /*#__PURE__*/React.createElement(HoverFill, {
|
|
302
333
|
"data-odn-chat-item": true,
|
|
334
|
+
"data-odn-chat-item-id": id,
|
|
303
335
|
"data-odn-chat-item-pinned": pinned || undefined,
|
|
304
336
|
bgClassName: "odn-chat-item-btn-bg",
|
|
305
337
|
disabled: active || renaming
|
|
@@ -4,7 +4,7 @@ html {
|
|
|
4
4
|
--odn-dialog-footer-padding: 24px;
|
|
5
5
|
--odn-dialog-footer-gap: 12px;
|
|
6
6
|
--odn-dialog-footer-justify: flex-end;
|
|
7
|
-
--odn-dialog-overlay-background: rgba(0, 0, 0, 0.
|
|
7
|
+
--odn-dialog-overlay-background: rgba(0, 0, 0, 0.2);
|
|
8
8
|
--odn-dialog-border-radius: 10px;
|
|
9
9
|
--odn-dialog-close-top: 16px;
|
|
10
10
|
--odn-dialog-close-right: 16px;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
@charset "UTF-8";
|
|
2
2
|
html {
|
|
3
3
|
--odn-drawer-overlay-background: rgba(0, 0, 0, 0.45);
|
|
4
|
+
--odn-drawer-shadow: var(--odn-shadow-2);
|
|
4
5
|
--odn-drawer-header-padding-inline: 20px;
|
|
5
6
|
--odn-drawer-header-height: 64px;
|
|
6
7
|
--odn-drawer-header-border: 1px solid var(--odn-color-black-4);
|
|
@@ -79,6 +80,7 @@ html {
|
|
|
79
80
|
display: flex;
|
|
80
81
|
flex-direction: column;
|
|
81
82
|
background-color: #fff;
|
|
83
|
+
box-shadow: var(--odn-drawer-shadow);
|
|
82
84
|
pointer-events: initial;
|
|
83
85
|
overflow: auto;
|
|
84
86
|
}
|
package/dist/dropdown/index.js
CHANGED
|
@@ -886,10 +886,13 @@ var Dropdown = function Dropdown(props) {
|
|
|
886
886
|
}))));
|
|
887
887
|
}
|
|
888
888
|
|
|
889
|
-
// click
|
|
889
|
+
// click 模式:与 hover 一致使用 modal={false}。
|
|
890
|
+
// 默认 modal 会铺内部 backdrop,挂在 Drawer/Dialog 内时菜单项看起来可点但点不中
|
|
891
|
+
//(ChatItem 修改名称 / 置顶 / 删除即踩中此问题)。
|
|
890
892
|
return /*#__PURE__*/React.createElement(DropdownMenu, {
|
|
891
893
|
open: disabled ? false : finalOpen,
|
|
892
|
-
onOpenChange: handleOpenChange
|
|
894
|
+
onOpenChange: handleOpenChange,
|
|
895
|
+
modal: false
|
|
893
896
|
}, /*#__PURE__*/React.createElement(DropdownMenuTrigger, {
|
|
894
897
|
asChild: true,
|
|
895
898
|
disabled: disabled
|
package/dist/icon/svg-data.d.ts
CHANGED
|
@@ -4250,6 +4250,10 @@ export declare const svgData: {
|
|
|
4250
4250
|
readonly viewBox: "0 0 24 24";
|
|
4251
4251
|
readonly content: "<g fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 7V5a2 2 0 0 1 2-2h2\"></path><path d=\"M17 3h2a2 2 0 0 1 2 2v2\"></path><path d=\"M21 17v2a2 2 0 0 1-2 2h-2\"></path><path d=\"M7 21H5a2 2 0 0 1-2-2v-2\"></path></g>";
|
|
4252
4252
|
};
|
|
4253
|
+
readonly 'menu-line': {
|
|
4254
|
+
readonly viewBox: "0 0 24 24";
|
|
4255
|
+
readonly content: "<g fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 5h16\"></path><path d=\"M4 12h16\"></path><path d=\"M4 19h16\"></path></g>";
|
|
4256
|
+
};
|
|
4253
4257
|
readonly 'search-line': {
|
|
4254
4258
|
readonly viewBox: "0 0 24 24";
|
|
4255
4259
|
readonly content: "<g fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><path d=\"m21 21-4.3-4.3\"></path></g>";
|