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.
Files changed (3) hide show
  1. package/CHANGELOG.md +494 -0
  2. package/lib/client.js +543 -107
  3. 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.9";
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
- const haystack = `${expert.name} ${expert.nameEn} ${expert.description} ${expert.descriptionEn} ${expert.slug}`.toLowerCase();
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 114px + \u884C\u95F4\u8DDD 10px = 124px\uFF0C\u518D\u7559\u70B9\u4F59\u91CF\uFF0C\u6B63\u597D\u591A\u5BB9\u4E00\u6574\u884C\u5361\u7247\uFF09\u3002
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\uFF1B\u65E7\u5BBF\u4E3B\u4E0A\u8BE5\u53D8\u91CF
350
- \u4ECD\u662F\u4E0D\u900F\u660E\u8272\uFF0C\u5E26\u4E86 filter \u4E5F\u6CA1\u6709\u526F\u4F5C\u7528\uFF08\u80CC\u540E\u5185\u5BB9\u672C\u6765\u5C31\u770B\u4E0D\u89C1\uFF09\u3002
351
- fallback \u7528\u56FA\u5B9A\u7684 blur \u503C\uFF0C\u53EA\u662F\u4E3A\u4E86\u5728\u62FF\u4E0D\u5230\u5BBF\u4E3B\u53D8\u91CF\u7684\u5BBF\u4E3B\u4E0A\u4E5F\u4E0D\u81F3\u4E8E\u5B8C\u5168\u6CA1\u6750\u8D28\u3002 */
352
- .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-specific-menu, var(--dsw-alias-bg-layer-3));backdrop-filter:var(--dsw-menu-backdrop-filter,blur(20px) saturate(1.4));box-shadow:0 0 1px 0 #0003, 0 0 4px 0 #00000005;color:var(--dsw-alias-label-primary)}
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
- .t-team-pop > *{margin-right:10px}
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:114px;box-sizing:border-box;overflow:hidden;text-align:left;padding:14px;border-radius:12px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:inherit;font:inherit;cursor:pointer}
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 40px\uFF1A\u5361\u7247\u7B49\u9AD8\u7684\u524D\u63D0\u3002\u6280\u80FD\u5361\u91CC\u6807\u9898\u53EA\u6709\u4E00\u884C\uFF0C\u6491\u5230 40px \u7684\u662F\u5934\u50CF\uFF1B
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
- .t-team-pop-item .t-team-pop-head{height:40px}
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
- .t-team-pop-avatar{flex:none;display:grid;place-items:center;width:40px;height:40px;border-radius:50%;background:var(--dsw-alias-bg-layer-3);font-size:19px;line-height:1}
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-name{font-size:14px;font-weight:600;color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
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
- return /* @__PURE__ */ import_react2.default.createElement(PModal, { open: open2, title, onClose, closeLabel, description, footer }, children);
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("pre", { className: "t-team-modal-body" }, promptView.loading ? t("card.promptLoading") : promptView.error !== "" ? t("card.promptFailed", { detail: promptView.error }) : promptView.text === "" ? t("card.promptEmpty") : promptView.text)
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 [position, setPosition] = import_react6.default.useState(void 0);
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 popRef = import_react6.default.useRef(null);
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 = (snap?.experts ?? []).filter((expert) => expert.conflict !== true && snap.enabledSet.has(expert.slug));
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 visible = experts.filter((expert) => matchExpert(expert, active, needle));
21749
- const grouped = [];
21750
- for (const expert of visible) {
21751
- const last = grouped[grouped.length - 1];
21752
- if (last !== void 0 && last.division === expert.division) last.items.push(expert);
21753
- else grouped.push({ division: expert.division, items: [expert] });
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")), open2 && /* @__PURE__ */ import_react6.default.createElement("div", { className: "t-team-pop", "data-tab": popTab, ref: popRef, style: position }, /* @__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(
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-pop-list" }, 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) => {
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
- 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" }, expert.emoji || "\u{1F9E9}"), /* @__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)));
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.modelInvocable === false && /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-sub" }, t("pop.skillUserOnly")))), /* @__PURE__ */ import_react6.default.createElement("span", { className: "t-team-pop-desc" }, skill.description ?? ""))), 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)))));
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