one-design-next 0.0.119 → 0.0.121

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.
@@ -24,6 +24,10 @@ export interface ChatGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, 'ti
24
24
  * 左侧文件夹 icon(用户分组缩进标识)。默认 `false`。
25
25
  */
26
26
  folderIcon?: boolean;
27
+ /** 替换默认文件夹图标。 */
28
+ folder?: ReactNode;
29
+ /** 替换默认展开箭头。 */
30
+ chevron?: ReactNode;
27
31
  /**
28
32
  * 分区头样式(如「未分组」)。与 ChatList「分组」同为 12px / black-9,
29
33
  * 不是用户文件夹组。
@@ -36,6 +40,11 @@ export interface ChatGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, 'ti
36
40
  extra?: ReactNode;
37
41
  /** 强制显示 extra(如菜单打开时) */
38
42
  extraVisible?: boolean;
43
+ /**
44
+ * 标题右侧条数。平时占宽;组头悬停、键盘焦点或 `extraVisible` 时退出,
45
+ * 同一位置换成 `extra`。不传则不展示。不从 children 计数。
46
+ */
47
+ count?: ReactNode;
39
48
  /**
40
49
  * 组内每页条数。默认 5;`false` 关闭分页(搜索命中等)。
41
50
  * 首次展开与每次「展开更多」都只增加一页,收起再打开回到第一页。
@@ -48,7 +57,7 @@ export interface ChatGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, 'ti
48
57
  overflowHint?: boolean;
49
58
  children?: ReactNode;
50
59
  }
51
- export declare function ChatGroup({ title, collapsible, collapsed: collapsedProp, defaultCollapsed, onCollapsedChange, renaming: renamingProp, defaultRenaming, onRenamingChange, onRename, folderIcon, section, extra, extraVisible, previewLimit, overflowHint, children, className, ...rest }: ChatGroupProps): React.JSX.Element;
60
+ export declare function ChatGroup({ title, collapsible, collapsed: collapsedProp, defaultCollapsed, onCollapsedChange, renaming: renamingProp, defaultRenaming, onRenamingChange, onRename, folderIcon, folder, chevron, section, extra, extraVisible, count, previewLimit, overflowHint, children, className, ...rest }: ChatGroupProps): React.JSX.Element;
52
61
  export declare namespace ChatGroup {
53
62
  var displayName: string;
54
63
  }
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
3
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
4
- var _excluded = ["title", "collapsible", "collapsed", "defaultCollapsed", "onCollapsedChange", "renaming", "defaultRenaming", "onRenamingChange", "onRename", "folderIcon", "section", "extra", "extraVisible", "previewLimit", "overflowHint", "children", "className"];
4
+ var _excluded = ["title", "collapsible", "collapsed", "defaultCollapsed", "onCollapsedChange", "renaming", "defaultRenaming", "onRenamingChange", "onRename", "folderIcon", "folder", "chevron", "section", "extra", "extraVisible", "count", "previewLimit", "overflowHint", "children", "className"];
5
5
  import clsx from 'clsx';
6
6
  import React, { Children, useEffect, useLayoutEffect, useRef, useState } from 'react';
7
7
  import HoverFill from "../hover-fill";
@@ -66,10 +66,13 @@ export function ChatGroup(_ref2) {
66
66
  onRename = _ref2.onRename,
67
67
  _ref2$folderIcon = _ref2.folderIcon,
68
68
  folderIcon = _ref2$folderIcon === void 0 ? false : _ref2$folderIcon,
69
+ folder = _ref2.folder,
70
+ chevron = _ref2.chevron,
69
71
  _ref2$section = _ref2.section,
70
72
  section = _ref2$section === void 0 ? false : _ref2$section,
71
73
  extra = _ref2.extra,
72
74
  extraVisible = _ref2.extraVisible,
75
+ count = _ref2.count,
73
76
  previewLimit = _ref2.previewLimit,
74
77
  _ref2$overflowHint = _ref2.overflowHint,
75
78
  overflowHint = _ref2$overflowHint === void 0 ? true : _ref2$overflowHint,
@@ -172,15 +175,31 @@ export function ChatGroup(_ref2) {
172
175
  }, /*#__PURE__*/React.createElement("div", {
173
176
  "data-odn-chat-group-slot-inner": true
174
177
  }, expandHint)) : expandHint : null);
178
+ var showCount = !editingTitle && count !== null && count !== undefined && count !== false && count !== '';
179
+ var showExtra = Boolean(extra) && !editingTitle;
180
+ // 条数和 extra 叠在同一格里,格子宽度取两者较大值。
181
+ // 让位时只切换可见性,长标题旁的箭头不会跟着挪。
182
+ var showTrailing = showCount && showExtra ? /*#__PURE__*/React.createElement("span", {
183
+ "data-odn-chat-group-aside": true
184
+ }, /*#__PURE__*/React.createElement("span", {
185
+ "data-odn-chat-group-count": true
186
+ }, count), /*#__PURE__*/React.createElement("div", {
187
+ "data-odn-chat-group-extra": true
188
+ }, extra)) : /*#__PURE__*/React.createElement(React.Fragment, null, showCount ? /*#__PURE__*/React.createElement("span", {
189
+ "data-odn-chat-group-count": true
190
+ }, count) : null, showExtra ? /*#__PURE__*/React.createElement("div", {
191
+ "data-odn-chat-group-extra": true
192
+ }, extra) : null);
175
193
  var header = /*#__PURE__*/React.createElement("div", {
176
194
  "data-odn-chat-group-header": true
177
195
  }, editingTitle ? /*#__PURE__*/React.createElement("div", {
178
196
  "data-odn-chat-group-rename": true
179
- }, folderIcon ? /*#__PURE__*/React.createElement(Icon, {
180
- name: "folder",
181
- size: 14,
197
+ }, folderIcon ? /*#__PURE__*/React.createElement("span", {
182
198
  "data-odn-chat-group-folder-icon": true
183
- }) : null, /*#__PURE__*/React.createElement("input", {
199
+ }, folder !== null && folder !== void 0 ? folder : /*#__PURE__*/React.createElement(Icon, {
200
+ name: "folder",
201
+ size: 14
202
+ })) : null, /*#__PURE__*/React.createElement("input", {
184
203
  ref: inputRef,
185
204
  value: draft,
186
205
  "aria-label": "\u91CD\u547D\u540D\u5206\u7EC4",
@@ -208,27 +227,28 @@ export function ChatGroup(_ref2) {
208
227
  "data-odn-chat-group-trigger": true,
209
228
  onClick: toggle,
210
229
  "aria-expanded": !collapsed
211
- }, folderIcon ? /*#__PURE__*/React.createElement(Icon, {
212
- name: "folder",
213
- size: 14,
230
+ }, folderIcon ? /*#__PURE__*/React.createElement("span", {
214
231
  "data-odn-chat-group-folder-icon": true
215
- }) : null, /*#__PURE__*/React.createElement("span", {
232
+ }, folder !== null && folder !== void 0 ? folder : /*#__PURE__*/React.createElement(Icon, {
233
+ name: "folder",
234
+ size: 14
235
+ })) : null, /*#__PURE__*/React.createElement("span", {
216
236
  "data-odn-chat-group-title": true
217
- }, title), /*#__PURE__*/React.createElement(Icon, {
218
- name: "right",
219
- size: 12,
237
+ }, title), /*#__PURE__*/React.createElement("span", {
220
238
  "data-odn-chat-group-chevron": true
221
- })) : /*#__PURE__*/React.createElement("div", {
239
+ }, chevron !== null && chevron !== void 0 ? chevron : /*#__PURE__*/React.createElement(Icon, {
240
+ name: "right",
241
+ size: 12
242
+ }))) : /*#__PURE__*/React.createElement("div", {
222
243
  "data-odn-chat-group-title-row": true
223
- }, folderIcon ? /*#__PURE__*/React.createElement(Icon, {
224
- name: "folder",
225
- size: 14,
244
+ }, folderIcon ? /*#__PURE__*/React.createElement("span", {
226
245
  "data-odn-chat-group-folder-icon": true
227
- }) : null, /*#__PURE__*/React.createElement("span", {
246
+ }, folder !== null && folder !== void 0 ? folder : /*#__PURE__*/React.createElement(Icon, {
247
+ name: "folder",
248
+ size: 14
249
+ })) : null, /*#__PURE__*/React.createElement("span", {
228
250
  "data-odn-chat-group-title": true
229
- }, title)), extra && !editingTitle ? /*#__PURE__*/React.createElement("div", {
230
- "data-odn-chat-group-extra": true
231
- }, extra) : null);
251
+ }, title)), showTrailing);
232
252
  return /*#__PURE__*/React.createElement("div", _extends({
233
253
  "data-odn-chat-group": true,
234
254
  "data-odn-chat-group-collapsed": collapsed || undefined,
@@ -26,6 +26,9 @@
26
26
  [data-odn-chat-group-header]:hover, [data-odn-chat-group-header]:has(:focus-visible) {
27
27
  gap: 4px;
28
28
  }
29
+ [data-odn-chat-group-header]:hover:has([data-odn-chat-group-aside]), [data-odn-chat-group-header]:has(:focus-visible):has([data-odn-chat-group-aside]) {
30
+ gap: 0;
31
+ }
29
32
  [data-odn-chat-group-header]:hover [data-odn-chat-group-extra], [data-odn-chat-group-header]:has(:focus-visible) [data-odn-chat-group-extra] {
30
33
  flex-basis: auto;
31
34
  width: auto;
@@ -39,6 +42,10 @@
39
42
  gap: 4px;
40
43
  }
41
44
 
45
+ [data-odn-chat-group-extra-visible] [data-odn-chat-group-header]:has([data-odn-chat-group-aside]) {
46
+ gap: 0;
47
+ }
48
+
42
49
  [data-odn-chat-group-extra-visible] [data-odn-chat-group-extra] {
43
50
  flex-basis: auto;
44
51
  width: auto;
@@ -115,6 +122,51 @@
115
122
  white-space: nowrap;
116
123
  }
117
124
 
125
+ [data-odn-chat-group-count] {
126
+ flex: none;
127
+ color: var(--odn-color-black-9);
128
+ font-size: 14px;
129
+ font-weight: 400;
130
+ line-height: 22px;
131
+ }
132
+
133
+ [data-odn-chat-group-aside] {
134
+ display: grid;
135
+ flex: none;
136
+ align-items: center;
137
+ justify-items: end;
138
+ }
139
+
140
+ [data-odn-chat-group-aside] > [data-odn-chat-group-count],
141
+ [data-odn-chat-group-aside] > [data-odn-chat-group-extra] {
142
+ grid-area: 1/1;
143
+ }
144
+
145
+ [data-odn-chat-group-aside] > [data-odn-chat-group-extra] {
146
+ width: auto;
147
+ max-width: none;
148
+ min-width: 0;
149
+ flex-basis: auto;
150
+ overflow: visible;
151
+ opacity: 0;
152
+ visibility: hidden;
153
+ pointer-events: none;
154
+ }
155
+
156
+ [data-odn-chat-group-header]:hover [data-odn-chat-group-aside] > [data-odn-chat-group-count],
157
+ [data-odn-chat-group-header]:has(:focus-visible) [data-odn-chat-group-aside] > [data-odn-chat-group-count],
158
+ [data-odn-chat-group-extra-visible] [data-odn-chat-group-aside] > [data-odn-chat-group-count] {
159
+ visibility: hidden;
160
+ }
161
+
162
+ [data-odn-chat-group-header]:hover [data-odn-chat-group-aside] > [data-odn-chat-group-extra],
163
+ [data-odn-chat-group-header]:has(:focus-visible) [data-odn-chat-group-aside] > [data-odn-chat-group-extra],
164
+ [data-odn-chat-group-extra-visible] [data-odn-chat-group-aside] > [data-odn-chat-group-extra] {
165
+ opacity: 1;
166
+ visibility: visible;
167
+ pointer-events: auto;
168
+ }
169
+
118
170
  [data-odn-chat-group-extra] {
119
171
  flex: 0 0 0;
120
172
  display: flex;
@@ -22,6 +22,7 @@ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
22
22
 
23
23
  import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState } from 'react';
24
24
  import { createPortal } from 'react-dom';
25
+ import { svgData } from "../icon/svg-data";
25
26
  import ScrollArea from "../scroll-area";
26
27
  import { caretBeforeHintIn, caretRangeFromPoint, findChipHostBeforeCaret, getCaretBeforeHint, getCurrentLine, isCaretBeforeHint, isCaretOnHintLine, isPointOnHint, isPositionAfterHint, mergeLineIntoPreviousAtCaretStart, normalizeCollapsedCaretAtChipBoundary, normalizeCollapsedCaretBeforeHint, resolveCaretMove, splitLineAt, wouldArrowCrossHint } from "./caret";
27
28
  import { buildClipboardPayload, COMPOSER_CLIPBOARD_MIME, parseClipboardPayload, plainTextFromClipboardPayload, remapClipboardPayload } from "./clipboard";
@@ -102,8 +103,36 @@ var findDirectHint = function findDirectHint(line) {
102
103
  return null;
103
104
  };
104
105
 
106
+ /** 小块右侧的箭头图标:OD icon `arrow-right-to-line`(文案 → 填入的指向)。 */
107
+ var HINT_ACCEPT_ICON_NAME = 'arrow-right-to-line';
108
+
109
+ /**
110
+ * 拼一个 `<svg>` 图标节点。
111
+ *
112
+ * 小块由 DOM API 直接构建(editor 的 children 归 contenteditable 自治,不走
113
+ * React),所以这里从图标数据里取 viewBox / content 自己建元素;描边用
114
+ * `currentColor`,颜色跟随父级文字色。尺寸取 12:与本块 12px 文案同高,
115
+ * Lucide 的 24 viewBox 缩到 12 后描边正好 1px,与文字笔画同重。
116
+ */
117
+ var createHintAcceptArrowNode = function createHintAcceptArrowNode() {
118
+ var _svgData$HINT_ACCEPT_ = svgData[HINT_ACCEPT_ICON_NAME],
119
+ viewBox = _svgData$HINT_ACCEPT_.viewBox,
120
+ content = _svgData$HINT_ACCEPT_.content;
121
+ var arrow = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
122
+ arrow.setAttribute('data-odn-composer-hint-accept-arrow', '');
123
+ arrow.setAttribute('viewBox', viewBox);
124
+ arrow.setAttribute('width', '12');
125
+ arrow.setAttribute('height', '12');
126
+ arrow.setAttribute('fill', 'none');
127
+ /* 装饰性图标:文案已经说清动作,不给读屏重复播报。 */
128
+ arrow.setAttribute('aria-hidden', 'true');
129
+ arrow.setAttribute('focusable', 'false');
130
+ arrow.innerHTML = content;
131
+ return arrow;
132
+ };
133
+
105
134
  /**
106
- * hint 末尾的「按 TAB 键填入」小块:点它 = 按 Tab 填入这段模板文案。
135
+ * hint 末尾的「TAB 键填入」小块:点它 = 按 Tab 填入这段模板文案。
107
136
  *
108
137
  * 与 hint 文本是同级节点(见 `COMPOSER_HINT_ACCEPT_ATTR` 的说明),由
109
138
  * `syncHintNode` 一起插入 / 移除,不进 value / 剪贴板 / segments。
@@ -120,16 +149,13 @@ var createHintAcceptNode = function createHintAcceptNode() {
120
149
  * - aria-label 会盖掉可见文案,反而违反「可见标签即无障碍名」。
121
150
  * - title 是浏览器原生 tooltip:延迟出现、样式不可控、会盖住灰字。 */
122
151
 
123
- var prefix = document.createElement('span');
124
- prefix.setAttribute('data-odn-composer-hint-accept-prefix', '');
125
- prefix.textContent = '按';
126
152
  var key = document.createElement('span');
127
153
  key.setAttribute('data-odn-composer-hint-accept-key', '');
128
154
  key.textContent = 'TAB';
129
155
  var label = document.createElement('span');
130
156
  label.setAttribute('data-odn-composer-hint-accept-label', '');
131
157
  label.textContent = '键填入';
132
- accept.append(prefix, key, label);
158
+ accept.append(key, label, createHintAcceptArrowNode());
133
159
  return accept;
134
160
  };
135
161
 
@@ -473,7 +499,7 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
473
499
  * 它不归 React 管(editor 的 children 由 contenteditable 自治),由 fireChange
474
500
  * 按结构谓词增删/挪位;`getPlainText` 会整棵子树跳过,所以不进 value / 剪贴板。
475
501
  *
476
- * 末尾的「按 TAB 键填入」小块是 hint 文本的**兄弟节点**(不是子节点):hint 的
502
+ * 末尾的「TAB 键填入」小块是 hint 文本的**兄弟节点**(不是子节点):hint 的
477
503
  * textContent 必须保持纯提示文案(采纳时直接落成正文,调试面板也按它读)。 */
478
504
  var hintNodeRef = useRef(null);
479
505
  var hintAcceptNodeRef = useRef(null);
@@ -521,7 +547,7 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
521
547
  var cur = host.nextSibling;
522
548
  while (cur) {
523
549
  var _cur$textContent;
524
- // 跳过 hint 自身与它的「按 TAB 键填入」小块:上一轮若排到了锚点前面,
550
+ // 跳过 hint 自身与它的「TAB 键填入」小块:上一轮若排到了锚点前面,
525
551
  // 这里顺手挪回末尾
526
552
  if (cur === node || cur === accept) {
527
553
  cur = cur.nextSibling;
@@ -550,7 +576,7 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
550
576
  if (node.parentNode !== parent || node.previousSibling !== anchor) {
551
577
  parent.insertBefore(node, anchor.nextSibling);
552
578
  }
553
- /* 「按 TAB 键填入」小块紧跟 hint 文案之后(同一套行内流),顺序必须是
579
+ /* 「TAB 键填入」小块紧跟 hint 文案之后(同一套行内流),顺序必须是
554
580
  * hint → 小块:caret 的合法落点只到 hint 之前,块本身
555
581
  * contentEditable=false,不会成为落点。 */
556
582
  if (accept.parentNode !== parent || accept.previousSibling !== node) {
@@ -660,14 +686,14 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
660
686
  recomputeTriggerRef.current = recomputeTrigger;
661
687
 
662
688
  /* ─────────────────────────────────────
663
- * 采纳 hint(Tab / 点击「按 TAB 键填入」小块)
689
+ * 采纳 hint(Tab / 点击「TAB 键填入」小块)
664
690
  *
665
691
  * hint 只是结构投影(不进 value);caret 恰好停在 chip 与 hint 之间
666
692
  * (= 内容末尾)时按 Tab,表示用户接受这段模板,于是把提示文案落成正文:
667
693
  * chip 之后出现内容 → 结构谓词不再命中 → 灰字自动移除,onChange 抛出的
668
694
  * value 里带上这段文案,与用户自己敲进去的效果一致。
669
695
  *
670
- * 鼠标点末尾的「按 TAB 键填入」小块走**同一条链路**,只是带 `force`:
696
+ * 鼠标点末尾的「TAB 键填入」小块走**同一条链路**,只是带 `force`:
671
697
  * 不要求点击前 caret 就停在 hint 之前,先把 caret 归位到 chip 右侧再落。
672
698
  * ───────────────────────────────────── */
673
699
  var acceptHintAsText = useCallback(function (options) {
@@ -1219,7 +1245,7 @@ export var ComposerEditor = /*#__PURE__*/forwardRef(function ComposerEditor(_ref
1219
1245
  // shift+click 是扩选,不劫持
1220
1246
  if (e.shiftKey) return;
1221
1247
 
1222
- /* 「按 TAB 键填入」小块:点它等价于按 Tab(同一条采纳链路),且不要求点击前
1248
+ /* 「TAB 键填入」小块:点它等价于按 Tab(同一条采纳链路),且不要求点击前
1223
1249
  * caret 就停在 hint 之前。在 mousedown 阶段接管 + preventDefault,
1224
1250
  * 原生 caret 一帧都不会落到 hint 之后。 */
1225
1251
  if (e.target instanceof Element && e.target.closest(COMPOSER_HINT_ACCEPT_SELECTOR)) {
@@ -356,15 +356,16 @@
356
356
  }
357
357
 
358
358
  /* ------------------------------------------------------------------
359
- * hint 末尾的「按 TAB 键填入」小块(点击 = 按 Tab 填入,见 editor.tsx)
359
+ * hint 末尾的「TAB 键填入」小块(点击 = 按 Tab 填入,见 editor.tsx)
360
360
  *
361
361
  * 与 hint 文本是同级节点,一起增删。它不是正文:contentEditable=false、
362
362
  * getPlainText 整棵跳过,点它走 force 版 acceptHintAsText。
363
- * 尺寸对齐 Figma 9857:75425(90 × 22 / 圆角 6 / 内层键帽 28 × 16):
363
+ * 尺寸对齐 Figma 9857:75425(22 高 / 圆角 6 / 内层键帽 28 × 16);
364
+ * 宽度随内容自然撑开(键帽 + 「键填入」+ 12px 箭头图标,约 90):
364
365
  * - 编辑器固定 font-size 14 / line-height 24,块高 22 + top 1 → 视觉居中
365
366
  * 且不撑高行盒(改编辑器行高时要同步调这个 1px)
366
367
  * - 底色 black-2(5%)、键帽 bg-elevated + black-5(12%) 1px 描边
367
- * - 「按」「键填入」与键帽之间 gap 3,左右内边距 4
368
+ * - 「键填入」与键帽之间 gap 3,左右内边距 4
368
369
  * ----------------------------------------------------------------- */
369
370
  [data-odn-composer] [data-odn-composer-hint-accept] {
370
371
  display: inline-flex;
@@ -416,12 +417,18 @@
416
417
  letter-spacing: 0;
417
418
  }
418
419
 
419
- [data-odn-composer] [data-odn-composer-hint-accept-prefix],
420
420
  [data-odn-composer] [data-odn-composer-hint-accept-label] {
421
421
  font-size: 12px;
422
422
  line-height: 20px;
423
423
  }
424
424
 
425
+ /* 文案右侧的箭头图标(OD icon arrow-right-to-line,DOM 见 editor.tsx):
426
+ * 宽高由 svg 属性锁 12,这里只保证它不被 flex 压缩。 */
427
+ [data-odn-composer] [data-odn-composer-hint-accept-arrow] {
428
+ display: block;
429
+ flex: none;
430
+ }
431
+
425
432
  /* 禁用态:hint 仍按内容结构展示,但小块不可点(与 editor 冻结一致) */
426
433
  [data-odn-composer] [data-odn-composer-editor][data-odn-composer-editor-disabled] [data-odn-composer-hint-accept] {
427
434
  cursor: not-allowed;
@@ -23,7 +23,7 @@ export declare const LINE_ATTR_NAME = "data-composer-line";
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
25
  /**
26
- * 派生 hint 末尾的「按 TAB 键填入」小块(可点击采纳)。
26
+ * 派生 hint 末尾的「TAB 键填入」小块(可点击采纳)。
27
27
  *
28
28
  * 与 hint 文本是**兄弟节点**(不是子节点):hint 自身的 `textContent` 必须
29
29
  * 保持纯提示文案——采纳时直接把这段文字落成正文,且 `getPlainText` /
@@ -40,7 +40,7 @@ export var COMPOSER_HINT_ATTR = 'data-odn-composer-skill-hint';
40
40
  export var COMPOSER_HINT_SELECTOR = "[".concat(COMPOSER_HINT_ATTR, "]");
41
41
 
42
42
  /**
43
- * 派生 hint 末尾的「按 TAB 键填入」小块(可点击采纳)。
43
+ * 派生 hint 末尾的「TAB 键填入」小块(可点击采纳)。
44
44
  *
45
45
  * 与 hint 文本是**兄弟节点**(不是子节点):hint 自身的 `textContent` 必须
46
46
  * 保持纯提示文案——采纳时直接把这段文字落成正文,且 `getPlainText` /
@@ -302,7 +302,7 @@ export function getPlainText(editor) {
302
302
  var out = '';
303
303
  var visit = function visit(node) {
304
304
  if (node instanceof HTMLElement) {
305
- // 派生 hint(含末尾的「按 TAB 键填入」小块)整棵子树都不是正文,直接跳过
305
+ // 派生 hint(含末尾的「TAB 键填入」小块)整棵子树都不是正文,直接跳过
306
306
  if (node.hasAttribute(COMPOSER_HINT_ATTR) || node.hasAttribute(COMPOSER_HINT_ACCEPT_ATTR)) return;
307
307
  var id = node.dataset[chipIdAttr];
308
308
  if (id) {
@@ -82,9 +82,9 @@ export var skillCardSwitchStyle = {
82
82
  '--odn-switch-track-bg': 'rgba(74, 97, 143, 0.1)',
83
83
  '--odn-switch-track-bg-hover': 'rgba(74, 97, 143, 0.14)',
84
84
  '--odn-switch-track-bg-active': 'rgba(74, 97, 143, 0.18)',
85
- '--odn-switch-track-bg-checked': '#2694FD',
86
- '--odn-switch-track-bg-checked-hover': '#2694FD',
87
- '--odn-switch-track-bg-checked-active': '#2694FD'
85
+ '--odn-switch-track-bg-checked': 'var(--odn-color-brand-6)',
86
+ '--odn-switch-track-bg-checked-hover': 'var(--odn-color-brand-6)',
87
+ '--odn-switch-track-bg-checked-active': 'var(--odn-color-brand-6)'
88
88
  };
89
89
  var TAG_GAP = 6;
90
90
  var MIN_TRUNCATABLE_TAG_WIDTH = 36;
@@ -5,12 +5,16 @@ html {
5
5
  --odn-skill-card-action-gap: 8px;
6
6
  --odn-skill-card-hover-duration: 0.3s;
7
7
  --odn-skill-card-hover-ease: cubic-bezier(0.4, 0, 0.2, 1);
8
- --odn-skill-card-text: rgba(0, 0, 0, 0.95);
9
- --odn-skill-card-secondary: rgba(51, 55, 61, 0.58);
10
- --odn-skill-card-source: #296bef;
11
- --odn-skill-card-source-bg: rgba(41, 107, 239, 0.1);
12
- --odn-skill-card-soft-bg: rgba(74, 97, 143, 0.08);
13
- --odn-skill-card-border: rgba(74, 97, 143, 0.08);
8
+ --odn-skill-card-text: var(--odn-color-black-12);
9
+ --odn-skill-card-secondary: var(--odn-color-black-9);
10
+ --odn-skill-card-source: var(--odn-color-brand-6);
11
+ --odn-skill-card-source-bg: color-mix(
12
+ in srgb,
13
+ var(--odn-color-brand-6) 10%,
14
+ transparent
15
+ );
16
+ --odn-skill-card-soft-bg: var(--odn-color-black-3);
17
+ --odn-skill-card-border: var(--odn-color-black-3);
14
18
  }
15
19
 
16
20
  [data-odn-skill-card] {
@@ -73,7 +77,7 @@ html {
73
77
  width: 230px;
74
78
  height: 130px;
75
79
  transform: rotate(-8.4deg);
76
- background-image: radial-gradient(ellipse at center, rgb(38, 148, 253), transparent 60%);
80
+ background-image: radial-gradient(ellipse at center, var(--odn-color-brand-6), transparent 60%);
77
81
  }
78
82
 
79
83
  [data-odn-skill-card][data-odn-skill-card-hoverable=true]:hover [data-odn-skill-card-glow] {
@@ -107,7 +111,7 @@ html {
107
111
  overflow: hidden;
108
112
  border: 1px solid var(--odn-color-black-1);
109
113
  border-radius: 8px;
110
- color: rgb(38, 148, 253);
114
+ color: var(--odn-color-brand-6);
111
115
  object-fit: cover;
112
116
  }
113
117
 
@@ -132,7 +136,7 @@ html {
132
136
  [data-odn-skill-card-copy] {
133
137
  position: absolute;
134
138
  top: var(--odn-skill-card-padding);
135
- right: 70px;
139
+ right: var(--odn-skill-card-padding);
136
140
  left: 80px;
137
141
  z-index: 20;
138
142
  display: flex;
@@ -144,6 +148,10 @@ html {
144
148
  transition: left var(--odn-skill-card-hover-duration) var(--odn-skill-card-hover-ease), right var(--odn-skill-card-hover-duration) var(--odn-skill-card-hover-ease), transform var(--odn-skill-card-hover-duration) var(--odn-skill-card-hover-ease);
145
149
  }
146
150
 
151
+ [data-odn-skill-card][data-odn-skill-card-control=toggle] [data-odn-skill-card-copy] {
152
+ right: 70px;
153
+ }
154
+
147
155
  [data-odn-skill-card][data-odn-skill-card-control=add] [data-odn-skill-card-copy] {
148
156
  right: 62px;
149
157
  }
@@ -185,8 +193,8 @@ html {
185
193
 
186
194
  [data-odn-skill-card-name] {
187
195
  min-width: 0;
188
- max-width: calc(100% - 8px);
189
- flex: 0 1 auto;
196
+ max-width: 100%;
197
+ flex: 0 0 auto;
190
198
  overflow: hidden;
191
199
  color: var(--odn-skill-card-text);
192
200
  font-size: 14px;
@@ -198,7 +206,7 @@ html {
198
206
 
199
207
  [data-odn-skill-card-alias] {
200
208
  min-width: 0;
201
- flex: 1 1 0;
209
+ flex: 1 1 auto;
202
210
  overflow: hidden;
203
211
  color: var(--odn-skill-card-secondary);
204
212
  font-size: 14px;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "one-design-next",
3
- "version": "0.0.119",
3
+ "version": "0.0.121",
4
4
  "description": "One Design Next from TAD@tencent.com",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -79,6 +79,7 @@
79
79
  "echarts": "^6.1.0",
80
80
  "echarts-for-react": "^3.0.6",
81
81
  "ldrs": "^1.1.9",
82
+ "modern-screenshot": "4.7.0",
82
83
  "motion": "^12.40.0",
83
84
  "rc-cascader": "^3.34.0",
84
85
  "rc-select": "^14.16.8",
@@ -90,7 +91,9 @@
90
91
  "rc-virtual-list": "^3.19.2",
91
92
  "react-d3-cloud": "^1.0.6",
92
93
  "react-markdown": "^10.1.0",
93
- "remark-gfm": "^4.0.1"
94
+ "remark-gfm": "^4.0.1",
95
+ "tdesign-icons-react": "0.6.11",
96
+ "tdesign-react": "1.18.2"
94
97
  },
95
98
  "devDependencies": {
96
99
  "@commitlint/cli": "^17.1.2",