dsh-plugin-t-expert 0.4.9 → 0.4.26
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 +494 -0
- package/lib/client.js +543 -107
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -67,7 +67,7 @@ var SectionBoundary = class extends import_react.default.Component {
|
|
|
67
67
|
|
|
68
68
|
// src/client/state.js
|
|
69
69
|
var NS = "t-team";
|
|
70
|
-
var CLIENT_BUILD_VERSION = "0.4.
|
|
70
|
+
var CLIENT_BUILD_VERSION = "0.4.26";
|
|
71
71
|
var PLUGIN_ID = "dsh-plugin-t-expert";
|
|
72
72
|
var DIVISION_FALLBACK = "specialized";
|
|
73
73
|
var NEW_DIVISION = "__new";
|
|
@@ -120,10 +120,18 @@ function displayDescription(expert, active) {
|
|
|
120
120
|
function divisionLabel(expert, active) {
|
|
121
121
|
return active === "en" ? expert.divisionEn || expert.division : expert.divisionZh || expert.division;
|
|
122
122
|
}
|
|
123
|
+
var HAYSTACKS = /* @__PURE__ */ new WeakMap();
|
|
124
|
+
function haystackOf(expert) {
|
|
125
|
+
let cached2 = HAYSTACKS.get(expert);
|
|
126
|
+
if (cached2 === void 0) {
|
|
127
|
+
cached2 = `${expert.name} ${expert.nameEn} ${expert.description} ${expert.descriptionEn} ${expert.slug}`.toLowerCase();
|
|
128
|
+
HAYSTACKS.set(expert, cached2);
|
|
129
|
+
}
|
|
130
|
+
return cached2;
|
|
131
|
+
}
|
|
123
132
|
function matchExpert(expert, active, query) {
|
|
124
133
|
if (query === "") return true;
|
|
125
|
-
|
|
126
|
-
return haystack.includes(query);
|
|
134
|
+
return haystackOf(expert).includes(query);
|
|
127
135
|
}
|
|
128
136
|
function referenceOf(expert, active) {
|
|
129
137
|
const name = displayName(expert, active);
|
|
@@ -138,9 +146,6 @@ function referenceOf(expert, active) {
|
|
|
138
146
|
|
|
139
147
|
// src/client/css.js
|
|
140
148
|
var CSS = `
|
|
141
|
-
.t-team-editor-modal{width:min(860px,94vw);max-height:min(86vh,760px)}
|
|
142
|
-
.t-team-editor-body{padding:14px;overflow:auto;display:flex;flex-direction:column;gap:10px}
|
|
143
|
-
.t-team-editor-body .t-team-picker-list{max-height:300px}
|
|
144
149
|
/* \u5C0F\u8282\u6807\u9898\uFF08\u81EA\u5EFA\u5206\u7C7B / \u5B98\u65B9\u5206\u7C7B\uFF09\uFF1A**\u4E0D\u753B\u4E0A\u8FB9\u7EBF**\u3002
|
|
145
150
|
2026-09-28 \u7528\u6237\u6307\u51FA\u4E24\u5904\u591A\u4F59\u7684\u6A2A\u7EBF\uFF0C\u8FD9\u662F\u7B2C\u4E00\u5904 \u2014\u2014 \u6807\u9898\u4E0A\u65B9\u7684\u7EBF\u7D27\u8D34\u7740\u4E0A\u4E00\u4E2A\u533A\u5757
|
|
146
151
|
\uFF08\u8F93\u5165\u6846\u90A3\u4E00\u884C / \u4E0A\u4E00\u4E2A\u5C0F\u8282\uFF09\uFF0C\u770B\u7740\u50CF"\u7EBF\u8D34\u5230\u4E86\u6309\u94AE\u4E0A"\u3002\u53BB\u6389\u8FB9\u6846\uFF0C\u9760\u5B57\u91CD\u4E0E\u95F4\u8DDD\u5206\u5C42\u5C31\u591F\u4E86\u3002 */
|
|
@@ -279,6 +284,47 @@ var CSS = `
|
|
|
279
284
|
.t-team-modal{display:flex;flex-direction:column;width:min(720px,100%);max-height:min(70vh,640px);overflow:hidden;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;background:var(--dsw-alias-bg-layer-3);box-shadow:var(--dsw-shadow-lv3);color:var(--dsw-alias-label-primary)}
|
|
280
285
|
.t-team-modal-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 14px;border-bottom:1px solid var(--dsw-alias-border-l2);font-size:14px;font-weight:600}
|
|
281
286
|
.t-team-modal-body{margin:0;padding:14px;overflow:auto;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:19px;white-space:pre-wrap;word-break:break-word;color:var(--dsw-alias-label-secondary)}
|
|
287
|
+
/* ---- \u5B98\u65B9 Modal \u7684\u9AD8\u5EA6\u7EA6\u675F\uFF082026-09-28 \u4FEE\uFF1A\u63D0\u793A\u8BCD\u5F39\u7A97\u6F2B\u51FA\u5C4F\u5E55\uFF09----
|
|
288
|
+
\u5B98\u65B9 .dialog \u6CA1\u6709 max-height \u2014\u2014 Modal.module.css \u7684\u6CE8\u91CA\u628A\u8FD9\u4EF6\u4E8B\u660E\u786E\u4EA4\u7ED9\u8C03\u7528\u65B9
|
|
289
|
+
\uFF08consumers cap growth with max-height: 100%\uFF09\u3002\u5B83\u540C\u65F6 createPortal \u5230 body\uFF0C
|
|
290
|
+
.root \u53EA\u8D1F\u8D23\u5C45\u4E2D\u3001\u4E0D\u6EDA\u52A8\uFF0C\u6240\u4EE5\u5185\u5BB9\u4E00\u957F\u5C31\u6574\u4F53\u9876\u51FA\u89C6\u53E3\uFF1A\u7528\u6237\u770B\u5230\u7684\u662F\u300C\u5F39\u7A97\u6837\u5F0F\u5D29\u4E86\u3001
|
|
291
|
+
\u6587\u5B57\u6F2B\u51FA\u5C4F\u5E55\u300D\uFF0C\u800C\u4E0D\u662F\u4E00\u4E2A\u80FD\u6EDA\u7684\u5BF9\u8BDD\u6846\u3002\u4E13\u5BB6 persona \u52A8\u8F84\u4E0A\u4E07\u884C\uFF0C\u5FC5\u7136\u89E6\u53D1\u3002
|
|
292
|
+
\u4E09\u5C42\u7684\u5206\u5DE5\uFF08\u7F3A\u4E00\u5C42\u90FD\u4E0D\u751F\u6548\uFF09\uFF1A
|
|
293
|
+
.t-team-modal-fit \u2192 dialog \u76F8\u5BF9 .root \u7684 padding box \u515C\u4F4F\u9AD8\u5EA6
|
|
294
|
+
.t-team-modal-fit-content \u2192 .content \u5141\u8BB8\u6536\u7F29\uFF08flex \u5B50\u9879\u9ED8\u8BA4 min-height:auto\uFF0C\u4F1A\u628A\u7236\u7EA7\u6491\u7834\uFF09
|
|
295
|
+
.content > div:last-child \u2192 \u5B98\u65B9 .body\uFF08\u6807\u9898\u680F\u4E0E footer \u7684\u5144\u5F1F\uFF09\uFF0C\u8BA9\u5B83\u81EA\u5DF1\u6EDA\uFF0C
|
|
296
|
+
\u4E8E\u662F\u6807\u9898\u56FA\u5B9A\u5728\u9876\u90E8\u3001\u5173\u95ED\u6309\u94AE\u59CB\u7EC8\u53EF\u70B9
|
|
297
|
+
\u26A0\uFE0F \u4E0D\u8981\u628A\u8FD9\u4E9B\u89C4\u5219\u5408\u5E76\u8FDB\u4E0A\u9762\u90A3\u5957 .t-team-modal-*\uFF1A\u90A3\u662F\u81EA\u7ED8\u515C\u5E95 Modal \u7684\u6837\u5F0F\uFF0C
|
|
298
|
+
\u7ED9\u5B98\u65B9 dialog \u5957\u4E0A\u53BB\u4F1A\u628A\u5B98\u65B9\u5916\u89C2\uFF08380px \u5BBD\u300124px \u5706\u89D2\u3001layer-2 \u5E95\u8272\uFF09\u6574\u7247\u8986\u76D6\u6389\u3002 */
|
|
299
|
+
.t-team-modal-fit{max-height:100%}
|
|
300
|
+
.t-team-modal-fit-content{min-height:0}
|
|
301
|
+
.t-team-modal-fit-content > div:last-child{min-height:0;overflow:auto}
|
|
302
|
+
/* \u63D0\u793A\u8BCD\u5F39\u7A97\u7684\u590D\u5236\u6309\u94AE\uFF1A\u5B98\u65B9\u6807\u9898\u680F\u53EA\u6709\u300C\u6807\u9898 + \u5173\u95ED\u300D\u4E24\u4E2A\u4F4D\u7F6E\u3001\u6CA1\u6709\u63D2\u69FD\uFF0C\u6240\u4EE5\u6309\u94AE\u6E32\u67D3\u5728
|
|
303
|
+
\u6B63\u6587\u4E4B\u524D\uFF0C\u9760\u7EDD\u5BF9\u5B9A\u4F4D"\u843D"\u5230\u5173\u95ED\u6309\u94AE\u5DE6\u4FA7\u3002\u5B9A\u4F4D\u57FA\u51C6\u662F\u5B98\u65B9 .dialog \u2014\u2014 Modal.module.css
|
|
304
|
+
\u7ED9\u5B83 position: relative\uFF0C\u56E0\u6B64\u6B63\u6587\u6EDA\u52A8\u65F6\u6309\u94AE\u7EB9\u4E1D\u4E0D\u52A8\u3002
|
|
305
|
+
top/right \u662F\u7167\u7740\u5B98\u65B9 .header \u7684 padding \u4E0E .close \u7684\u5C3A\u5BF8\u7B97\u7684\uFF1A
|
|
306
|
+
top = header \u7684 padding-top 22px\uFF08\u4E0E\u5173\u95ED\u6309\u94AE\u540C\u9AD8\u8D77\u7B97\uFF09\uFF1B
|
|
307
|
+
right = header \u7684 padding-right 14px + .close \u7684 28px \u5BBD + 8px \u95F4\u9694 = 50px\u3002
|
|
308
|
+
\u26A0\uFE0F \u8FD9\u4E09\u4E2A\u6570\u503C\u6765\u81EA Modal.module.css\uFF0C\u5B98\u65B9\u82E5\u8C03\u6574\u6807\u9898\u680F\u5C3A\u5BF8\uFF0C\u8FD9\u91CC\u8981\u8DDF\u7740\u6539
|
|
309
|
+
\uFF08verify \u6709\u4E00\u6761\u65AD\u8A00\u76EF\u7740\u8FD9\u6761\u89C4\u5219\u5728\u4E0D\u5728\uFF0C\u4F46\u7B97\u4E0D\u51FA\u504F\u79FB\u91CF\u662F\u5426\u4ECD\u5BF9\u9F50\uFF09\u3002 */
|
|
310
|
+
.t-team-prompt-tools{position:absolute;top:22px;right:50px;z-index:2;display:flex;align-items:center;height:28px}
|
|
311
|
+
/* ---- \u4E24\u4E2A\u5F39\u7A97\u7684\u5C3A\u5BF8\uFF082026-09-28 \u7B2C\u4E8C\u8F6E\uFF1A\u7528\u6237\u300C\u592A\u957F \u592A\u7A84\u300D\uFF09----
|
|
312
|
+
\u5B98\u65B9 .dialog \u662F min(380px,100%) \u5BBD\u3001\u9AD8\u5EA6\u4E0D\u8BBE\u9650 \u2014\u2014 \u90A3\u5957\u5C3A\u5BF8\u662F\u7ED9\u300C\u786E\u8BA4\u6846\u300D\u8BBE\u8BA1\u7684
|
|
313
|
+
\uFF08\u4E00\u53E5\u8BDD + \u4E24\u4E2A\u6309\u94AE\uFF09\u3002\u6211\u4EEC\u62FF\u5B83\u88C5\u4E24\u7C7B**\u957F\u5185\u5BB9**\uFF0C\u5F62\u72B6\u5C31\u5B8C\u5168\u4E0D\u5BF9\u4E86\uFF1A
|
|
314
|
+
\xB7 \u63D0\u793A\u8BCD\u5F39\u7A97\uFF1A\u4E13\u5BB6 persona \u5168\u6587\uFF0C\u52A8\u8F84\u4E0A\u4E07\u884C\uFF1B
|
|
315
|
+
\xB7 \u7F16\u8F91\u5668\u5F39\u7A97\uFF1A\u591A\u884C Markdown \u6B63\u6587\u3002
|
|
316
|
+
380px \u5BBD\u5BF9\u957F\u884C\u6587\u672C\u610F\u5473\u7740\u51E0\u4E4E\u6BCF\u53E5\u90FD\u6298\u884C\uFF0C\u518D\u914D\u5408\u6491\u6EE1\u89C6\u53E3\u7684\u9AD8\u5EA6 = \u53C8\u9AD8\u53C8\u7A84\u7684\u7A84\u6761\uFF0C
|
|
317
|
+
\u8BFB\u8D77\u6765\u50CF\u4ECE\u95E8\u7F1D\u91CC\u770B\u3002
|
|
318
|
+
\u7B2C\u4E00\u8F6E\uFF080.4.10\uFF09\u53EA\u6CBB\u4E86\u300C\u6F2B\u51FA\u5C4F\u5E55\u300D\uFF0C\u6CA1\u6709\u6CBB\u5F62\u72B6\u3002\u8FD9\u91CC\u6309\u5185\u5BB9\u7C7B\u578B\u7ED9\u5C3A\u5BF8\uFF1A
|
|
319
|
+
\xB7 \u63D0\u793A\u8BCD\u662F\u7EAF\u9605\u8BFB\uFF0C\u7ED9\u6700\u5BBD\u7684\u4E00\u6863\uFF0C\u884C\u5C3D\u91CF\u4E0D\u6298\uFF1B
|
|
320
|
+
\xB7 \u7F16\u8F91\u5668\u6709\u8868\u5355\u5B57\u6BB5\uFF0C\u7A0D\u7A84\u4E00\u70B9\u66F4\u805A\u62E2\u3002
|
|
321
|
+
\u4E24\u6863\u9AD8\u5EA6\u4E00\u81F4\uFF0C\u5207\u6765\u5207\u53BB\u4E0D\u4F1A\u8DF3\u3002
|
|
322
|
+
\u26A0\uFE0F \u5FC5\u987B\u5199\u5728 .t-team-modal-fit \u4E4B\u540E\uFF1A\u4E24\u7EC4\u90FD\u662F\u5355\u7C7B\u9009\u62E9\u5668\u3001\u7279\u5F02\u6027\u76F8\u540C\uFF0C
|
|
323
|
+
max-height \u8C01\u5728\u540E\u9762\u8C01\u751F\u6548\u3002 */
|
|
324
|
+
.t-team-prompt-modal{width:min(960px,94vw);max-height:min(84vh,800px)}
|
|
325
|
+
.t-team-editor-modal{width:min(860px,94vw);max-height:min(84vh,800px)}
|
|
326
|
+
/* \u63D0\u793A\u8BCD\u6B63\u6587\uFF1A\u53EA\u8D1F\u8D23\u6392\u7248\uFF0C\u6EDA\u52A8\u4EA4\u7ED9\u4E0A\u9762\u90A3\u5C42 .body\uFF0C\u6240\u4EE5\u8FD9\u91CC\u4E0D\u8BBE padding/overflow\u3002 */
|
|
327
|
+
.t-team-prompt-body{margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:19px;white-space:pre-wrap;word-break:break-word;color:var(--dsw-alias-label-secondary)}
|
|
282
328
|
.t-team-avatar{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:50%;background:var(--dsw-alias-bg-layer-3);font-size:22px;line-height:1}
|
|
283
329
|
.t-team-identity{display:flex;min-width:0;flex-direction:column;padding-right:46px}
|
|
284
330
|
.t-team-card-name{font-size:14px;font-weight:600;line-height:20px;color:var(--dsw-alias-label-primary);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}
|
|
@@ -330,7 +376,7 @@ var CSS = `
|
|
|
330
376
|
.t-team-btn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
|
|
331
377
|
/* \u6D6E\u5C42\u9AD8\u5EA6\u4E0A\u9650\uFF1A2026-09-20 \u7528\u6237\u8981\u6C42\u300C\u592A\u9AD8\u4E86\uFF0C\u7EDF\u4E00\u8C03\u77EE\u4E00\u70B9\u300D\u2014\u2014590px \u2192 460px\uFF1B
|
|
332
378
|
2026-09-23 \u7528\u6237\u53C8\u8981\u300C\u518D\u9AD8\u4E00\u4E9B\uFF0C\u9AD8\u4E00\u4E2A\u5361\u7247\u591A\u4E00\u70B9\u300D\u2014\u2014460px \u2192 600px
|
|
333
|
-
\uFF08\u5361\u7247
|
|
379
|
+
\uFF08\u5361\u7247 146px + \u884C\u95F4\u8DDD 10px = 156px\uFF0C\u518D\u7559\u70B9\u4F59\u91CF\uFF0C\u6B63\u597D\u591A\u5BB9\u4E00\u6574\u884C\u5361\u7247\uFF09\u3002
|
|
334
380
|
\u4E13\u5BB6/\u6280\u80FD\u4E24\u4E2A\u6807\u7B7E\u5171\u7528\u8FD9\u4E00\u4E2A\u6570\u5B57\uFF0C\u9AD8\u5EA6\u53D6 600px \u4E0E\u89C6\u53E3\u9AD8\u5EA6\u4E2D\u7684\u5C0F\u8005\uFF0C\u77EE\u5C4F\u81EA\u52A8\u6536\u7F29\u3002
|
|
335
381
|
\u6CE8\u610F\uFF1A\u672C\u5757\u6CE8\u91CA\u5FC5\u987B\u95ED\u5408 \u2014\u2014 2026-09-23 \u66FE\u56E0\u8FD9\u91CC\u4E22\u4E86\u6CE8\u91CA\u7ED3\u5C3E\uFF0C\u628A\u4E0B\u9762 .t-team-pop \u4E0E
|
|
336
382
|
.t-team-pop .t-team-input \u4E24\u6761\u89C4\u5219\u4E00\u8D77\u541E\u6389\uFF0C\u5F39\u7A97\u9000\u5316\u6210\u65E0\u6837\u5F0F\u5757\u7EA7\u5143\u7D20\uFF081265\xD712420\uFF09\uFF0C
|
|
@@ -346,10 +392,21 @@ var CSS = `
|
|
|
346
392
|
\uFF08\u4EAE\u8272 rgba(248,249,250,.58) / \u6697\u8272 rgba(48,49,54,.5)\uFF09\uFF0C\u5E76\u914D\u5957
|
|
347
393
|
--dsw-menu-backdrop-filter = blur(40px) saturate(150%) \u624D\u6709\u6BDB\u73BB\u7483\u89C2\u611F\u3002
|
|
348
394
|
\u6240\u4EE5\u51E1\u662F background \u7528\u4E86 --dsw-specific-menu \u7684\u89C4\u5219\uFF0C\u90FD\u5FC5\u987B\u7D27\u8DDF\u4E00\u6761 backdrop-filter\uFF0C
|
|
349
|
-
\u5426\u5219\u5728 0.1.7 \u4E0A\u5C31\u662F\u300C\u5F39\u7A97\u534A\u900F\u660E\u3001\u80FD\u770B\u89C1\u5E95\u4E0B\u7684\u5BF9\u8BDD\u300D\uFF08\u7528\u6237\u5B9E\u6D4B\u62A5\u969C\uFF09\
|
|
350
|
-
\
|
|
351
|
-
|
|
352
|
-
.t-team-pop
|
|
395
|
+
\u5426\u5219\u5728 0.1.7 \u4E0A\u5C31\u662F\u300C\u5F39\u7A97\u534A\u900F\u660E\u3001\u80FD\u770B\u89C1\u5E95\u4E0B\u7684\u5BF9\u8BDD\u300D\uFF08\u7528\u6237\u5B9E\u6D4B\u62A5\u969C\uFF09\u3002
|
|
396
|
+
\u26A0\uFE0F 2026-09-29\uFF1A**T\u4E13\u5BB6 \u9762\u677F\u81EA\u5DF1\u4E0D\u518D\u8D70\u6BDB\u73BB\u7483**\uFF08\u7528\u6237\u53E3\u5F84\u300C\u592A\u5361\u4E86\u300D\u2192 \u9009\u300C\u9762\u677F\u6539\u6210\u4E0D\u900F\u660E\u5B9E\u8272\u300D\uFF09\uFF1A
|
|
397
|
+
blur(40px) \u94FA\u6EE1\u6574\u5757\u9762\u677F\u662F\u9762\u677F\u4E0A\u4EC5\u5269\u7684\u5927\u5408\u6210\u5F00\u9500\uFF0C\u800C\u9762\u677F\u5185\u5BB9\u672C\u8EAB\u662F\u5B9E\u5FC3\u5361\u7247\u3001\u5E76\u4E0D\u9700\u8981\u900F\u51FA\u80CC\u540E\u5185\u5BB9\u3002
|
|
398
|
+
\u6240\u4EE5 .t-team-pop \u4E0E\u5B98\u65B9\u6750\u8D28\u8DEF\u5F84\uFF08.t-team-pop-official\uFF09\u90FD\u6539\u6210\u5B9E\u8272 --dsw-alias-bg-layer-3\uFF0C
|
|
399
|
+
\u5E76\u628A\u5B98\u65B9 MenuSurface \u5185\u90E8\u90A3\u5C42\u6750\u8D28\uFF08aria-hidden \u7684\u5144\u5F1F\u8282\u70B9\uFF0Cblur \u5C31\u6302\u5728\u5B83\u8EAB\u4E0A\uFF09\u5173\u6389\u3002
|
|
400
|
+
\u8FD9\u6761\u300C\u586B\u8272\u5FC5\u987B\u914D filter\u300D\u7684\u89C4\u77E9\u4ECD\u7136\u9002\u7528\u4E8E**\u522B\u5904**\u8FD8\u5728\u7528\u83DC\u5355\u6750\u8D28\u7684\u5730\u65B9\uFF08\u5982 .t-team-expert-pick-panel\uFF09\u3002 */
|
|
401
|
+
.t-team-pop{position:fixed;z-index:60;width:var(--t-team-pop-w, 720px);max-width:calc(100vw - 16px);max-height:min(600px, calc(100vh - 16px));overflow:hidden;box-sizing:border-box;display:flex;flex-direction:column;gap:8px;padding:10px 0 10px 10px;border-radius:12px;border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-3, var(--dsw-specific-menu, #fff));box-shadow:0 0 1px 0 #0003, 0 0 4px 0 #00000005;color:var(--dsw-alias-label-primary)}
|
|
402
|
+
/* \u6750\u8D28\u4EA4\u7ED9\u5B98\u65B9 MenuSurface \u65F6\uFF08\u5BBF\u4E3B\u6709\u8BE5\u7EC4\u4EF6 \u2014\u2014 \u89C1 ui.jsx \u7684 PopSurface\uFF09\uFF0C\u628A\u4E0A\u9762\u90A3\u5957\u81EA\u7ED8\u6750\u8D28\u6E05\u6389\u3002
|
|
403
|
+
\u5B98\u65B9\u6750\u8D28\u662F**\u7236\u7EA7\u5185\u90E8**\u4E00\u4E2A aria-hidden\u3001absolute\u3001z-index:-1 \u7684\u5144\u5F1F\u5C42\uFF1B\u7236\u7EA7\u81EA\u5DF1\u518D\u94FA\u4E00\u5C42\u5E95\u8272
|
|
404
|
+
\u5C31\u4F1A\u628A\u5B83\u6574\u4E2A\u76D6\u4F4F\uFF0C\u6362\u5916\u58F3\u8FD9\u4EF6\u4E8B\u5C31\u7B49\u4E8E\u767D\u505A\u3002\u5706\u89D2\u4E00\u5E76\u8FD8\u7ED9\u5B98\u65B9\u90A3\u4E00\u6863\uFF08.surface \u7528 --dsw-radius-lg\uFF09\u3002 */
|
|
405
|
+
.t-team-pop-official{position:fixed;border:0;background:var(--dsw-alias-bg-layer-3, var(--dsw-specific-menu, #fff));backdrop-filter:none;box-shadow:none;border-radius:var(--dsw-radius-lg,12px)}
|
|
406
|
+
/* \u5173\u6389\u5B98\u65B9 MenuSurface \u5185\u90E8\u90A3\u5C42\u6750\u8D28\uFF08\u5B83\u662F\u4E2A aria-hidden \u7684\u7EDD\u5BF9\u5B9A\u4F4D\u5144\u5F1F\uFF0Cinset:0 \u94FA\u6EE1\uFF0C
|
|
407
|
+
background \u4E0E backdrop-filter \u90FD\u6302\u5728\u5B83\u8EAB\u4E0A\uFF09\u3002\u53EA\u628A\u7236\u7EA7\u6362\u6210\u5B9E\u8272\u8FD8\u4E0D\u591F \u2014\u2014
|
|
408
|
+
\u6750\u8D28\u5C42\u7167\u6837\u5728\u8DD1 blur\u3002 */
|
|
409
|
+
.t-team-pop-official > [aria-hidden="true"]{display:none}
|
|
353
410
|
/* \u4E0D\u5199 width:100%\uFF1A\u5B83\u91CF\u7684\u662F\u5BB9\u5668 content \u5BBD\uFF0C\u518D\u53E0\u4E0A\u300C> *\u300D\u7684 margin-right \u5C31\u4F1A\u6A2A\u5411\u6EA2\u51FA\uFF1B
|
|
354
411
|
\u9760 flex \u5BB9\u5668\u9ED8\u8BA4\u7684 align-items:stretch \u81EA\u52A8\u6491\u6EE1\u51CF\u6389 margin \u540E\u7684\u5BBD\u5EA6\u3002 */
|
|
355
412
|
.t-team-pop .t-team-input{flex:0 0 auto;min-width:0}
|
|
@@ -357,9 +414,48 @@ var CSS = `
|
|
|
357
414
|
\u8D34\u4F4F\u5F39\u7A97\u53F3\u8FB9\u7F18 \u2014\u2014 \u6EDA\u52A8\u6761\u753B\u5728\u6EDA\u52A8\u5BB9\u5668\u7684 padding box \u8FB9\u7F18\uFF0C\u7236\u7EA7\u7559 10px \u5C31\u4F1A\u628A\u5B83\u63A8\u8FDB\u6765 10px\uFF0C
|
|
358
415
|
\u4E5F\u5C31\u662F\u7528\u6237\u770B\u5230\u7684\u300C\u6EDA\u52A8\u6761\u6CA1\u9760\u8FB9\u300D\u3002\u4EE3\u4EF7\u662F**\u6BCF\u4E2A\u4E0D\u6EDA\u52A8\u7684\u5144\u5F1F\u5143\u7D20**\u90FD\u5F97\u81EA\u5DF1\u8865\u56DE\u8FD9 10px\uFF0C
|
|
359
416
|
\u6F0F\u4E00\u4E2A\u5C31\u9876\u8FB9\uFF082026-09-23 \u5C31\u6F0F\u4E86\u641C\u7D22\u6846\uFF09\u3002\u6240\u4EE5\u7528\u300C> *\u300D\u4E00\u628A\u515C\u4F4F\uFF0C\u518D\u628A\u552F\u4E00\u7684\u6EDA\u52A8\u5BB9\u5668\u6392\u9664\u6389\uFF1A
|
|
360
|
-
\u4EE5\u540E\u5F80\u5F39\u7A97\u91CC\u52A0\u65B0\u884C\u4E0D\u5FC5\u518D\u8BB0\u5F97\u8865\u3002
|
|
361
|
-
|
|
417
|
+
\u4EE5\u540E\u5F80\u5F39\u7A97\u91CC\u52A0\u65B0\u884C\u4E0D\u5FC5\u518D\u8BB0\u5F97\u8865\u3002
|
|
418
|
+
\u26A0\uFE0F 2026-09-29 \u8D77\u8FD8\u8981\u6392\u9664\u300Caria-hidden\u300D\uFF1A\u5B98\u65B9 MenuSurface \u7684\u6750\u8D28\u5C42\u5C31\u662F\u7236\u7EA7\u91CC\u4E00\u4E2A aria-hidden
|
|
419
|
+
\u7684\u7EDD\u5BF9\u5B9A\u4F4D\u5144\u5F1F\uFF08inset:0 \u94FA\u6EE1\uFF09\u2014\u2014 \u5B83\u5403\u8FD9 10px \u7684 margin-right \u4F1A\u8BA9\u6750\u8D28\u53F3\u8FB9\u5C11\u4E00\u6761\uFF0C\u9732\u51FA\u5E95\u8272\u3002 */
|
|
420
|
+
.t-team-pop > *:not([aria-hidden="true"]){margin-right:10px}
|
|
362
421
|
.t-team-pop > .t-team-pop-list{margin-right:0}
|
|
422
|
+
/* \u5206\u7C7B\u6807\u7B7E\u884C\uFF082026-09-29 \u7528\u6237\u8981\u6C42\uFF1A\u641C\u7D22\u6846\u4E0B\u9762\u52A0\u4E00\u884C\u5206\u7C7B\uFF0C\u9644\u53C2\u8003\u56FE\uFF09\u3002
|
|
423
|
+
\u5BF9\u9F50\u5BBD\u5EA6\u9760\u7684\u662F**\u7ED3\u6784**\uFF1A\u8FD9\u4E00\u884C\u662F .t-team-pop \u7684\u76F4\u63A5\u5B50\u5143\u7D20\uFF0C\u4E0E\u641C\u7D22\u6846\u5403\u540C\u4E00\u6761\u300C> *\u300D\u53F3\u5185\u8FB9\u8DDD\u3001
|
|
424
|
+
\u5DE6\u8FB9\u540C\u6837\u7531\u5BB9\u5668\u81EA\u5DF1\u7684 padding-left \u63D0\u4F9B \u2014\u2014 \u6240\u4EE5\u8FD9\u91CC\uFF08\u4EE5\u53CA\u91CC\u9762\u4E24\u4E2A\u5BB9\u5668\uFF09**\u4E0D\u8BB8**\u518D\u5199\u5DE6\u53F3\u5185\u8FB9\u8DDD\uFF0C
|
|
425
|
+
\u5199\u4E86\u8FD9\u4E00\u884C\u5C31\u4F1A\u6BD4\u641C\u7D22\u6846\u7A84\u4E00\u622A\u6216\u504F\u4E00\u622A\uFF0C\u90A3\u6B63\u662F\u7528\u6237\u76EF\u7684"\u5BF9\u9F50"\u3002
|
|
426
|
+
\u6A2A\u5411\u6EA2\u51FA\u7167\u53C2\u8003\u56FE\u5904\u7406\uFF1A\u4E00\u884C\u6A2A\u5411\u6EDA\u52A8 + \u53F3\u7AEF\u4E00\u4E2A\u5706\u5F62\u7BAD\u5934\u3002
|
|
427
|
+
\u26A0\uFE0F \u7BAD\u5934\u6309\u94AE\u5FC5\u987B\u653E\u5728\u5916\u5C42 .t-team-divbar \u4E0A\uFF1A\u6EDA\u52A8\u5BB9\u5668\u7684\u7EDD\u5BF9\u5B9A\u4F4D\u5B50\u5143\u7D20\u4F1A**\u8DDF\u7740\u5185\u5BB9\u4E00\u8D77\u6EDA\u8D70**\u3002 */
|
|
428
|
+
.t-team-divbar{position:relative;display:flex;align-items:center;min-width:0}
|
|
429
|
+
/* \u7ED9\u7BAD\u5934\u8BA9\u4F4D\uFF1A\u53EA\u5728\u5BF9\u5E94\u90A3\u4E00\u4FA7\u7684\u7BAD\u5934\u771F\u7684\u51FA\u73B0\u65F6\u624D\u52A0\u5185\u8FB9\u8DDD \u2014\u2014 \u6CA1\u6EDA\u52A8\u65F6\u5DE6\u4FA7\u4E0D\u52A0\uFF0C
|
|
430
|
+
\u6240\u4EE5\u7B2C\u4E00\u4E2A\u6807\u7B7E\u4ECD\u7136\u4E0E\u641C\u7D22\u6846\u5DE6\u8FB9\u7F18\u5BF9\u9F50\uFF08\u7528\u6237\u7279\u522B\u70B9\u7684\u90A3\u6761\u300C\u5BF9\u9F50\u5BBD\u5EA6\u300D\uFF09\u3002
|
|
431
|
+
38px = \u7BAD\u5934\u76F4\u5F84 32px + 6px \u95F4\u9699\uFF08\u7BAD\u5934\u653E\u5927\u540E\u8FD9\u91CC\u5FC5\u987B\u8DDF\u7740\u6539\uFF0C\u5426\u5219\u5B83\u4F1A\u538B\u4F4F\u6700\u540E\u4E00\u4E2A\u6807\u7B7E\uFF09\u3002 */
|
|
432
|
+
.t-team-divbar[data-more="true"] .t-team-pop-divs{padding-right:38px}
|
|
433
|
+
.t-team-divbar[data-back="true"] .t-team-pop-divs{padding-left:38px}
|
|
434
|
+
/* \u26A0\uFE0F \u8FD9\u91CC**\u4E0D\u5199** scroll-behavior:smooth\uFF082026-09-29 \u52A0\u4E86\u6EDA\u8F6E\u6A2A\u5411\u6EDA\u52A8\u4E4B\u540E\u53BB\u6389\u7684\uFF09\uFF1A
|
|
435
|
+
\u6EDA\u8F6E\u8981\u6C42"\u8F6C\u591A\u5C11\u8D70\u591A\u5C11"\u7684\u5373\u65F6\u8DDF\u624B\uFF0Csmooth \u4F1A\u8BA9\u6BCF\u4E00\u683C\u6EDA\u8F6E\u90FD\u53D8\u6210\u4E00\u6BB5\u52A8\u753B\uFF0C\u53CD\u800C\u53D1\u98D8\u3002
|
|
436
|
+
\u9700\u8981\u5E73\u6ED1\u7684\u662F\u90A3\u4E24\u9897\u7BAD\u5934\u6309\u94AE \u2014\u2014 \u5B83\u4EEC\u81EA\u5DF1\u4F20 scrollBy({behavior:"smooth"})\u3002 */
|
|
437
|
+
.t-team-pop-divs{display:flex;align-items:center;gap:6px;flex:1 1 auto;min-width:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}
|
|
438
|
+
.t-team-pop-divs::-webkit-scrollbar{display:none}
|
|
439
|
+
/* \u5206\u7C7B\u6807\u7B7E\u4E0E\u7AEF\u5934\u7684\u5706**\u540C\u9AD8**\uFF0832px\uFF09\uFF1A\u5706\u662F\u7EDD\u5BF9\u5B9A\u4F4D\u3001\u4E0D\u53C2\u4E0E\u5E03\u5C40\uFF0C\u884C\u9AD8\u7531\u6807\u7B7E\u51B3\u5B9A \u2014\u2014
|
|
440
|
+
\u4E24\u8005\u4E0D\u76F8\u7B49\u65F6\u5706\u4F1A\u4E0A\u4E0B\u6EA2\u51FA\u5230\u884C\u5916\uFF0C\u770B\u7740\u5C31\u4E0D\u50CF\u4E2A\u5B8C\u6574\u7684\u6B63\u5706\uFF082026-09-29 \u7528\u6237\uFF1A\u300C\u8981\u6B63\u5706\u300D\uFF09\u3002 */
|
|
441
|
+
.t-team-div-chip{flex:0 0 auto;box-sizing:border-box;height:32px;padding:0 12px;border:0;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;line-height:32px;white-space:nowrap;cursor:pointer}
|
|
442
|
+
.t-team-div-chip:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
|
|
443
|
+
.t-team-div-chip[data-active="true"]{background:var(--dsw-alias-bg-layer-2,var(--dsw-alias-interactive-bg-hover));color:var(--dsw-alias-label-primary);font-weight:500}
|
|
444
|
+
/* \u5206\u7C7B\u884C\u4E24\u7AEF\u7684\u7BAD\u5934\uFF082026-09-29 \u4E09\u8F6E\u7528\u6237\u53E3\u5F84\u5408\u5E76\u7684\u7ED3\u679C\uFF09\uFF1A
|
|
445
|
+
\u2460 \u300C< > \u6700\u597D\u52A0\u4E2A\u8FB9\u7EBF\uFF0C\u73B0\u5728\u770B\u7740\u4E0D\u660E\u663E\u300D\u2192 \u52A0\u63CF\u8FB9\uFF1B
|
|
446
|
+
\u2461 \u300C\u8FD9\u79CD\u5706\u5F62\u98CE\u683C\u884C\u5417\uFF0C\u518D\u5927\u4E00\u70B9\u70B9\u300D\uFF08\u9644\u53C2\u8003\u56FE\uFF09\u2192 \u653E\u5927\u5230 32px\u3001\u7BAD\u5934 18px\uFF1B
|
|
447
|
+
\u2462 \u300C\u4E3A\u4EC0\u4E48\u662F\u534A\u900F\u660E\u7684\uFF1F\u8FD8\u6709\u8981\u6B63\u5706\u300D\u2192 \u4E24\u5904\u90FD\u6539\uFF1A
|
|
448
|
+
\xB7 \u5E95\u8272\u6362\u6210**\u5B9E\u8272**\u7684\u300C--dsw-alias-bg-layer-3\u300D\u3002\u4E0A\u4E00\u7248\u7528\u7684\u300Cinteractive-bg-hover\u300D\u672C\u8EAB\u5C31\u662F
|
|
449
|
+
alpha \u8272\uFF08fallback #0000000d\uFF0C\u7EA6 5% \u9ED1\uFF09\uFF0C\u53E0\u5728\u534A\u900F\u660E\u83DC\u5355\u6750\u8D28\u4E0A\u6574\u4E2A\u5706\u90FD\u662F\u900F\u7684 \u2014\u2014
|
|
450
|
+
\u90A3\u662F"\u770B\u8D77\u6765\u534A\u900F\u660E"\u7684\u76F4\u63A5\u539F\u56E0\uFF0C\u4E0D\u662F\u9762\u677F\u7684\u95EE\u9898\uFF1B
|
|
451
|
+
\xB7 \u5782\u76F4\u5C45\u4E2D\u4E0D\u518D\u7528\u300Ctop:50% + translateY(-50%)\u300D\uFF1A\u534A\u50CF\u7D20\u9AD8\u5EA6\u4E0B\u5B83\u4F1A\u843D\u5728 .5px \u4E0A\uFF0C\u5706\u5F62\u8FB9\u7F18\u88AB
|
|
452
|
+
\u91CD\u91C7\u6837\u3001\u770B\u7740\u5C31\u4E0D\u5706\u3002\u6539\u6210\u300Ctop:0;bottom:0;margin:auto 0\u300D\uFF08\u884C\u9AD8\u4E0E\u5706\u540C\u9AD8\u65F6\u662F\u6574\u6570\u50CF\u7D20\u5BF9\u9F50\uFF09\u3002
|
|
453
|
+
\u26A0\uFE0F \u52A0\u63CF\u8FB9\u5FC5\u987B\u540C\u65F6\u7ED9 box-sizing:border-box\uFF0C\u5426\u5219\u8FB9\u6846\u4F1A\u628A\u5706\u6491\u5927\u3001\u628A\u5206\u7C7B\u884C\u9876\u9AD8\u3002 */
|
|
454
|
+
.t-team-div-scroll{position:absolute;top:0;bottom:0;margin:auto 0;box-sizing:border-box;display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:1px solid var(--dsw-alias-border-l1);border-radius:50%;background:var(--dsw-alias-bg-layer-3,#f7f8fa);color:var(--dsw-alias-label-secondary);font-size:18px;line-height:1;cursor:pointer;box-shadow:0 0 1px 0 #0003, 0 0 4px 0 #00000008}
|
|
455
|
+
/* \u4E24\u4E2A\u65B9\u5411\u5404\u8D34\u4E00\u8FB9\uFF1A\u53F3\u7AEF\u300C\u8FD8\u6709\u66F4\u591A\u300D\u3001\u5DE6\u7AEF\u300C\u5DF2\u7ECF\u6EDA\u8FC7\u53BB\u4E86\uFF0C\u70B9\u6211\u56DE\u53BB\u300D\u3002 */
|
|
456
|
+
.t-team-div-scroll[data-dir="next"]{right:0}
|
|
457
|
+
.t-team-div-scroll[data-dir="prev"]{left:0}
|
|
458
|
+
.t-team-div-scroll:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l2)}
|
|
363
459
|
.t-team-pop .t-team-tabs{gap:2px;padding-bottom:4px}
|
|
364
460
|
.t-team-pop .t-team-tab{font-size:12px;padding:3px 8px}
|
|
365
461
|
/* \u6807\u7B7E\u4E0A\u7684\u8BA1\u6570\uFF1A\u6BD4\u6807\u7B7E\u5C0F\u4E00\u53F7\u3001\u7A0D\u6DE1\uFF0Ctabular-nums \u8BA9\u6570\u5B57\u7B49\u5BBD \u2014\u2014 \u5426\u5219 401 \u2192 99 \u65F6\u6807\u7B7E\u5BBD\u5EA6\u4F1A\u8DF3\u3002 */
|
|
@@ -389,23 +485,48 @@ var CSS = `
|
|
|
389
485
|
2026-09-23 \u7528\u6237\u53CD\u9988\u300C\u5361\u7247\u592A\u7D27\u51D1\u4E86\uFF0C\u5927\u4E00\u70B9\u300D\uFF1A\u5185\u8FB9\u8DDD 10\u219214\u3001\u5361\u7247\u95F4\u8DDD 6/8\u219210/12\u3001
|
|
390
486
|
\u5934\u50CF\u4E0E\u5934\u90E8 32\u219240\u3001\u540D\u5B57 13\u219214\u3001\u526F\u6807\u9898\u4E0E\u7B80\u4ECB 11\u219212\u3001\u5361\u7247\u5E95\u9AD8 93\u2192114\uFF0814+40+8+36+14+2\uFF09\u3002
|
|
391
487
|
\u8FD9\u51E0\u5904\u5C3A\u5BF8\u662F\u8054\u52A8\u7684\uFF0C\u6539\u4E00\u4E2A\u5C31\u5F97\u6539\u5176\u4F59\u7684\uFF0C\u5426\u5219\u4E24\u4E2A tab \u53C8\u4F1A\u4E0D\u7B49\u9AD8\u3002 */
|
|
392
|
-
.t-team-pop-item{display:flex;flex-direction:column;gap:8px;min-width:0;min-height:
|
|
488
|
+
.t-team-pop-item{display:flex;flex-direction:column;gap:8px;min-width:0;min-height:146px;box-sizing:border-box;overflow:hidden;text-align:left;padding:14px;border-radius:16px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:inherit;font:inherit;cursor:pointer;content-visibility:auto;contain-intrinsic-size:auto 146px}
|
|
489
|
+
/* content-visibility\uFF082026-09-29\uFF0C\u7528\u6237\u62A5\u300C\u5F39\u7A97\u6709\u70B9\u5361\u300D\uFF09\uFF1A\u4E13\u5BB6/\u6280\u80FD\u5361\u7247\u662F**\u7B49\u9AD8**\u7684
|
|
490
|
+
\uFF08min-height:146px\uFF0C\u5934\u90E8 44 + \u7B80\u4ECB\u4E24\u884C + \u6807\u7B7E\u884C\uFF0C\u89C1\u4E0B\u9762\u7684\u8BF4\u660E\uFF09\uFF0C\u6B63\u597D\u662F\u5B83\u6700\u5408\u9002\u7684\u7528\u6CD5 \u2014\u2014
|
|
491
|
+
\u5C4F\u5E55\u5916\u7684\u5361\u7247\u76F4\u63A5\u8DF3\u8FC7\u6837\u5F0F/\u5E03\u5C40/\u7ED8\u5236\uFF0C\u6253\u5F00\u9762\u677F\u65F6\u771F\u6B63\u8981\u6E32\u67D3\u7684\u4ECE 300+ \u5F20\u964D\u5230\u53EF\u89C6\u533A\u7684\u5341\u51E0\u5F20\u3002
|
|
492
|
+
contain-intrinsic-size \u5FC5\u987B\u5199\u3001\u4E14\u8981\u8D34\u7740\u771F\u5B9E\u9AD8\u5EA6\uFF08146px\uFF09\uFF0C\u5426\u5219\u6EDA\u52A8\u6761\u7684\u4F30\u7B97\u957F\u5EA6\u4F1A\u8DF3\u3002
|
|
493
|
+
\u8001\u5BBF\u4E3B\uFF08\u4E0D\u652F\u6301\u8BE5\u5C5E\u6027\uFF09\u4F1A\u5FFD\u7565\u8FD9\u4E24\u6761\uFF0C\u884C\u4E3A\u4E0D\u53D8\u3002 */
|
|
393
494
|
.t-team-pop-item:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l3)}
|
|
394
495
|
/* \u5361\u7247\u88C1\u8FB9\uFF08overflow:hidden\uFF09\u4F1A\u628A\u5BBF\u4E3B\u9ED8\u8BA4\u7684 focus \u8F6E\u5ED3\u4E00\u8D77\u88C1\u6389\uFF0C\u952E\u76D8 Tab \u9009\u4E2D\u5C31\u770B\u4E0D\u51FA\u6765\u4E86\uFF0C
|
|
395
496
|
\u6240\u4EE5\u7126\u70B9\u73AF\u81EA\u5DF1\u753B\u3001\u5E76\u538B\u5728\u5361\u7247\u5185\u4FA7\uFF08offset \u8D1F\u503C\uFF09\u3002 */
|
|
396
497
|
.t-team-pop-item:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}
|
|
397
|
-
/* \u5934\u90E8\u9AD8\u5EA6\u5199\u6B7B
|
|
398
|
-
\u4E13\u5BB6\u5361\u91CC\u6807\u9898\u6709\u4E24\u884C\uFF08\u540D\u5B57 + \u5BF9\u7167\u540D \u2248 34px\uFF09\uFF0C\u5FC5\u987B\u9489\u4F4F\uFF0C\u5426\u5219\u5B83\u4F1A\u6BD4\u6280\u80FD\u5361\u9AD8\u3002
|
|
399
|
-
|
|
498
|
+
/* \u5934\u90E8\u9AD8\u5EA6\u5199\u6B7B 44px\uFF1A\u5361\u7247\u7B49\u9AD8\u7684\u524D\u63D0\u3002\u6280\u80FD\u5361\u91CC\u6807\u9898\u53EA\u6709\u4E00\u884C\uFF0C\u6491\u5230 44px \u7684\u662F\u5934\u50CF\uFF1B
|
|
499
|
+
\u4E13\u5BB6\u5361\u91CC\u6807\u9898\u6709\u4E24\u884C\uFF08\u540D\u5B57 + \u5BF9\u7167\u540D \u2248 34px\uFF09\uFF0C\u5FC5\u987B\u9489\u4F4F\uFF0C\u5426\u5219\u5B83\u4F1A\u6BD4\u6280\u80FD\u5361\u9AD8\u3002
|
|
500
|
+
\u26A0\uFE0F \u300Cjustify-content:flex-start\u300D\u662F 2026-09-29 \u8865\u7684**\u4FEE bug**\u3001\u4E0D\u662F\u6392\u7248\u504F\u597D\uFF1A
|
|
501
|
+
\u300C.t-team-pop-head\u300D\u8FD9\u4E2A\u540D\u5B57\u540C\u65F6\u88AB**\u9762\u677F\u6807\u9898\u884C**\uFF08\u9876\u680F\u300CT\u4E13\u5BB6 + \u5173\u95ED\u300D\uFF09\u7528\u7740\uFF0C\u800C\u5B83\u90A3\u6761\u89C4\u5219\u5E26
|
|
502
|
+
\u300Cjustify-content:space-between\u300D\u2014\u2014 \u4E8E\u662F\u5361\u7247\u91CC\u7684\u300C\u5934\u50CF + \u540D\u79F0\u300D\u88AB\u63A8\u6210\u4E24\u7AEF\u5BF9\u9F50\u3001\u540D\u79F0\u8D34\u5230\u4E86\u53F3\u8FB9\u3002
|
|
503
|
+
\u7528\u6237\u5F53\u65F6\u7684\u53E3\u5F84\u300C\u540D\u79F0\u90FD\u9760\u5DE6\u300D\u8BF4\u7684\u5C31\u662F\u8FD9\u4E2A\u3002\u8FD9\u91CC\u7528\u66F4\u9AD8\u7684\u7279\u5F02\u6027\u63B0\u56DE\u6765\uFF08\u987A\u5E8F\u4E5F\u6392\u5728\u5B83\u4E4B\u540E\uFF09\u3002 */
|
|
504
|
+
.t-team-pop-item .t-team-pop-head{height:44px;justify-content:flex-start}
|
|
400
505
|
.t-team-pop-head{display:flex;align-items:center;gap:10px;min-width:0}
|
|
401
|
-
|
|
506
|
+
/* \u5934\u50CF\uFF1A44px \u5706\u3002\u5E95\u8272\u9ED8\u8BA4\u6DE1\u7070\uFF0C\u4E13\u5BB6\u5361\u7531 inline style \u7528\u540D\u518C frontmatter \u7684\u300Ccolor\u300D\u538B\u6210\u6DE1\u8272\u5706\u5E95
|
|
507
|
+
\uFF08\u89C1 ui.jsx \u7684 tintOf\uFF0Calpha 24%\uFF09\uFF1B\u91CC\u9762\u662F\u4E13\u5BB6\u81EA\u5DF1\u7684\u5F69\u8272 emoji\u3002
|
|
508
|
+
2026-09-29 \u7528\u6237\u53E3\u5F84\u300C\u7ED9\u8FD9\u4E9B\u56FE\u6807\u52A0\u4E00\u4E2A\u6DE1\u6DE1\u7684\u80CC\u666F\uFF0C\u73B0\u5728 emoji \u90FD\u5F88\u5C0F\uFF0C\u770B\u7740\u4E0D\u534F\u8C03\u300D\u4E09\u5904\u4E00\u8D77\u8C03\uFF1A
|
|
509
|
+
\u2460 \u6DE1\u8272\u5E95 14% \u2192 24%\uFF0814% \u94FA\u5728\u767D\u5361\u7247\u4E0A\u51E0\u4E4E\u770B\u4E0D\u51FA\u5706\uFF0C\u5706\u6CA1\u8FB9\u3001\u91CC\u9762\u53C8\u662F\u5C0F emoji\uFF0C\u6574\u4F53\u5C31\u53D1\u98D8\uFF09\uFF1B
|
|
510
|
+
\u2461 emoji \u5B57\u53F7 22 \u2192 26px\uFF0844px \u7684\u5706\u91CC\u66F4\u9971\u6EE1\uFF0C\u4E0A\u4E0B\u5404\u7559 9px\uFF09\uFF1B
|
|
511
|
+
\u2462 \u6CA1\u6709 color \u65F6\u7684\u515C\u5E95\u5E95\u8272\u4ECE\u8FD1\u767D\u7684 layer-3 \u6362\u6210\u6DE1\u7070\u7684 interactive-bg-hover
|
|
512
|
+
\uFF08\u8001\u6570\u636E\u3001\u6216\u989C\u8272\u540D\u4E0D\u88AB\u652F\u6301\u7684\u5BBF\u4E3B\u4E0A\uFF0C\u4E5F\u8FD8\u770B\u5F97\u89C1\u4E00\u4E2A\u5706\uFF09\u3002 */
|
|
513
|
+
.t-team-pop-avatar{flex:none;display:grid;place-items:center;width:44px;height:44px;border-radius:50%;background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);font-size:26px;line-height:1}
|
|
514
|
+
/* \u6280\u80FD\u5361\u5934\u50CF\uFF1A\u6280\u80FD\u6CA1\u6709 color \u5B57\u6BB5\uFF0C\u56FA\u5B9A\u7528\u540C\u4E00\u6863\u6DE1\u7070\u5E95 + \u5F69\u8272 emoji\uFF08\u{1F9F0}\uFF09\u2014\u2014 \u4E0E\u4E13\u5BB6\u5361\u7684\u6DE1\u8272\u5706\u540C\u4E00\u5957\u89C2\u611F\u3002 */
|
|
515
|
+
.t-team-pop-avatar-skill{background:var(--dsw-alias-interactive-bg-hover)}
|
|
402
516
|
.t-team-pop-title{display:flex;flex-direction:column;gap:3px;min-width:0}
|
|
403
|
-
.t-team-pop-
|
|
517
|
+
/* \u540D\u79F0\uFF1A15px/600\uFF08\u53C2\u8003\u56FE\u91CC\u5B83\u662F\u5361\u7247\u91CC\u6700\u5927\u7684\u4E00\u884C\uFF09\u3002\u5B83\u5FC5\u987B\u9760\u5DE6 \u2014\u2014 \u9760\u7684\u662F .t-team-pop-item \u7684
|
|
518
|
+
text-align:left \u52A0\u4E0A\u90A3\u4E00\u884C\u5BF9 justify-content \u7684\u4FEE\u6B63\uFF0C\u89C1\u4E0A\u9762\u7684\u8BF4\u660E\u3002 */
|
|
519
|
+
.t-team-pop-name{font-size:15px;font-weight:600;color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
404
520
|
.t-team-pop-sub{font-size:12px;color:var(--dsw-alias-label-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
405
521
|
/* \u7B80\u4ECB\u56FA\u5B9A\u4E24\u884C\uFF1A\u5185\u5BB9\u591A\u7684\u622A\u65AD\uFF08-webkit-line-clamp:2\uFF09\uFF0C\u5185\u5BB9\u5C11\u7684\u7528 min-height \u5360\u4F4F\u4E24\u884C\u7684\u9AD8\u5EA6 \u2014\u2014
|
|
406
522
|
\u8FD9\u4E00\u6761\u662F\u300C\u4E13\u5BB6\u5361 = \u6280\u80FD\u5361\u300D\u7684\u53E6\u4E00\u534A\uFF1A\u6280\u80FD\u63CF\u8FF0\u666E\u904D\u504F\u77ED\uFF0C\u4E0D\u5360\u4F4D\u7684\u8BDD\u6280\u80FD\u5361\u4F1A\u6BD4\u4E13\u5BB6\u5361\u77EE\u4E00\u622A\u3002
|
|
407
523
|
\u4E24\u884C = 12px \xD7 1.5 \xD7 2 = 36px\u3002\u60F3\u8C03\u884C\u6570\u5C31\u628A line-clamp \u4E0E min-height \u4E00\u8D77\u6539\u3002 */
|
|
408
524
|
.t-team-pop-desc{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:36px;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-secondary)}
|
|
525
|
+
/* \u5361\u7247\u5E95\u90E8\u6807\u7B7E\u884C\uFF082026-09-29 \u53C2\u8003\u56FE\uFF09\uFF1A\u6D45\u7070\u80F6\u56CA\u3002\u4E13\u5BB6\u5361\u653E\u300C\u5206\u533A [+ \u81EA\u5EFA]\u300D\u3001\u6280\u80FD\u5361\u653E\u300C\u6280\u80FD [+ \u4EC5\u7528\u6237]\u300D\u3002
|
|
526
|
+
\u4E24\u5361\u90FD\u6709\u8FD9\u4E00\u884C\u3001\u9AD8\u5EA6\u56FA\u5B9A 20px \u2014\u2014 \u5B83\u662F"\u4E24\u5361\u7B49\u9AD8"\u7684\u6700\u540E\u4E00\u5757\u3002
|
|
527
|
+
nowrap + overflow:hidden\uFF1A\u5217\u5F88\u7A84\uFF0C\u5B81\u53EF\u622A\u65AD\u4E5F\u4E0D\u8981\u6362\u884C\uFF08\u6362\u884C\u4F1A\u7834\u574F\u7B49\u9AD8\u4E0E contain-intrinsic-size \u7684\u4F30\u7B97\uFF09\u3002 */
|
|
528
|
+
.t-team-pop-tags{display:flex;flex-wrap:nowrap;gap:6px;height:20px;overflow:hidden}
|
|
529
|
+
.t-team-pop-tag{flex:0 0 auto;box-sizing:border-box;height:20px;padding:0 8px;border-radius:6px;background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);font-size:11px;line-height:20px;white-space:nowrap}
|
|
409
530
|
.t-team-pop-empty{font-size:12px;color:var(--dsw-alias-label-tertiary);padding:6px 2px}
|
|
410
531
|
.t-team-pop-head{display:flex;align-items:center;justify-content:space-between;font-size:12px;font-weight:600;color:var(--dsw-alias-label-secondary)}
|
|
411
532
|
/* \u952E\u76D8\u7126\u70B9\u73AF\uFF1A\u5B98\u65B9\u7ED9\u6574\u9875\u4E00\u6761\u7EDF\u4E00\u89C4\u5219\uFF08.t-XoWW_page :focus-visible{outline:2px solid \u2026;offset:2px}\uFF09\uFF0C
|
|
@@ -574,6 +695,9 @@ var zh = {
|
|
|
574
695
|
"card.promptFailed": "\u8BFB\u53D6\u63D0\u793A\u8BCD\u5931\u8D25\uFF1A{detail}",
|
|
575
696
|
"card.promptEmpty": "\u8BE5\u4E13\u5BB6\u6CA1\u6709\u53EF\u663E\u793A\u7684\u63D0\u793A\u8BCD\u6B63\u6587\u3002",
|
|
576
697
|
"card.close": "\u5173\u95ED",
|
|
698
|
+
"card.copy": "\u590D\u5236",
|
|
699
|
+
"card.copied": "\u5DF2\u590D\u5236",
|
|
700
|
+
"card.copyFailed": "\u590D\u5236\u5931\u8D25",
|
|
577
701
|
"settings.saveFailed": "\u4FDD\u5B58\u5931\u8D25\uFF1A{detail}",
|
|
578
702
|
"settings.loadFailed": "\u8BFB\u53D6\u540D\u518C\u5931\u8D25\uFF1A{detail}",
|
|
579
703
|
"settings.conflictRetry": "\u8BBE\u7F6E\u5DF2\u88AB\u5176\u4ED6\u7A97\u53E3\u4FEE\u6539\uFF0C\u5DF2\u91CD\u65B0\u8BFB\u53D6\u540D\u518C\uFF0C\u8BF7\u91CD\u8BD5\u3002",
|
|
@@ -641,6 +765,11 @@ var zh = {
|
|
|
641
765
|
"custom.badge": "\u81EA\u5EFA",
|
|
642
766
|
"custom.loadingBody": "\u6B63\u5728\u8BFB\u53D6\u4EBA\u683C\u6B63\u6587\u2026",
|
|
643
767
|
"pop.title": "T\u4E13\u5BB6",
|
|
768
|
+
// 输入区面板的分类标签行(2026-09-29 用户要求:搜索框下面加一行分类)
|
|
769
|
+
"pop.all": "\u5168\u90E8",
|
|
770
|
+
"pop.divisions": "\u6309\u5206\u7C7B\u7B5B\u9009",
|
|
771
|
+
"pop.divisionsMore": "\u66F4\u591A\u5206\u7C7B",
|
|
772
|
+
"pop.divisionsPrev": "\u524D\u9762\u7684\u5206\u7C7B",
|
|
644
773
|
// 列表过滤与搜索(与官方「自动化任务」页同一套:标签行 + 搜索框)
|
|
645
774
|
// 三档:全部 / 已启用 / 已停用 —— 停用 ≠ 删除(停用的任务保留数据、只是不触发)。
|
|
646
775
|
// 运行时间卡片(对齐官方详情页的「运行时间」:重复 / 时间 / 星期 三行)
|
|
@@ -708,6 +837,9 @@ var en = {
|
|
|
708
837
|
"card.promptFailed": "Failed to load prompt: {detail}",
|
|
709
838
|
"card.promptEmpty": "This expert has no prompt body to show.",
|
|
710
839
|
"card.close": "Close",
|
|
840
|
+
"card.copy": "Copy",
|
|
841
|
+
"card.copied": "Copied",
|
|
842
|
+
"card.copyFailed": "Copy failed",
|
|
711
843
|
"settings.saveFailed": "Save failed: {detail}",
|
|
712
844
|
"settings.loadFailed": "Failed to load roster: {detail}",
|
|
713
845
|
"settings.conflictRetry": "Settings changed elsewhere; roster reloaded, please retry.",
|
|
@@ -775,6 +907,11 @@ var en = {
|
|
|
775
907
|
"custom.badge": "Custom",
|
|
776
908
|
"custom.loadingBody": "Loading persona body\u2026",
|
|
777
909
|
"pop.title": "T Expert",
|
|
910
|
+
// Division filter row inside the composer panel (2026-09-29).
|
|
911
|
+
"pop.all": "All",
|
|
912
|
+
"pop.divisions": "Filter by division",
|
|
913
|
+
"pop.divisionsMore": "More divisions",
|
|
914
|
+
"pop.divisionsPrev": "Previous divisions",
|
|
778
915
|
// List filter and search (same shape as the built-in Automation page: tab row + search field).
|
|
779
916
|
// Three lanes: All / Active / Disabled — disabled keeps its data and simply never fires.
|
|
780
917
|
// Run-time card (mirrors the built-in page's "Run time": repeat / time / weekday rows)
|
|
@@ -20743,6 +20880,16 @@ var PModal = typeof primitives.Modal === "function" ? primitives.Modal : null;
|
|
|
20743
20880
|
var PTag = typeof primitives.Tag === "function" ? primitives.Tag : null;
|
|
20744
20881
|
var PSwitch = typeof primitives.Switch === "function" ? primitives.Switch : null;
|
|
20745
20882
|
var PSegmentedControl = typeof primitives.SegmentedControl === "function" ? primitives.SegmentedControl : null;
|
|
20883
|
+
var PWriteClipboard = typeof primitives.writeClipboard === "function" ? primitives.writeClipboard : null;
|
|
20884
|
+
async function copyText(text) {
|
|
20885
|
+
if (PWriteClipboard !== null) return await PWriteClipboard(text);
|
|
20886
|
+
try {
|
|
20887
|
+
await navigator.clipboard.writeText(text);
|
|
20888
|
+
return true;
|
|
20889
|
+
} catch {
|
|
20890
|
+
return false;
|
|
20891
|
+
}
|
|
20892
|
+
}
|
|
20746
20893
|
function Card({ title, hint, children }) {
|
|
20747
20894
|
return /* @__PURE__ */ import_react2.default.createElement("section", { className: "t-team-panel-card", "aria-label": title }, /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-panel-card-head" }, /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-panel-card-title" }, title), hint === void 0 ? null : /* @__PURE__ */ import_react2.default.createElement("div", { className: "t-team-panel-card-hint" }, hint)), children);
|
|
20748
20895
|
}
|
|
@@ -20796,10 +20943,24 @@ function Tabs({ items, value, onChange, label }) {
|
|
|
20796
20943
|
item.label
|
|
20797
20944
|
)));
|
|
20798
20945
|
}
|
|
20799
|
-
function Modal2({ open: open2, title, onClose, closeLabel, description, children, footer }) {
|
|
20946
|
+
function Modal2({ open: open2, title, onClose, closeLabel, description, children, footer, className }) {
|
|
20800
20947
|
if (!open2) return null;
|
|
20801
20948
|
if (PModal !== null) {
|
|
20802
|
-
|
|
20949
|
+
const dialogCls = className === void 0 ? "t-team-modal-fit" : `t-team-modal-fit ${className}`;
|
|
20950
|
+
return /* @__PURE__ */ import_react2.default.createElement(
|
|
20951
|
+
PModal,
|
|
20952
|
+
{
|
|
20953
|
+
open: open2,
|
|
20954
|
+
title,
|
|
20955
|
+
onClose,
|
|
20956
|
+
closeLabel,
|
|
20957
|
+
description,
|
|
20958
|
+
footer,
|
|
20959
|
+
className: dialogCls,
|
|
20960
|
+
contentClassName: "t-team-modal-fit-content"
|
|
20961
|
+
},
|
|
20962
|
+
children
|
|
20963
|
+
);
|
|
20803
20964
|
}
|
|
20804
20965
|
return /* @__PURE__ */ import_react2.default.createElement(
|
|
20805
20966
|
"div",
|
|
@@ -20888,6 +21049,208 @@ function ChoiceGroup({ label, options, value, onSelect, disabled, id }) {
|
|
|
20888
21049
|
item.label
|
|
20889
21050
|
)));
|
|
20890
21051
|
}
|
|
21052
|
+
var PAnchoredPosition = typeof primitives.useAnchoredPosition === "function" ? primitives.useAnchoredPosition : null;
|
|
21053
|
+
var PDismissOnOutsidePointer = typeof primitives.useDismissOnOutsidePointer === "function" ? primitives.useDismissOnOutsidePointer : null;
|
|
21054
|
+
var PMenuSurface = typeof primitives.MenuSurface === "function" ? primitives.MenuSurface : null;
|
|
21055
|
+
var useLayout = typeof window === "undefined" ? import_react2.default.useEffect : import_react2.default.useLayoutEffect;
|
|
21056
|
+
function anchorInput(rootRef) {
|
|
21057
|
+
let node2 = rootRef.current?.parentElement ?? null;
|
|
21058
|
+
for (let i = 0; i < 8 && node2 !== null; i += 1) {
|
|
21059
|
+
if (node2.matches?.("[data-composer-card]") === true) return node2;
|
|
21060
|
+
node2 = node2.parentElement;
|
|
21061
|
+
}
|
|
21062
|
+
node2 = rootRef.current?.parentElement ?? null;
|
|
21063
|
+
for (let i = 0; i < 8 && node2 !== null; i += 1) {
|
|
21064
|
+
const found = node2.querySelector?.("textarea, [contenteditable='true']");
|
|
21065
|
+
if (found !== null && found !== void 0) return found;
|
|
21066
|
+
node2 = node2.parentElement;
|
|
21067
|
+
}
|
|
21068
|
+
return void 0;
|
|
21069
|
+
}
|
|
21070
|
+
function overlayTopMargin(min) {
|
|
21071
|
+
const root = document.documentElement;
|
|
21072
|
+
const clearance = Number.parseFloat(getComputedStyle(root).getPropertyValue("--dsh-frame-top-clearance"));
|
|
21073
|
+
if (Number.isNaN(clearance)) return min;
|
|
21074
|
+
return Math.max(min, (root.hasAttribute("data-fullscreen") ? 0 : clearance) + 20);
|
|
21075
|
+
}
|
|
21076
|
+
function useOwnAnchoredPosition({ open: open2, anchorRef, panelRef, side = "bottom", align = "start", gap = 6, margin = 8 }) {
|
|
21077
|
+
const [position, setPosition] = import_react2.default.useState(null);
|
|
21078
|
+
useLayout(() => {
|
|
21079
|
+
if (!open2) {
|
|
21080
|
+
setPosition(null);
|
|
21081
|
+
return void 0;
|
|
21082
|
+
}
|
|
21083
|
+
const place = () => {
|
|
21084
|
+
const rect = anchorRef.current?.getBoundingClientRect();
|
|
21085
|
+
if (rect === void 0) return;
|
|
21086
|
+
const panel2 = panelRef.current;
|
|
21087
|
+
const width = panel2?.offsetWidth ?? 0;
|
|
21088
|
+
const height = panel2?.offsetHeight ?? 0;
|
|
21089
|
+
let left = align === "end" ? rect.right - width : rect.left;
|
|
21090
|
+
let top = side === "top" ? rect.top - gap - height : rect.bottom + gap;
|
|
21091
|
+
if (width > 0) left = Math.min(Math.max(left, margin), window.innerWidth - width - margin);
|
|
21092
|
+
if (height > 0) top = Math.min(Math.max(top, overlayTopMargin(margin)), window.innerHeight - height - margin);
|
|
21093
|
+
setPosition({ left, top });
|
|
21094
|
+
};
|
|
21095
|
+
place();
|
|
21096
|
+
window.addEventListener("scroll", place, true);
|
|
21097
|
+
window.addEventListener("resize", place);
|
|
21098
|
+
const panel = panelRef.current;
|
|
21099
|
+
let observer = null;
|
|
21100
|
+
if (typeof ResizeObserver !== "undefined" && panel !== null && panel !== void 0) {
|
|
21101
|
+
observer = new ResizeObserver(place);
|
|
21102
|
+
observer.observe(panel);
|
|
21103
|
+
}
|
|
21104
|
+
return () => {
|
|
21105
|
+
observer?.disconnect();
|
|
21106
|
+
window.removeEventListener("scroll", place, true);
|
|
21107
|
+
window.removeEventListener("resize", place);
|
|
21108
|
+
};
|
|
21109
|
+
}, [open2, anchorRef, panelRef, side, align, gap, margin]);
|
|
21110
|
+
return position;
|
|
21111
|
+
}
|
|
21112
|
+
var useAnchoredPosition2 = PAnchoredPosition ?? useOwnAnchoredPosition;
|
|
21113
|
+
function useOwnDismissOnOutsidePointer(root, open2, setOpen, portal) {
|
|
21114
|
+
import_react2.default.useEffect(() => {
|
|
21115
|
+
if (!open2) return void 0;
|
|
21116
|
+
const onDown = (event) => {
|
|
21117
|
+
if (event.target instanceof Node && root.current?.contains(event.target) !== true && portal?.current?.contains(event.target) !== true) setOpen(false);
|
|
21118
|
+
};
|
|
21119
|
+
document.addEventListener("pointerdown", onDown);
|
|
21120
|
+
return () => document.removeEventListener("pointerdown", onDown);
|
|
21121
|
+
}, [root, open2, setOpen, portal]);
|
|
21122
|
+
}
|
|
21123
|
+
var useDismissOnOutsidePointer2 = PDismissOnOutsidePointer ?? useOwnDismissOnOutsidePointer;
|
|
21124
|
+
function useFloatingShell({ open: open2, setOpen, rootRef, panelRef, gap = 6, margin = 8, ideal = 600 }) {
|
|
21125
|
+
const anchorRef = import_react2.default.useRef(null);
|
|
21126
|
+
const [side, setSide] = import_react2.default.useState("top");
|
|
21127
|
+
const [width, setWidth] = import_react2.default.useState(0);
|
|
21128
|
+
const [maxHeight, setMaxHeight] = import_react2.default.useState(ideal);
|
|
21129
|
+
const [fallback, setFallback] = import_react2.default.useState(null);
|
|
21130
|
+
useLayout(() => {
|
|
21131
|
+
if (!open2) return;
|
|
21132
|
+
anchorRef.current = anchorInput(rootRef) ?? rootRef.current ?? null;
|
|
21133
|
+
}, [open2, rootRef]);
|
|
21134
|
+
const officialPosition = useAnchoredPosition2({ open: open2, anchorRef, panelRef, side, align: "start", gap, margin });
|
|
21135
|
+
useLayout(() => {
|
|
21136
|
+
if (!open2) return void 0;
|
|
21137
|
+
const fit = () => {
|
|
21138
|
+
const node2 = anchorRef.current ?? rootRef.current;
|
|
21139
|
+
const inputRect = node2?.getBoundingClientRect();
|
|
21140
|
+
if (inputRect === void 0) return;
|
|
21141
|
+
const windowW = window.innerWidth;
|
|
21142
|
+
const windowH = window.innerHeight;
|
|
21143
|
+
const inputWidth = inputRect.width > 0 ? Math.max(160, Math.min(Math.round(inputRect.width), windowW - 16)) : 0;
|
|
21144
|
+
const spaceAbove = inputRect.top - margin;
|
|
21145
|
+
const spaceBelow = windowH - inputRect.bottom - margin;
|
|
21146
|
+
const up = spaceAbove >= spaceBelow;
|
|
21147
|
+
const cap = Math.max(0, Math.min(ideal, windowH - margin * 2));
|
|
21148
|
+
const roof = up ? inputRect.top - gap - overlayTopMargin(margin) : spaceBelow;
|
|
21149
|
+
setSide(up ? "top" : "bottom");
|
|
21150
|
+
setWidth(inputWidth);
|
|
21151
|
+
setMaxHeight(Math.max(0, Math.min(cap, roof)));
|
|
21152
|
+
if (PAnchoredPosition === null) {
|
|
21153
|
+
const measured = panelRef.current?.offsetWidth ?? 0;
|
|
21154
|
+
const laidOut = measured > 0 ? measured : inputWidth;
|
|
21155
|
+
const maxLeft = laidOut === 0 ? Number.POSITIVE_INFINITY : Math.max(margin, windowW - laidOut - margin);
|
|
21156
|
+
const left = Math.min(Math.max(margin, inputRect.left), maxLeft);
|
|
21157
|
+
setFallback(up ? { left, bottom: Math.max(margin, windowH - inputRect.top + gap) } : { left, top: Math.max(margin, inputRect.bottom + gap) });
|
|
21158
|
+
}
|
|
21159
|
+
};
|
|
21160
|
+
const onScroll = (event) => {
|
|
21161
|
+
const node2 = panelRef.current;
|
|
21162
|
+
if (node2 !== null && node2 !== void 0 && event.target instanceof Node && node2.contains(event.target)) return;
|
|
21163
|
+
fit();
|
|
21164
|
+
};
|
|
21165
|
+
fit();
|
|
21166
|
+
window.addEventListener("resize", fit);
|
|
21167
|
+
window.addEventListener("scroll", onScroll, true);
|
|
21168
|
+
return () => {
|
|
21169
|
+
window.removeEventListener("resize", fit);
|
|
21170
|
+
window.removeEventListener("scroll", onScroll, true);
|
|
21171
|
+
};
|
|
21172
|
+
}, [open2, rootRef, panelRef, gap, margin, ideal]);
|
|
21173
|
+
useDismissOnOutsidePointer2(rootRef, open2, setOpen);
|
|
21174
|
+
import_react2.default.useEffect(() => {
|
|
21175
|
+
if (!open2) return void 0;
|
|
21176
|
+
const onKey = (event) => {
|
|
21177
|
+
if (event.key === "Escape") setOpen(false);
|
|
21178
|
+
};
|
|
21179
|
+
document.addEventListener("keydown", onKey);
|
|
21180
|
+
return () => document.removeEventListener("keydown", onKey);
|
|
21181
|
+
}, [open2, setOpen]);
|
|
21182
|
+
const style = import_react2.default.useMemo(() => {
|
|
21183
|
+
const next = { maxHeight: `${maxHeight}px` };
|
|
21184
|
+
if (width > 0) next["--t-team-pop-w"] = `${width}px`;
|
|
21185
|
+
if (PAnchoredPosition !== null) {
|
|
21186
|
+
if (officialPosition === null) next.visibility = "hidden";
|
|
21187
|
+
else {
|
|
21188
|
+
next.left = officialPosition.left;
|
|
21189
|
+
next.top = officialPosition.top;
|
|
21190
|
+
}
|
|
21191
|
+
} else if (fallback !== null) {
|
|
21192
|
+
next.left = fallback.left;
|
|
21193
|
+
if (fallback.top !== void 0) next.top = fallback.top;
|
|
21194
|
+
else next.bottom = fallback.bottom;
|
|
21195
|
+
} else {
|
|
21196
|
+
next.visibility = "hidden";
|
|
21197
|
+
}
|
|
21198
|
+
return next;
|
|
21199
|
+
}, [officialPosition, fallback, maxHeight, width]);
|
|
21200
|
+
return { style, side, official: PAnchoredPosition !== null };
|
|
21201
|
+
}
|
|
21202
|
+
var PopSurface = import_react2.default.forwardRef(function PopSurface2({ official = false, className = "", style, children, ...rest }, ref) {
|
|
21203
|
+
const cls = official ? `${className} t-team-pop-official` : className;
|
|
21204
|
+
if (PMenuSurface !== null) {
|
|
21205
|
+
return /* @__PURE__ */ import_react2.default.createElement(PMenuSurface, { ref, className: cls, style, ...rest }, children);
|
|
21206
|
+
}
|
|
21207
|
+
return /* @__PURE__ */ import_react2.default.createElement("div", { ref, className, style, ...rest }, children);
|
|
21208
|
+
});
|
|
21209
|
+
function FloatingPop({ open: open2, setOpen, rootRef, className, children, ...rest }) {
|
|
21210
|
+
const panelRef = import_react2.default.useRef(null);
|
|
21211
|
+
const shell = useFloatingShell({ open: open2, setOpen, rootRef, panelRef });
|
|
21212
|
+
if (!open2) return null;
|
|
21213
|
+
return /* @__PURE__ */ import_react2.default.createElement(PopSurface, { ref: panelRef, official: shell.official, className, style: shell.style, ...rest }, children);
|
|
21214
|
+
}
|
|
21215
|
+
var DIVISION_ICONS = {
|
|
21216
|
+
academic: "IconListPenOutlineMedium",
|
|
21217
|
+
company: "IconUsersOutlineMedium",
|
|
21218
|
+
design: "IconSparkleMedium",
|
|
21219
|
+
engineering: "IconCodeOutlineMedium",
|
|
21220
|
+
finance: "IconDataOutlineMedium",
|
|
21221
|
+
"game-development": "IconPlayOutlineMedium",
|
|
21222
|
+
gis: "IconGlobeOutlineMedium",
|
|
21223
|
+
healthcare: "IconCheckCircleOutlineMedium",
|
|
21224
|
+
hr: "IconUserOutlineMedium",
|
|
21225
|
+
legal: "IconArchiveOutlineMedium",
|
|
21226
|
+
marketing: "IconSendOutlineMedium",
|
|
21227
|
+
"paid-media": "IconGaugeOutlineMedium",
|
|
21228
|
+
product: "IconPlanOutlineMedium",
|
|
21229
|
+
"project-management": "IconChecklistOutlineMedium",
|
|
21230
|
+
research: "IconSearchOutlineMedium",
|
|
21231
|
+
sales: "IconRightUpOutlineMedium",
|
|
21232
|
+
security: "IconShieldOutlineMedium",
|
|
21233
|
+
"spatial-computing": "IconFullscreenOutlineMedium",
|
|
21234
|
+
specialized: "IconSlidersTwoOutlineMedium",
|
|
21235
|
+
"supply-chain": "IconQueueOutlineMedium",
|
|
21236
|
+
support: "IconQuestionOutlineMedium",
|
|
21237
|
+
testing: "IconInspectOutlineMedium"
|
|
21238
|
+
};
|
|
21239
|
+
function PopIcon({ name, size = 22 }) {
|
|
21240
|
+
const Icon = primitives[name];
|
|
21241
|
+
if (typeof Icon !== "function") return null;
|
|
21242
|
+
return /* @__PURE__ */ import_react2.default.createElement(Icon, { size });
|
|
21243
|
+
}
|
|
21244
|
+
function divisionIconName(division) {
|
|
21245
|
+
const name = DIVISION_ICONS[division];
|
|
21246
|
+
if (typeof name !== "string" || typeof primitives[name] !== "function") return null;
|
|
21247
|
+
return name;
|
|
21248
|
+
}
|
|
21249
|
+
function tintOf(color) {
|
|
21250
|
+
const value = typeof color === "string" ? color.trim() : "";
|
|
21251
|
+
if (!/^#[0-9a-fA-F]{6}$/u.test(value) && !/^[a-zA-Z]{3,20}$/u.test(value)) return null;
|
|
21252
|
+
return { background: `color-mix(in srgb, ${value} 24%, transparent)`, color: value };
|
|
21253
|
+
}
|
|
20891
21254
|
|
|
20892
21255
|
// src/client/tabs.jsx
|
|
20893
21256
|
function CategoriesTab({ t, remote, categories, onChanged }) {
|
|
@@ -21191,6 +21554,7 @@ function SettingsPanel({ t, ctx, remote, skillRemote, getActive, initialTab, vie
|
|
|
21191
21554
|
const [error62, setError] = import_react5.default.useState("");
|
|
21192
21555
|
const [busy, setBusy] = import_react5.default.useState(false);
|
|
21193
21556
|
const [promptView, setPromptView] = import_react5.default.useState(null);
|
|
21557
|
+
const [copyState, setCopyState] = import_react5.default.useState("");
|
|
21194
21558
|
const [editor, setEditor] = import_react5.default.useState(null);
|
|
21195
21559
|
const [pendingDelete, setPendingDelete] = import_react5.default.useState("");
|
|
21196
21560
|
const [tab, setTab] = import_react5.default.useState(initialTab ?? "experts");
|
|
@@ -21218,6 +21582,7 @@ function SettingsPanel({ t, ctx, remote, skillRemote, getActive, initialTab, vie
|
|
|
21218
21582
|
}, [reload]);
|
|
21219
21583
|
const active = getActive();
|
|
21220
21584
|
async function openPrompt(expert) {
|
|
21585
|
+
setCopyState("");
|
|
21221
21586
|
setPromptView({ name: displayName(expert, getActive()), loading: true, text: "", error: "" });
|
|
21222
21587
|
try {
|
|
21223
21588
|
const data = unwrap(await remote.getPrompt(expert.slug, expert.division), "getPrompt");
|
|
@@ -21239,6 +21604,16 @@ function SettingsPanel({ t, ctx, remote, skillRemote, getActive, initialTab, vie
|
|
|
21239
21604
|
document.addEventListener("keydown", onKey);
|
|
21240
21605
|
return () => document.removeEventListener("keydown", onKey);
|
|
21241
21606
|
}, [promptView]);
|
|
21607
|
+
import_react5.default.useEffect(() => {
|
|
21608
|
+
if (copyState === "") return void 0;
|
|
21609
|
+
const timer = window.setTimeout(() => setCopyState(""), 1600);
|
|
21610
|
+
return () => window.clearTimeout(timer);
|
|
21611
|
+
}, [copyState]);
|
|
21612
|
+
async function copyPrompt() {
|
|
21613
|
+
const text = promptView?.text ?? "";
|
|
21614
|
+
if (text === "") return;
|
|
21615
|
+
setCopyState(await copyText(text) ? "done" : "failed");
|
|
21616
|
+
}
|
|
21242
21617
|
const customDivisionLabel = snapshot?.customDivisionLabel ?? "";
|
|
21243
21618
|
const categories = snapshot?.categories ?? [];
|
|
21244
21619
|
const divisionOptions = (() => {
|
|
@@ -21528,15 +21903,28 @@ function SettingsPanel({ t, ctx, remote, skillRemote, getActive, initialTab, vie
|
|
|
21528
21903
|
Modal2,
|
|
21529
21904
|
{
|
|
21530
21905
|
open: true,
|
|
21906
|
+
className: "t-team-prompt-modal",
|
|
21531
21907
|
title: t("card.promptTitle", { name: promptView.name }),
|
|
21532
21908
|
onClose: () => setPromptView(null),
|
|
21533
21909
|
closeLabel: t("card.close")
|
|
21534
21910
|
},
|
|
21535
|
-
/* @__PURE__ */ import_react5.default.createElement("
|
|
21911
|
+
/* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-prompt-tools" }, /* @__PURE__ */ import_react5.default.createElement(
|
|
21912
|
+
Button2,
|
|
21913
|
+
{
|
|
21914
|
+
size: "sm",
|
|
21915
|
+
variant: "ghost",
|
|
21916
|
+
disabled: promptView.loading || promptView.error !== "" || promptView.text === "",
|
|
21917
|
+
title: t("card.copy"),
|
|
21918
|
+
onClick: () => void copyPrompt()
|
|
21919
|
+
},
|
|
21920
|
+
copyState === "done" ? t("card.copied") : copyState === "failed" ? t("card.copyFailed") : t("card.copy")
|
|
21921
|
+
)),
|
|
21922
|
+
/* @__PURE__ */ import_react5.default.createElement("pre", { className: "t-team-prompt-body" }, promptView.loading ? t("card.promptLoading") : promptView.error !== "" ? t("card.promptFailed", { detail: promptView.error }) : promptView.text === "" ? t("card.promptEmpty") : promptView.text)
|
|
21536
21923
|
), editor !== null && /* @__PURE__ */ import_react5.default.createElement(
|
|
21537
21924
|
Modal2,
|
|
21538
21925
|
{
|
|
21539
21926
|
open: true,
|
|
21927
|
+
className: "t-team-editor-modal",
|
|
21540
21928
|
title: editor.mode === "new" ? t("custom.titleNew") : t("custom.titleEdit", { name: editor.name || editor.slug }),
|
|
21541
21929
|
onClose: () => {
|
|
21542
21930
|
if (!editor.saving) setEditor(null);
|
|
@@ -21660,98 +22048,90 @@ function SummonButton({ t, ctx, remote, getActive, insertReference, insertSkillH
|
|
|
21660
22048
|
const [popNote, setPopNote] = import_react6.default.useState("");
|
|
21661
22049
|
const [query, setQuery] = import_react6.default.useState("");
|
|
21662
22050
|
const [failed, setFailed] = import_react6.default.useState("");
|
|
21663
|
-
const [
|
|
22051
|
+
const [division, setDivision] = import_react6.default.useState("all");
|
|
22052
|
+
const [divMore, setDivMore] = import_react6.default.useState(false);
|
|
22053
|
+
const [divBack, setDivBack] = import_react6.default.useState(false);
|
|
21664
22054
|
const rootRef = import_react6.default.useRef(null);
|
|
21665
|
-
const
|
|
22055
|
+
const divRef = import_react6.default.useRef(null);
|
|
22056
|
+
const listRef = import_react6.default.useRef(null);
|
|
21666
22057
|
const snap = snapshotOf(remote);
|
|
21667
|
-
function anchorInput() {
|
|
21668
|
-
let node2 = rootRef.current?.parentElement ?? null;
|
|
21669
|
-
for (let i = 0; i < 8 && node2 !== null; i += 1) {
|
|
21670
|
-
if (node2.matches?.("[data-composer-card]") === true) return node2;
|
|
21671
|
-
node2 = node2.parentElement;
|
|
21672
|
-
}
|
|
21673
|
-
node2 = rootRef.current?.parentElement ?? null;
|
|
21674
|
-
for (let i = 0; i < 8 && node2 !== null; i += 1) {
|
|
21675
|
-
const found = node2.querySelector?.("textarea, [contenteditable='true']");
|
|
21676
|
-
if (found !== null && found !== void 0) return found;
|
|
21677
|
-
node2 = node2.parentElement;
|
|
21678
|
-
}
|
|
21679
|
-
return void 0;
|
|
21680
|
-
}
|
|
21681
|
-
function place() {
|
|
21682
|
-
const rect = rootRef.current?.getBoundingClientRect();
|
|
21683
|
-
if (rect === void 0) return;
|
|
21684
|
-
const input2 = anchorInput();
|
|
21685
|
-
const inputRect = input2?.getBoundingClientRect();
|
|
21686
|
-
const hasInput = inputRect !== void 0 && inputRect.width > 0;
|
|
21687
|
-
const width = hasInput ? Math.max(160, Math.min(Math.round(inputRect.width), window.innerWidth - 16)) : 0;
|
|
21688
|
-
const measured = popRef.current?.offsetWidth ?? 0;
|
|
21689
|
-
const laidOut = measured > 0 ? measured : width;
|
|
21690
|
-
const maxLeft = laidOut === 0 ? Number.POSITIVE_INFINITY : Math.max(8, window.innerWidth - laidOut - 8);
|
|
21691
|
-
const wantedLeft = hasInput ? inputRect.left : rect.left;
|
|
21692
|
-
const refTop = hasInput ? inputRect.top : rect.top;
|
|
21693
|
-
const refBottom = hasInput ? inputRect.bottom : rect.bottom;
|
|
21694
|
-
const EDGE = 8;
|
|
21695
|
-
const OFFSET = 6;
|
|
21696
|
-
const IDEAL = 600;
|
|
21697
|
-
const cap = Math.max(0, Math.min(IDEAL, window.innerHeight - EDGE * 2));
|
|
21698
|
-
const spaceAbove = refTop - EDGE;
|
|
21699
|
-
const spaceBelow = window.innerHeight - refBottom - EDGE;
|
|
21700
|
-
const up = spaceAbove >= spaceBelow;
|
|
21701
|
-
const maxHeight = Math.max(0, Math.min(cap, up ? spaceAbove : spaceBelow));
|
|
21702
|
-
const pos = {
|
|
21703
|
-
left: Math.min(Math.max(8, wantedLeft), maxLeft),
|
|
21704
|
-
"--t-team-pop-w": width > 0 ? `${width}px` : void 0
|
|
21705
|
-
};
|
|
21706
|
-
if (up) {
|
|
21707
|
-
pos.bottom = Math.max(EDGE, window.innerHeight - refTop + OFFSET);
|
|
21708
|
-
pos.maxHeight = `${maxHeight}px`;
|
|
21709
|
-
} else {
|
|
21710
|
-
pos.top = Math.max(EDGE, refBottom + OFFSET);
|
|
21711
|
-
pos.maxHeight = `${maxHeight}px`;
|
|
21712
|
-
}
|
|
21713
|
-
setPosition(pos);
|
|
21714
|
-
}
|
|
21715
|
-
import_react6.default.useEffect(() => {
|
|
21716
|
-
if (!open2) return void 0;
|
|
21717
|
-
const onDown = (event) => {
|
|
21718
|
-
if (rootRef.current !== null && !rootRef.current.contains(event.target)) setOpen(false);
|
|
21719
|
-
};
|
|
21720
|
-
const onKey = (event) => {
|
|
21721
|
-
if (event.key === "Escape") setOpen(false);
|
|
21722
|
-
};
|
|
21723
|
-
document.addEventListener("mousedown", onDown);
|
|
21724
|
-
document.addEventListener("keydown", onKey);
|
|
21725
|
-
window.addEventListener("resize", place);
|
|
21726
|
-
window.addEventListener("scroll", place, true);
|
|
21727
|
-
place();
|
|
21728
|
-
return () => {
|
|
21729
|
-
document.removeEventListener("mousedown", onDown);
|
|
21730
|
-
document.removeEventListener("keydown", onKey);
|
|
21731
|
-
window.removeEventListener("resize", place);
|
|
21732
|
-
window.removeEventListener("scroll", place, true);
|
|
21733
|
-
};
|
|
21734
|
-
}, [open2]);
|
|
21735
22058
|
async function toggle() {
|
|
21736
22059
|
const next = !open2;
|
|
21737
22060
|
setOpen(next);
|
|
21738
22061
|
setFailed("");
|
|
21739
22062
|
setPopNote("");
|
|
21740
22063
|
if (!next) return;
|
|
21741
|
-
place();
|
|
21742
22064
|
await refresh(remote, true).catch(() => void 0);
|
|
21743
22065
|
}
|
|
21744
22066
|
const active = getActive();
|
|
21745
22067
|
const popTabs = [["experts", "tab.experts"], ["skills", "tab.skills"]];
|
|
21746
|
-
const experts =
|
|
22068
|
+
const experts = import_react6.default.useMemo(
|
|
22069
|
+
() => (snap?.experts ?? []).filter((expert) => expert.conflict !== true && snap.enabledSet.has(expert.slug)),
|
|
22070
|
+
[snap]
|
|
22071
|
+
);
|
|
21747
22072
|
const needle = query.trim().toLowerCase();
|
|
21748
|
-
const
|
|
21749
|
-
|
|
21750
|
-
|
|
21751
|
-
|
|
21752
|
-
|
|
21753
|
-
|
|
21754
|
-
}
|
|
22073
|
+
const divisionLabels = import_react6.default.useMemo(() => {
|
|
22074
|
+
const map2 = /* @__PURE__ */ new Map();
|
|
22075
|
+
for (const expert of experts) {
|
|
22076
|
+
if (!map2.has(expert.division)) map2.set(expert.division, divisionLabel(expert, active));
|
|
22077
|
+
}
|
|
22078
|
+
return map2;
|
|
22079
|
+
}, [experts, active]);
|
|
22080
|
+
const divisionKeys = import_react6.default.useMemo(() => [...divisionLabels.keys()], [divisionLabels]);
|
|
22081
|
+
const visible = import_react6.default.useMemo(
|
|
22082
|
+
() => experts.filter((expert) => (division === "all" || expert.division === division) && matchExpert(expert, active, needle)),
|
|
22083
|
+
[experts, division, active, needle]
|
|
22084
|
+
);
|
|
22085
|
+
const grouped = import_react6.default.useMemo(() => {
|
|
22086
|
+
const out = [];
|
|
22087
|
+
for (const expert of visible) {
|
|
22088
|
+
const last = out[out.length - 1];
|
|
22089
|
+
if (last !== void 0 && last.division === expert.division) last.items.push(expert);
|
|
22090
|
+
else out.push({ division: expert.division, items: [expert] });
|
|
22091
|
+
}
|
|
22092
|
+
return out;
|
|
22093
|
+
}, [visible]);
|
|
22094
|
+
import_react6.default.useEffect(() => {
|
|
22095
|
+
if (!open2 || popTab !== "experts") return void 0;
|
|
22096
|
+
const sync = () => {
|
|
22097
|
+
const node3 = divRef.current;
|
|
22098
|
+
if (node3 === null || node3 === void 0) return;
|
|
22099
|
+
setDivMore(node3.scrollLeft + node3.clientWidth < node3.scrollWidth - 1);
|
|
22100
|
+
setDivBack(node3.scrollLeft > 1);
|
|
22101
|
+
};
|
|
22102
|
+
sync();
|
|
22103
|
+
const node2 = divRef.current;
|
|
22104
|
+
node2?.addEventListener("scroll", sync);
|
|
22105
|
+
window.addEventListener("resize", sync);
|
|
22106
|
+
return () => {
|
|
22107
|
+
node2?.removeEventListener("scroll", sync);
|
|
22108
|
+
window.removeEventListener("resize", sync);
|
|
22109
|
+
};
|
|
22110
|
+
}, [open2, popTab, division, active, snap]);
|
|
22111
|
+
import_react6.default.useEffect(() => {
|
|
22112
|
+
if (!open2 || popTab !== "experts") return void 0;
|
|
22113
|
+
const node2 = divRef.current;
|
|
22114
|
+
if (node2 === null || node2 === void 0) return void 0;
|
|
22115
|
+
const onWheel = (event) => {
|
|
22116
|
+
const bar = divRef.current;
|
|
22117
|
+
if (bar === null || bar === void 0) return;
|
|
22118
|
+
if (bar.scrollWidth <= bar.clientWidth) return;
|
|
22119
|
+
const delta = Math.abs(event.deltaX) > Math.abs(event.deltaY) ? event.deltaX : event.deltaY;
|
|
22120
|
+
if (delta === 0) return;
|
|
22121
|
+
const atStart = bar.scrollLeft <= 0;
|
|
22122
|
+
const atEnd = bar.scrollLeft + bar.clientWidth >= bar.scrollWidth - 1;
|
|
22123
|
+
if (delta > 0 && atEnd || delta < 0 && atStart) return;
|
|
22124
|
+
bar.scrollLeft += delta;
|
|
22125
|
+
event.preventDefault();
|
|
22126
|
+
};
|
|
22127
|
+
node2.addEventListener("wheel", onWheel, { passive: false });
|
|
22128
|
+
return () => node2.removeEventListener("wheel", onWheel);
|
|
22129
|
+
}, [open2, popTab]);
|
|
22130
|
+
import_react6.default.useEffect(() => {
|
|
22131
|
+
const node2 = listRef.current;
|
|
22132
|
+
if (node2 === null || node2 === void 0) return;
|
|
22133
|
+
node2.scrollTop = 0;
|
|
22134
|
+
}, [division, query, skillQuery, popTab]);
|
|
21755
22135
|
function pick2(expert) {
|
|
21756
22136
|
const ok = insertReference?.(referenceOf(expert, active)) === true;
|
|
21757
22137
|
if (ok) {
|
|
@@ -21763,10 +22143,10 @@ function SummonButton({ t, ctx, remote, getActive, insertReference, insertSkillH
|
|
|
21763
22143
|
}
|
|
21764
22144
|
}
|
|
21765
22145
|
const skillNeedle = skillQuery.trim().toLowerCase();
|
|
21766
|
-
const visibleSkills = (skills ?? []).filter((skill) => {
|
|
22146
|
+
const visibleSkills = import_react6.default.useMemo(() => (skills ?? []).filter((skill) => {
|
|
21767
22147
|
if (skillNeedle === "") return true;
|
|
21768
22148
|
return `${skill.name} ${skill.description ?? ""} ${skill.whenToUse ?? ""}`.toLowerCase().includes(skillNeedle);
|
|
21769
|
-
});
|
|
22149
|
+
}), [skills, skillNeedle]);
|
|
21770
22150
|
const tabCounts = {
|
|
21771
22151
|
experts: snap === void 0 ? void 0 : experts.length,
|
|
21772
22152
|
skills: skills === null ? void 0 : skills.length
|
|
@@ -21781,7 +22161,7 @@ function SummonButton({ t, ctx, remote, getActive, insertReference, insertSkillH
|
|
|
21781
22161
|
setFailed(t("button.insertFailed"));
|
|
21782
22162
|
}
|
|
21783
22163
|
}
|
|
21784
|
-
return /* @__PURE__ */ import_react6.default.createElement("span", { ref: rootRef, className: "t-team-btn-wrap" }, /* @__PURE__ */ import_react6.default.createElement("button", { className: "t-team-btn", type: "button", title: t("button.title"), onClick: () => void toggle() }, "\u{1F9E9} ", t("button.label")),
|
|
22164
|
+
return /* @__PURE__ */ import_react6.default.createElement("span", { ref: rootRef, className: "t-team-btn-wrap" }, /* @__PURE__ */ import_react6.default.createElement("button", { className: "t-team-btn", type: "button", title: t("button.title"), onClick: () => void toggle() }, "\u{1F9E9} ", t("button.label")), /* @__PURE__ */ import_react6.default.createElement(FloatingPop, { open: open2, setOpen, rootRef, className: "t-team-pop", "data-tab": popTab }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-pop-head" }, /* @__PURE__ */ import_react6.default.createElement("span", null, t("pop.title")), /* @__PURE__ */ import_react6.default.createElement("button", { className: "t-team-chip", type: "button", onClick: () => setOpen(false) }, t("button.close"))), /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-tabs", role: "tablist" }, popTabs.map(([key, label]) => /* @__PURE__ */ import_react6.default.createElement(
|
|
21785
22165
|
"button",
|
|
21786
22166
|
{
|
|
21787
22167
|
className: "t-team-tab",
|
|
@@ -21806,9 +22186,65 @@ function SummonButton({ t, ctx, remote, getActive, insertReference, insertSkillH
|
|
|
21806
22186
|
value: query,
|
|
21807
22187
|
onChange: (event) => setQuery(event.target.value)
|
|
21808
22188
|
}
|
|
21809
|
-
), /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-
|
|
22189
|
+
), /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-divbar", "data-more": divMore, "data-back": divBack }, divBack && /* @__PURE__ */ import_react6.default.createElement(
|
|
22190
|
+
"button",
|
|
22191
|
+
{
|
|
22192
|
+
className: "t-team-div-scroll",
|
|
22193
|
+
type: "button",
|
|
22194
|
+
"data-dir": "prev",
|
|
22195
|
+
title: t("pop.divisionsPrev"),
|
|
22196
|
+
"aria-label": t("pop.divisionsPrev"),
|
|
22197
|
+
onClick: () => {
|
|
22198
|
+
const node2 = divRef.current;
|
|
22199
|
+
node2?.scrollBy?.({ left: -Math.round((node2.clientWidth || 0) * 0.8), behavior: "smooth" });
|
|
22200
|
+
}
|
|
22201
|
+
},
|
|
22202
|
+
"\u2039"
|
|
22203
|
+
), /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-pop-divs", ref: divRef, role: "group", "aria-label": t("pop.divisions") }, /* @__PURE__ */ import_react6.default.createElement(
|
|
22204
|
+
"button",
|
|
22205
|
+
{
|
|
22206
|
+
className: "t-team-div-chip",
|
|
22207
|
+
type: "button",
|
|
22208
|
+
"aria-pressed": division === "all",
|
|
22209
|
+
"data-active": division === "all",
|
|
22210
|
+
onClick: () => {
|
|
22211
|
+
setDivision("all");
|
|
22212
|
+
setFailed("");
|
|
22213
|
+
}
|
|
22214
|
+
},
|
|
22215
|
+
t("pop.all")
|
|
22216
|
+
), divisionKeys.map((key) => /* @__PURE__ */ import_react6.default.createElement(
|
|
22217
|
+
"button",
|
|
22218
|
+
{
|
|
22219
|
+
className: "t-team-div-chip",
|
|
22220
|
+
type: "button",
|
|
22221
|
+
key,
|
|
22222
|
+
"aria-pressed": division === key,
|
|
22223
|
+
"data-active": division === key,
|
|
22224
|
+
onClick: () => {
|
|
22225
|
+
setDivision(key);
|
|
22226
|
+
setFailed("");
|
|
22227
|
+
}
|
|
22228
|
+
},
|
|
22229
|
+
divisionLabels.get(key)
|
|
22230
|
+
))), divMore && /* @__PURE__ */ import_react6.default.createElement(
|
|
22231
|
+
"button",
|
|
22232
|
+
{
|
|
22233
|
+
className: "t-team-div-scroll",
|
|
22234
|
+
type: "button",
|
|
22235
|
+
"data-dir": "next",
|
|
22236
|
+
title: t("pop.divisionsMore"),
|
|
22237
|
+
"aria-label": t("pop.divisionsMore"),
|
|
22238
|
+
onClick: () => {
|
|
22239
|
+
const node2 = divRef.current;
|
|
22240
|
+
node2?.scrollBy?.({ left: Math.round((node2.clientWidth || 0) * 0.8), behavior: "smooth" });
|
|
22241
|
+
}
|
|
22242
|
+
},
|
|
22243
|
+
"\u203A"
|
|
22244
|
+
)), /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-pop-list", ref: listRef }, grouped.map((group) => /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, { key: group.division }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-division" }, divisionLabel(group.items[0], active)), group.items.map((expert) => {
|
|
21810
22245
|
const alt = active === "en" ? expert.name : expert.nameEn;
|
|
21811
|
-
|
|
22246
|
+
const iconName = divisionIconName(expert.division);
|
|
22247
|
+
return /* @__PURE__ */ import_react6.default.createElement("button", { className: "t-team-pop-item", type: "button", key: expert.slug, onClick: () => pick2(expert) }, /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-head" }, /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-avatar", style: tintOf(expert.color) ?? void 0 }, expert.emoji || (iconName === null ? "\u{1F9E9}" : /* @__PURE__ */ import_react6.default.createElement(PopIcon, { name: iconName }))), /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-title" }, /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-name" }, displayName(expert, active)), alt !== void 0 && alt !== "" && /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-sub" }, alt))), /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-desc" }, displayDescription(expert, active)), /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-tags" }, /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-tag" }, divisionLabel(expert, active)), expert.custom === true && /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-tag" }, t("custom.badge"))));
|
|
21812
22248
|
}))), experts.length === 0 && /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-pop-empty" }, t("button.empty")), experts.length > 0 && visible.length === 0 && /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-pop-empty" }, t("button.noMatch")))), popTab === "skills" && /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, /* @__PURE__ */ import_react6.default.createElement(
|
|
21813
22249
|
"input",
|
|
21814
22250
|
{
|
|
@@ -21818,7 +22254,7 @@ function SummonButton({ t, ctx, remote, getActive, insertReference, insertSkillH
|
|
|
21818
22254
|
value: skillQuery,
|
|
21819
22255
|
onChange: (event) => setSkillQuery(event.target.value)
|
|
21820
22256
|
}
|
|
21821
|
-
), /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-pop-list" }, visibleSkills.map((skill) => /* @__PURE__ */ import_react6.default.createElement("button", { className: "t-team-pop-item", type: "button", key: skill.name, onClick: () => pickSkill(skill) }, /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-head" }, /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-avatar" }, "\u{1F9F0}"), /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-title" }, /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-name" }, skill.name), skill.
|
|
22257
|
+
), /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-pop-list" }, visibleSkills.map((skill) => /* @__PURE__ */ import_react6.default.createElement("button", { className: "t-team-pop-item", type: "button", key: skill.name, onClick: () => pickSkill(skill) }, /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-head" }, /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-avatar t-team-pop-avatar-skill" }, "\u{1F9F0}"), /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-title" }, /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-name" }, skill.name))), /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-desc" }, skill.description ?? ""), /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-tags" }, /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-tag" }, t("tab.skills")), skill.modelInvocable === false && /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-tag" }, t("pop.skillUserOnly"))))), visibleSkills.length === 0 && /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-pop-empty" }, skills === null ? t("pop.skillEmpty") : t("pop.skillNoMatch")), skillsDiag !== "" && /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-error", style: { fontSize: "11px", whiteSpace: "pre-wrap" } }, "\u8BCA\u65AD\uFF1A", skillsDiag)))));
|
|
21822
22258
|
}
|
|
21823
22259
|
|
|
21824
22260
|
// src/client/index.jsx
|