@v587d/capital-generation 2.8.3 → 2.9.1

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 (169) hide show
  1. package/CHANGELOG.md +81 -1
  2. package/README.md +40 -19
  3. package/chart-ui/README.md +5 -4
  4. package/chart-ui/client.src.cjs +7 -16
  5. package/chart-ui/index.js +12 -33
  6. package/chart-ui/package.json +2 -2
  7. package/config/client.js +18 -39
  8. package/config/client.src.cjs +79 -217
  9. package/config/index.js +22 -72
  10. package/config/package.json +2 -2
  11. package/cordis.patch.yml +46 -51
  12. package/lib/agents/bash-guard.d.ts +9 -55
  13. package/lib/agents/bash-guard.js +27 -67
  14. package/lib/agents/preset-roster.d.ts +22 -0
  15. package/lib/agents/preset-roster.js +87 -0
  16. package/lib/agents/role-tool-policy.d.ts +46 -0
  17. package/lib/agents/role-tool-policy.js +205 -0
  18. package/lib/agents/root-tool-policy.d.ts +28 -124
  19. package/lib/agents/root-tool-policy.js +164 -237
  20. package/lib/agents/selected-skills-provider.d.ts +2 -6
  21. package/lib/agents/selected-skills-provider.js +27 -84
  22. package/lib/capital-settings.d.ts +27 -0
  23. package/lib/capital-settings.js +23 -0
  24. package/lib/chart/artifact-ref.d.ts +13 -8
  25. package/lib/chart/artifact-ref.js +27 -10
  26. package/lib/chart/downsample.d.ts +2 -5
  27. package/lib/chart/downsample.js +3 -8
  28. package/lib/chart/errors.d.ts +3 -7
  29. package/lib/chart/errors.js +1 -2
  30. package/lib/chart/event-context.d.ts +8 -0
  31. package/lib/chart/event-context.js +39 -0
  32. package/lib/chart/events.d.ts +21 -78
  33. package/lib/chart/events.js +43 -189
  34. package/lib/chart/html.d.ts +2 -5
  35. package/lib/chart/html.js +8 -15
  36. package/lib/chart/present-tool.d.ts +28 -0
  37. package/lib/chart/present-tool.js +128 -0
  38. package/lib/chart/runtime.d.ts +5 -18
  39. package/lib/chart/runtime.js +14 -34
  40. package/lib/chart/series.d.ts +10 -17
  41. package/lib/chart/series.js +22 -47
  42. package/lib/chart/source-token.d.ts +5 -13
  43. package/lib/chart/source-token.js +18 -17
  44. package/lib/chart/spec.d.ts +6 -12
  45. package/lib/chart/spec.js +7 -31
  46. package/lib/chart/tool.d.ts +7 -29
  47. package/lib/chart/tool.js +15 -25
  48. package/lib/chart-render-entry.d.ts +10 -0
  49. package/lib/chart-render-entry.js +14 -0
  50. package/lib/chart-source-entry.d.ts +13 -0
  51. package/lib/chart-source-entry.js +20 -0
  52. package/lib/collect-entry.d.ts +9 -0
  53. package/lib/collect-entry.js +10 -0
  54. package/lib/collector-runtime.d.ts +22 -0
  55. package/lib/collector-runtime.js +97 -0
  56. package/lib/data-collector/args.d.ts +6 -24
  57. package/lib/data-collector/args.js +6 -24
  58. package/lib/data-collector/dataset-tools.d.ts +7 -1
  59. package/lib/data-collector/dataset-tools.js +27 -56
  60. package/lib/data-collector/describe.d.ts +8 -33
  61. package/lib/data-collector/describe.js +17 -70
  62. package/lib/data-collector/hub.d.ts +27 -85
  63. package/lib/data-collector/hub.js +19 -85
  64. package/lib/data-collector/query-time.d.ts +7 -26
  65. package/lib/data-collector/query-time.js +8 -27
  66. package/lib/data-collector/store.d.ts +41 -117
  67. package/lib/data-collector/store.js +32 -111
  68. package/lib/data-collector/time-axis.d.ts +16 -76
  69. package/lib/data-collector/time-axis.js +25 -111
  70. package/lib/data-collector/tools.d.ts +6 -6
  71. package/lib/data-collector/tools.js +34 -43
  72. package/lib/dataset-read-entry.d.ts +9 -0
  73. package/lib/dataset-read-entry.js +7 -0
  74. package/lib/index.d.ts +7 -117
  75. package/lib/index.js +43 -422
  76. package/lib/net/eastmoney-client.d.ts +13 -65
  77. package/lib/net/eastmoney-client.js +12 -53
  78. package/lib/net/throttle.d.ts +2 -13
  79. package/lib/net/throttle.js +3 -14
  80. package/lib/ocr/client.d.ts +12 -21
  81. package/lib/ocr/client.js +23 -40
  82. package/lib/ocr/markdown.d.ts +20 -26
  83. package/lib/ocr/markdown.js +23 -36
  84. package/lib/ocr/store.d.ts +14 -47
  85. package/lib/ocr/store.js +15 -45
  86. package/lib/ocr-entry.d.ts +9 -0
  87. package/lib/ocr-entry.js +10 -0
  88. package/lib/policy-entry.d.ts +17 -0
  89. package/lib/policy-entry.js +22 -0
  90. package/lib/present-entry.d.ts +9 -0
  91. package/lib/present-entry.js +13 -0
  92. package/lib/preset-claim.d.ts +22 -0
  93. package/lib/preset-claim.js +24 -0
  94. package/lib/preset-ids.d.ts +38 -0
  95. package/lib/preset-ids.js +46 -0
  96. package/lib/retriever-config.d.ts +37 -0
  97. package/lib/retriever-config.js +36 -0
  98. package/lib/retriever-runtime.d.ts +31 -0
  99. package/lib/retriever-runtime.js +82 -0
  100. package/lib/root-extras-entry.d.ts +17 -0
  101. package/lib/root-extras-entry.js +25 -0
  102. package/lib/runtime-entry.d.ts +15 -0
  103. package/lib/runtime-entry.js +5 -0
  104. package/lib/runtime.d.ts +21 -0
  105. package/lib/runtime.js +33 -0
  106. package/lib/search-entry.d.ts +9 -0
  107. package/lib/search-entry.js +9 -0
  108. package/lib/sources/eastmoney-http.js +20 -68
  109. package/lib/sources/ftshare-rest.d.ts +6 -34
  110. package/lib/sources/ftshare-rest.js +84 -292
  111. package/lib/sources/fuyao-core.d.ts +8 -18
  112. package/lib/sources/fuyao-core.js +10 -21
  113. package/lib/sources/fuyao-rest.d.ts +2 -6
  114. package/lib/sources/fuyao-rest.js +23 -102
  115. package/lib/sources/security-code.d.ts +6 -12
  116. package/lib/sources/security-code.js +6 -12
  117. package/lib/sources/security-identity.d.ts +1 -4
  118. package/lib/sources/security-identity.js +3 -8
  119. package/lib/sources/tencent-http.js +14 -28
  120. package/lib/sources/tencent-public-core.d.ts +8 -60
  121. package/lib/sources/tencent-public-core.js +12 -77
  122. package/lib/sources/wind-mcp.d.ts +0 -5
  123. package/lib/sources/wind-mcp.js +23 -78
  124. package/lib/sources-entry.d.ts +9 -0
  125. package/lib/sources-entry.js +9 -0
  126. package/lib/time/tools.d.ts +8 -31
  127. package/lib/time/tools.js +30 -66
  128. package/lib/time-entry.d.ts +9 -0
  129. package/lib/time-entry.js +7 -0
  130. package/lib/tool-exec.d.ts +45 -11
  131. package/lib/tool-exec.js +59 -6
  132. package/lib/user-customization.d.ts +14 -0
  133. package/lib/user-customization.js +47 -0
  134. package/lib/watchlist/tools.d.ts +3 -13
  135. package/lib/watchlist/tools.js +10 -30
  136. package/lib/watchlist-entry.d.ts +9 -0
  137. package/lib/watchlist-entry.js +6 -0
  138. package/lib/web-retriever/engines.d.ts +6 -11
  139. package/lib/web-retriever/engines.js +9 -14
  140. package/lib/web-retriever/html-markdown.d.ts +14 -34
  141. package/lib/web-retriever/html-markdown.js +39 -75
  142. package/lib/web-retriever/local-fetch.d.ts +22 -58
  143. package/lib/web-retriever/local-fetch.js +33 -77
  144. package/lib/web-retriever/retriever.d.ts +6 -18
  145. package/lib/web-retriever/retriever.js +7 -7
  146. package/lib/web-retriever/sources.d.ts +37 -124
  147. package/lib/web-retriever/sources.js +64 -196
  148. package/lib/web-retriever/tools.d.ts +43 -27
  149. package/lib/web-retriever/tools.js +99 -137
  150. package/lib/web-retriever/wind-client.d.ts +14 -31
  151. package/lib/web-retriever/wind-client.js +16 -32
  152. package/locale/zh.json +1 -1
  153. package/package.json +72 -7
  154. package/preset/capital-generation/README.md +87 -53
  155. package/preset/capital-generation/agent.patch.yml +532 -337
  156. package/preset/capital-generation/skills/capital-chart-protocol/SKILL.md +6 -4
  157. package/preset/capital-generation/skills/capital-data-profile/SKILL.md +2 -2
  158. package/preset/capital-generation/skills/capital-data-protocol/SKILL.md +1 -1
  159. package/preset/capital-generation/skills/capital-equity-research/SKILL.md +4 -2
  160. package/preset/capital-generation/skills/capital-event-impact/SKILL.md +1 -1
  161. package/preset/capital-generation/skills/capital-orchestration/SKILL.md +30 -33
  162. package/preset/capital-generation/skills/capital-portfolio-review/SKILL.md +1 -1
  163. package/preset/capital-generation/skills/capital-visualization-protocol/SKILL.md +14 -16
  164. package/preset/capital-generation/skills/capital-web-evidence/SKILL.md +1 -1
  165. package/watchlist/client.js +15 -148
  166. package/watchlist/client.src.cjs +148 -662
  167. package/watchlist/holding-rules.js +11 -38
  168. package/watchlist/index.js +127 -397
  169. package/watchlist/package.json +2 -2
@@ -5,262 +5,129 @@ window.__ModuleLoader__.load({
5
5
  var module = { exports: {} }
6
6
  var exports = module.exports
7
7
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
8
- "use strict";var S=Object.defineProperty;var st=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var ot=Object.prototype.hasOwnProperty;var ct=(e,a,t)=>()=>{if(t)throw t[0];try{return e&&(a=e(e=0)),a}catch(s){throw t=[s],s}};var dt=(e,a)=>{for(var t in a)S(e,t,{get:a[t],enumerable:!0})},pt=(e,a,t,s)=>{if(a&&typeof a=="object"||typeof a=="function")for(let i of nt(a))!ot.call(e,i)&&i!==t&&S(e,i,{get:()=>a[i],enumerable:!(s=st(a,i))||s.enumerable});return e};var ht=e=>pt(S({},"__esModule",{value:!0}),e);var H={};dt(H,{ASSET_TYPES:()=>ut,HOLDABLE_ASSET_TYPES:()=>P,MAX_ROW_WEIGHT_PCT:()=>wt,MAX_TOTAL_WEIGHT_PCT:()=>ft,holdingWeight:()=>I,isHoldable:()=>mt,otherHeldWeightPct:()=>R,weightCeiling:()=>gt});var ut,P,mt,wt,ft,I,R,gt,z=ct(()=>{"use strict";ut=["a-share","a-share-index","fund-etf","hk-stock","hk-index","us-stock","us-index"],P=["a-share","fund-etf","hk-stock","us-stock"],mt=e=>P.includes(e?.asset_type),wt=100,ft=120,I=e=>e?.holding===null||e?.holding===void 0?0:e?.holding?.weight_pct??0,R=(e,a)=>e.reduce((t,s)=>s?.thscode===a?t:t+I(s),0),gt=(e,a)=>Math.max(0,Math.min(100,120-R(e,a)))});var{createElement:l,useEffect:bt,useState:M}=require("react"),{createSnapshotStore:xt}=require("@deepseek-ai/dsh-client-store"),{IconChecklistOutlineRegular:vt,IconCloseOutlineRegular:O,IconDatabaseOutlineRegular:yt,IconEllipsisOutlineRegular:kt,IconGoalOutlineRegular:Nt,IconListPenOutlineRegular:St,IconPinOutlineRegular:_t,IconRefreshOutlineRegular:Ct,IconSearchOutlineRegular:Et,IconTrashOutlineRegular:Tt,Menu:At,MenuItemButton:$t,Modal:Pt,Switch:It}=require("@deepseek-ai/dsh-client-ui-primitives"),{isHoldable:F,weightCeiling:W}=(z(),ht(H)),f="capital-watchlist",_="capital.watchlist",L="conversation.input.overlay",j="/capital-watchlist",Rt="capital-generation",Ht=300,C=10,D="capital-watchlist-css",zt={"command.label":"\u81EA\u9009\u80A1","command.description":"\u6DFB\u52A0 / \u67E5\u770B / \u5220\u9664\u81EA\u9009\u80A1",title:"\u81EA\u9009\u80A1",close:"\u5173\u95ED",searchPlaceholder:"\u8F93\u5165\u8BC1\u5238\u4EE3\u7801\u6216\u540D\u79F0\uFF0C\u652F\u6301A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1",add:"\u6DFB\u52A0",added:"\u5DF2\u6DFB\u52A0",refreshing:"\u5237\u65B0\u4E2D\u2026",refresh:"\u5237\u65B0\u62A5\u4EF7",loading:"\u6B63\u5728\u8BFB\u53D6\u6E05\u5355\u2026",empty:"\u8FD8\u6CA1\u6709\u81EA\u9009\u80A1\uFF0C\u7528\u4E0A\u9762\u7684\u8F93\u5165\u6846\u6DFB\u52A0\u3002",colName:"\u540D\u79F0",colQuote:"\u6700\u65B0\u4EF7 / \u6DA8\u8DCC\u5E45",colAction:"\u64CD\u4F5C",updated:"\u66F4\u65B0\u65F6\u95F4",notRefreshed:"\u672A\u5237\u65B0",stale:"\u4E0A\u4E00\u6B21\u5FEB\u7167",exchangeTime:"\u4EA4\u6613\u6240\u65F6\u95F4",noChangePct:"\u6682\u65E0\u6DA8\u8DCC\u6570\u636E",typeAShare:"A\u80A1",typeHkStock:"\u6E2F\u80A1",typeUsStock:"\u7F8E\u80A1",typeAIndex:"A\u6307",typeHkIndex:"\u6E2F\u6307",typeUsIndex:"\u7F8E\u6307",kindStock:"\u80A1\u7968",kindIndex:"\u6307\u6570",kindEtf:"ETF",remove:"\u79FB\u9664",more:"\u66F4\u591A",pin:"\u7F6E\u9876",holdingWeightLabel:"\u6301\u4ED3\u6BD4\u4F8B",holdingStepper:"\u6301\u4ED3\u6BD4\u4F8B\uFF08\u6BCF\u6863 10 \u4E2A\u767E\u5206\u70B9\uFF09",holdingStepUp:"\u589E\u52A0\u6301\u4ED3\u6BD4\u4F8B",holdingStepDown:"\u51CF\u5C11\u6301\u4ED3\u6BD4\u4F8B",holdingName:"\u6301\u4ED3",predict:"\u9884\u6D4B",predictTip:"AI\u9884\u6D4B",review:"\u590D\u76D8",reviewTip:"AI\u590D\u76D8",predictPromptPrefix:"\u8BF7\u9884\u6D4B ",predictPromptSuffix:"\uFF1A\u672A\u6765 5 \u4E2A\u4EA4\u6613\u65E5\u7684\u8D70\u52BF\u4E0E\u5173\u952E\u70B9\u4F4D\uFF0C\u8BF4\u660E\u4F9D\u636E\uFF0C\u5E76\u7ED9\u51FA\u5224\u65AD\u7684\u4E0D\u786E\u5B9A\u6027\u3002",reviewPromptPrefix:"\u8BF7\u590D\u76D8 ",reviewPromptSuffix:"\uFF1A\u4ECA\u65E5\u8D70\u52BF\u4E0E\u91CF\u4EF7\u3001\u8FD1 20 \u65E5\u8D8B\u52BF\u3001\u57FA\u7840\u9762\u3001\u6D88\u606F\u9762\uFF0C\u7ED9\u51FA\u7ED3\u8BBA\u548C\u5FC5\u8981\u98CE\u9669\u8BC4\u4F30\u3002",searching:"\u641C\u7D22\u4E2D\u2026",composingHint:"\u8F93\u5165\u5B8C\u6210\u540E\u81EA\u52A8\u641C\u7D22",clearInput:"\u6E05\u7A7A\u8F93\u5165",confirmTitle:"\u786E\u8BA4\u79FB\u9664\uFF1F",confirmDescPrefix:"\u786E\u5B9A\u5C06 ",confirmDescSuffix:" \u4ECE\u81EA\u9009\u4E2D\u79FB\u9664\u5417\uFF1F",confirmCancel:"\u53D6\u6D88",confirmOk:"\u786E\u8BA4\u79FB\u9664",truncated:"\u6CA1\u6709\u66F4\u591A\uFF0C\u8BF7\u8F93\u5165\u51C6\u786E\u7684\u8BC1\u5238\u4EE3\u7801\u6216\u540D\u79F0\u3002",filterAll:"\u5168\u90E8",filterLabel:"\u6309\u5E02\u573A\u7B5B\u9009\u5019\u9009",filterNoHit:"\u8FD9\u4E2A\u5E02\u573A\u4E0B\u6CA1\u6709\u5339\u914D\u7684\u6807\u7684\u3002",noHit:"\u6CA1\u6709\u5339\u914D\u7684\u6807\u7684\uFF08A\u80A1 / \u6E2F\u80A1 / \u7F8E\u80A1\uFF0C\u542B\u6307\u6570\u4E0E\u573A\u5185\u57FA\u91D1\uFF09\u3002","error.invalid_query":"\u8F93\u5165\u4E0D\u88AB\u63A5\u53D7","error.not_found":"\u6CA1\u6709\u627E\u5230\u8BE5\u6807\u7684","error.ambiguous":"\u547D\u4E2D\u591A\u6761\uFF0C\u8BF7\u4ECE\u5019\u9009\u91CC\u9009\u4E00\u6761","error.list_full":"\u81EA\u9009\u80A1\u6700\u591A {max} \u6761\uFF0C\u5148\u5220\u4E00\u6761\u518D\u52A0","error.list_full_noMax":"\u81EA\u9009\u80A1\u5DF2\u8FBE\u4E0A\u9650\uFF0C\u5148\u5220\u4E00\u6761\u518D\u52A0","error.credential_missing":"\u672A\u914D\u7F6E Fuyao \u5BC6\u94A5\uFF1A\u5728\u300C\u63D2\u4EF6\u300D\u9875\u7684 Capital \u6A21\u5F0F\u5361\u7247\u91CC\u586B API Key\uFF08\u53EA\u5F71\u54CD A \u80A1\u90A3\u4E00\u8DEF\uFF0C\u6E2F\u7F8E\u80A1\u7167\u5E38\u7528\uFF09","error.rate_limited":"\u884C\u60C5\u670D\u52A1\u9650\u6D41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.fuyao_unavailable":"A \u80A1\u884C\u60C5\u6682\u65F6\u53D6\u4E0D\u5230\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.tencent_unavailable":"\u6E2F\u7F8E\u80A1\u884C\u60C5\u6682\u65F6\u53D6\u4E0D\u5230\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.quote_unavailable":"\u8BE5\u6807\u7684\u6CA1\u6709\u53EF\u7528\u62A5\u4EF7","error.refresh_timeout":"\u5237\u65B0\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.store_unavailable":"\u81EA\u9009\u80A1\u5B58\u50A8\u4E0D\u53EF\u7528","error.unauthorized":"\u767B\u5F55\u72B6\u6001\u5DF2\u5931\u6548\uFF1A\u8BF7\u5148\u56DE\u5230\u5BBF\u4E3B\u7A97\u53E3\u91CD\u65B0\u767B\u5F55",errorSuffix:"\uFF08\u5176\u4ED6\u6807\u7684\u4ECD\u662F\u4E0A\u4E00\u6B21\u6210\u529F\u5FEB\u7167\uFF09","partial.a-share":"A \u80A1\u68C0\u7D22\u4E0D\u53EF\u7528\uFF1A","partial.hk":"\u6E2F\u80A1\u68C0\u7D22\u4E0D\u53EF\u7528\uFF1A","partial.us":"\u7F8E\u80A1\u68C0\u7D22\u4E0D\u53EF\u7528\uFF1A"},Mt={"command.label":"Watchlist","command.description":"Add / view / remove watched symbols",title:"Watchlist",close:"Close",searchPlaceholder:"Symbol code or name \u2014 A-share / HK / US",add:"Add",added:"Added",refreshing:"Refreshing\u2026",refresh:"Refresh quotes",loading:"Loading list\u2026",empty:"No symbols yet \u2014 use the input above to add one.",colName:"Symbol",colQuote:"Last / change",colAction:"Actions",updated:"Updated",notRefreshed:"Not refreshed",stale:"last snapshot",exchangeTime:"exchange time",noChangePct:"No change data yet",typeAShare:"A-Share",typeHkStock:"HK",typeUsStock:"US",typeAIndex:"A-Index",typeHkIndex:"HK-Index",typeUsIndex:"US-Index",kindStock:"stock",kindIndex:"index",kindEtf:"ETF",remove:"Remove",more:"More",pin:"Pin to top",holdingWeightLabel:"Holding weight",holdingStepper:"Holding weight, in steps of 10 percentage points",holdingStepUp:"Increase holding weight",holdingStepDown:"Decrease holding weight",holdingName:"Holding",predict:"Predict",predictTip:"AI prediction",review:"Review",reviewTip:"AI review",predictPromptPrefix:"Predict ",predictPromptSuffix:" over the next 5 sessions: the likely path and key levels, the evidence behind the call, and how uncertain it is.",reviewPromptPrefix:"Review ",reviewPromptSuffix:" with today's trend and volume, the last 20 sessions, fundamental, news, then a conclusion and the necessary risks analysis.",searching:"Searching\u2026",composingHint:"Search runs when you finish typing",clearInput:"Clear input",confirmTitle:"Remove this symbol?",confirmDescPrefix:"Remove ",confirmDescSuffix:" from your watchlist?",confirmCancel:"Cancel",confirmOk:"Remove",truncated:"No more candidates \u2014 enter an accurate code or name.",filterAll:"All",filterLabel:"Filter candidates by market",filterNoHit:"No matching symbol in this market.",noHit:"No matching symbol (A-share / HK / US, including indices and listed funds).","error.invalid_query":"Input not accepted","error.not_found":"Symbol not found","error.ambiguous":"Multiple hits \u2014 pick one candidate","error.list_full":"Watchlist holds at most {max} symbols \u2014 remove one first","error.list_full_noMax":"Watchlist is full \u2014 remove one first","error.credential_missing":"No Fuyao API key: set it on the Capital card in the Plugins page (A-share quotes only \u2014 HK and US keep working)","error.rate_limited":"Quote service is rate limited \u2014 try again later","error.fuyao_unavailable":"A-share quotes unavailable \u2014 try again later","error.tencent_unavailable":"HK / US quotes unavailable \u2014 try again later","error.quote_unavailable":"No quote for this symbol","error.refresh_timeout":"Refresh timed out \u2014 try again later","error.store_unavailable":"Watchlist storage unavailable","error.unauthorized":"Session expired \u2014 sign back in to the host first",errorSuffix:" (other symbols still show their last good snapshot)","partial.a-share":"A-share search unavailable: ","partial.hk":"HK search unavailable: ","partial.us":"US search unavailable: "},Ot={"a-share":"typeAShare","hk-stock":"typeHkStock","us-stock":"typeUsStock","a-share-index":"typeAIndex","hk-index":"typeHkIndex","us-index":"typeUsIndex","fund-etf":"typeAShare"},Ft={"a-share":"kindStock","hk-stock":"kindStock","us-stock":"kindStock","a-share-index":"kindIndex","hk-index":"kindIndex","us-index":"kindIndex","fund-etf":"kindEtf"};function Lt(e,a){let t=Ot[e];return t===void 0?String(e??""):a(t)}function jt(e,a){let t=Ft[e];return t===void 0?String(e??""):a(t)}var Dt=/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F\u00AD\u200B-\u200F\u2028\u2029\u202A-\u202E\u2060-\u2064\u2066-\u2069\uFEFF]/gu;function T(e){return String(e??"").replace(Dt,"")}function v(e){return Array.isArray(e)?e.map(a=>a===null||typeof a!="object"?a:{...a,name:T(a.name)}):e}var Ut={"a-share":"capital-watchlist-tag-cn","a-share-index":"capital-watchlist-tag-cn","fund-etf":"capital-watchlist-tag-cn","hk-stock":"capital-watchlist-tag-hk","hk-index":"capital-watchlist-tag-hk","us-stock":"capital-watchlist-tag-us","us-index":"capital-watchlist-tag-us"},B=[{id:"all"},{id:"cn",label:"CN"},{id:"hk",label:"HK"},{id:"us",label:"US"}],U=e=>e.exchange==="HK"?"hk":e.exchange==="US"?"us":"cn",qt=`
9
- /* \u5BBD 420 / \u5706\u89D2 18 / \u65E0\u5185\u8FB9\u8DDD\uFF08\u5185\u8FB9\u8DDD\u4F4F\u5728\u5404\u6BB5\u81EA\u5DF1\u5934\u4E0A\uFF0C\u597D\u8BA9\u8868\u5934\u4E0E\u5206\u9694\u7EBF\u5BF9\u9F50\uFF09\u3002
10
- \u9650\u9AD8\u6309\u5B98\u65B9\u53E3\u5F84\u8D70 max-height: 100%\uFF08\u5BF9 .root \u7684 padding box\uFF09\uFF0C\u4E0D\u81EA\u5DF1\u7B97 vh\u3002 */
8
+ "use strict";var S=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var ot=Object.prototype.hasOwnProperty;var ct=(e,a,t)=>()=>{if(t)throw t[0];try{return e&&(a=e(e=0)),a}catch(r){throw t=[r],r}};var dt=(e,a)=>{for(var t in a)S(e,t,{get:a[t],enumerable:!0})},pt=(e,a,t,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let i of nt(a))!ot.call(e,i)&&i!==t&&S(e,i,{get:()=>a[i],enumerable:!(r=rt(a,i))||r.enumerable});return e};var ht=e=>pt(S({},"__esModule",{value:!0}),e);var H={};dt(H,{ASSET_TYPES:()=>ut,HOLDABLE_ASSET_TYPES:()=>P,MAX_ROW_WEIGHT_PCT:()=>mt,MAX_TOTAL_WEIGHT_PCT:()=>ft,holdingWeight:()=>R,isHoldable:()=>wt,otherHeldWeightPct:()=>I,weightCeiling:()=>gt});var ut,P,wt,mt,ft,R,I,gt,z=ct(()=>{"use strict";ut=["a-share","a-share-index","fund-etf","hk-stock","hk-index","us-stock","us-index"],P=["a-share","fund-etf","hk-stock","us-stock"],wt=e=>P.includes(e?.asset_type),mt=100,ft=120,R=e=>e?.holding===null||e?.holding===void 0?0:e?.holding?.weight_pct??0,I=(e,a)=>e.reduce((t,r)=>r?.thscode===a?t:t+R(r),0),gt=(e,a)=>Math.max(0,Math.min(100,120-I(e,a)))});var{createElement:l,useEffect:bt,useState:M}=require("react"),{createSnapshotStore:xt}=require("@deepseek-ai/dsh-client-store"),{IconChecklistOutlineRegular:yt,IconCloseOutlineRegular:O,IconDatabaseOutlineRegular:vt,IconEllipsisOutlineRegular:kt,IconGoalOutlineRegular:Nt,IconListPenOutlineRegular:St,IconPinOutlineRegular:_t,IconRefreshOutlineRegular:Ct,IconSearchOutlineRegular:Et,IconTrashOutlineRegular:At,Menu:$t,MenuItemButton:Tt,Modal:Pt,Switch:Rt}=require("@deepseek-ai/dsh-client-ui-primitives"),{isHoldable:F,weightCeiling:Q}=(z(),ht(H)),f="capital-watchlist",_="capital.watchlist",D="conversation.input.overlay",j="/capital-watchlist",It="capital-generation",Ht=300,C=10,L="capital-watchlist-css",zt={"command.label":"\u81EA\u9009\u80A1","command.description":"\u6DFB\u52A0 / \u67E5\u770B / \u5220\u9664\u81EA\u9009\u80A1",title:"\u81EA\u9009\u80A1",close:"\u5173\u95ED",searchPlaceholder:"\u8F93\u5165\u8BC1\u5238\u4EE3\u7801\u6216\u540D\u79F0\uFF0C\u652F\u6301A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1",add:"\u6DFB\u52A0",added:"\u5DF2\u6DFB\u52A0",refreshing:"\u5237\u65B0\u4E2D\u2026",refresh:"\u5237\u65B0\u62A5\u4EF7",loading:"\u6B63\u5728\u8BFB\u53D6\u6E05\u5355\u2026",empty:"\u8FD8\u6CA1\u6709\u81EA\u9009\u80A1\uFF0C\u7528\u4E0A\u9762\u7684\u8F93\u5165\u6846\u6DFB\u52A0\u3002",colName:"\u540D\u79F0",colQuote:"\u6700\u65B0\u4EF7 / \u6DA8\u8DCC\u5E45",colAction:"\u64CD\u4F5C",updated:"\u66F4\u65B0\u65F6\u95F4",notRefreshed:"\u672A\u5237\u65B0",stale:"\u4E0A\u4E00\u6B21\u5FEB\u7167",exchangeTime:"\u4EA4\u6613\u6240\u65F6\u95F4",noChangePct:"\u6682\u65E0\u6DA8\u8DCC\u6570\u636E",typeAShare:"A\u80A1",typeHkStock:"\u6E2F\u80A1",typeUsStock:"\u7F8E\u80A1",typeAIndex:"A\u6307",typeHkIndex:"\u6E2F\u6307",typeUsIndex:"\u7F8E\u6307",kindStock:"\u80A1\u7968",kindIndex:"\u6307\u6570",kindEtf:"ETF",remove:"\u79FB\u9664",more:"\u66F4\u591A",pin:"\u7F6E\u9876",holdingWeightLabel:"\u6301\u4ED3\u6BD4\u4F8B",holdingStepper:"\u6301\u4ED3\u6BD4\u4F8B\uFF08\u6BCF\u6863 10 \u4E2A\u767E\u5206\u70B9\uFF09",holdingStepUp:"\u589E\u52A0\u6301\u4ED3\u6BD4\u4F8B",holdingStepDown:"\u51CF\u5C11\u6301\u4ED3\u6BD4\u4F8B",holdingName:"\u6301\u4ED3",predict:"\u9884\u6D4B",predictTip:"AI\u9884\u6D4B",review:"\u590D\u76D8",reviewTip:"AI\u590D\u76D8",predictPromptPrefix:"\u8BF7\u9884\u6D4B ",predictPromptSuffix:"\uFF1A\u672A\u6765 5 \u4E2A\u4EA4\u6613\u65E5\u7684\u8D70\u52BF\u4E0E\u5173\u952E\u70B9\u4F4D\uFF0C\u8BF4\u660E\u4F9D\u636E\uFF0C\u5E76\u7ED9\u51FA\u5224\u65AD\u7684\u4E0D\u786E\u5B9A\u6027\u3002",reviewPromptPrefix:"\u8BF7\u590D\u76D8 ",reviewPromptSuffix:"\uFF1A\u4ECA\u65E5\u8D70\u52BF\u4E0E\u91CF\u4EF7\u3001\u8FD1 20 \u65E5\u8D8B\u52BF\u3001\u57FA\u7840\u9762\u3001\u6D88\u606F\u9762\uFF0C\u7ED9\u51FA\u7ED3\u8BBA\u548C\u5FC5\u8981\u98CE\u9669\u8BC4\u4F30\u3002",searching:"\u641C\u7D22\u4E2D\u2026",composingHint:"\u8F93\u5165\u5B8C\u6210\u540E\u81EA\u52A8\u641C\u7D22",clearInput:"\u6E05\u7A7A\u8F93\u5165",confirmTitle:"\u786E\u8BA4\u79FB\u9664\uFF1F",confirmDescPrefix:"\u786E\u5B9A\u5C06 ",confirmDescSuffix:" \u4ECE\u81EA\u9009\u4E2D\u79FB\u9664\u5417\uFF1F",confirmCancel:"\u53D6\u6D88",confirmOk:"\u786E\u8BA4\u79FB\u9664",truncated:"\u6CA1\u6709\u66F4\u591A\uFF0C\u8BF7\u8F93\u5165\u51C6\u786E\u7684\u8BC1\u5238\u4EE3\u7801\u6216\u540D\u79F0\u3002",filterAll:"\u5168\u90E8",filterLabel:"\u6309\u5E02\u573A\u7B5B\u9009\u5019\u9009",filterNoHit:"\u8FD9\u4E2A\u5E02\u573A\u4E0B\u6CA1\u6709\u5339\u914D\u7684\u6807\u7684\u3002",noHit:"\u6CA1\u6709\u5339\u914D\u7684\u6807\u7684\uFF08A\u80A1 / \u6E2F\u80A1 / \u7F8E\u80A1\uFF0C\u542B\u6307\u6570\u4E0E\u573A\u5185\u57FA\u91D1\uFF09\u3002","error.invalid_query":"\u8F93\u5165\u4E0D\u88AB\u63A5\u53D7","error.not_found":"\u6CA1\u6709\u627E\u5230\u8BE5\u6807\u7684","error.ambiguous":"\u547D\u4E2D\u591A\u6761\uFF0C\u8BF7\u4ECE\u5019\u9009\u91CC\u9009\u4E00\u6761","error.list_full":"\u81EA\u9009\u80A1\u6700\u591A {max} \u6761\uFF0C\u5148\u5220\u4E00\u6761\u518D\u52A0","error.list_full_noMax":"\u81EA\u9009\u80A1\u5DF2\u8FBE\u4E0A\u9650\uFF0C\u5148\u5220\u4E00\u6761\u518D\u52A0","error.credential_missing":"\u672A\u914D\u7F6E Fuyao \u5BC6\u94A5\uFF1A\u5728\u300C\u63D2\u4EF6\u300D\u9875\u7684 \u81EA\u52A8\u6A21\u5F0F\u5361\u7247\u91CC\u586B API Key\uFF08\u53EA\u5F71\u54CD A \u80A1\u90A3\u4E00\u8DEF\uFF0C\u6E2F\u7F8E\u80A1\u7167\u5E38\u7528\uFF09","error.rate_limited":"\u884C\u60C5\u670D\u52A1\u9650\u6D41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.fuyao_unavailable":"A \u80A1\u884C\u60C5\u6682\u65F6\u53D6\u4E0D\u5230\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.tencent_unavailable":"\u6E2F\u7F8E\u80A1\u884C\u60C5\u6682\u65F6\u53D6\u4E0D\u5230\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.quote_unavailable":"\u8BE5\u6807\u7684\u6CA1\u6709\u53EF\u7528\u62A5\u4EF7","error.refresh_timeout":"\u5237\u65B0\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.store_unavailable":"\u81EA\u9009\u80A1\u5B58\u50A8\u4E0D\u53EF\u7528","error.unauthorized":"\u767B\u5F55\u72B6\u6001\u5DF2\u5931\u6548\uFF1A\u8BF7\u5148\u56DE\u5230\u5BBF\u4E3B\u7A97\u53E3\u91CD\u65B0\u767B\u5F55",errorSuffix:"\uFF08\u5176\u4ED6\u6807\u7684\u4ECD\u662F\u4E0A\u4E00\u6B21\u6210\u529F\u5FEB\u7167\uFF09","partial.a-share":"A \u80A1\u68C0\u7D22\u4E0D\u53EF\u7528\uFF1A","partial.hk":"\u6E2F\u80A1\u68C0\u7D22\u4E0D\u53EF\u7528\uFF1A","partial.us":"\u7F8E\u80A1\u68C0\u7D22\u4E0D\u53EF\u7528\uFF1A"},Mt={"command.label":"Watchlist","command.description":"Add / view / remove watched symbols",title:"Watchlist",close:"Close",searchPlaceholder:"Symbol code or name \u2014 A-share / HK / US",add:"Add",added:"Added",refreshing:"Refreshing\u2026",refresh:"Refresh quotes",loading:"Loading list\u2026",empty:"No symbols yet \u2014 use the input above to add one.",colName:"Symbol",colQuote:"Last / change",colAction:"Actions",updated:"Updated",notRefreshed:"Not refreshed",stale:"last snapshot",exchangeTime:"exchange time",noChangePct:"No change data yet",typeAShare:"A-Share",typeHkStock:"HK",typeUsStock:"US",typeAIndex:"A-Index",typeHkIndex:"HK-Index",typeUsIndex:"US-Index",kindStock:"stock",kindIndex:"index",kindEtf:"ETF",remove:"Remove",more:"More",pin:"Pin to top",holdingWeightLabel:"Holding weight",holdingStepper:"Holding weight, in steps of 10 percentage points",holdingStepUp:"Increase holding weight",holdingStepDown:"Decrease holding weight",holdingName:"Holding",predict:"Predict",predictTip:"AI prediction",review:"Review",reviewTip:"AI review",predictPromptPrefix:"Predict ",predictPromptSuffix:" over the next 5 sessions: the likely path and key levels, the evidence behind the call, and how uncertain it is.",reviewPromptPrefix:"Review ",reviewPromptSuffix:" with today's trend and volume, the last 20 sessions, fundamental, news, then a conclusion and the necessary risks analysis.",searching:"Searching\u2026",composingHint:"Search runs when you finish typing",clearInput:"Clear input",confirmTitle:"Remove this symbol?",confirmDescPrefix:"Remove ",confirmDescSuffix:" from your watchlist?",confirmCancel:"Cancel",confirmOk:"Remove",truncated:"No more candidates \u2014 enter an accurate code or name.",filterAll:"All",filterLabel:"Filter candidates by market",filterNoHit:"No matching symbol in this market.",noHit:"No matching symbol (A-share / HK / US, including indices and listed funds).","error.invalid_query":"Input not accepted","error.not_found":"Symbol not found","error.ambiguous":"Multiple hits \u2014 pick one candidate","error.list_full":"Watchlist holds at most {max} symbols \u2014 remove one first","error.list_full_noMax":"Watchlist is full \u2014 remove one first","error.credential_missing":"No Fuyao API key: set it on the Capital card in the Plugins page (A-share quotes only \u2014 HK and US keep working)","error.rate_limited":"Quote service is rate limited \u2014 try again later","error.fuyao_unavailable":"A-share quotes unavailable \u2014 try again later","error.tencent_unavailable":"HK / US quotes unavailable \u2014 try again later","error.quote_unavailable":"No quote for this symbol","error.refresh_timeout":"Refresh timed out \u2014 try again later","error.store_unavailable":"Watchlist storage unavailable","error.unauthorized":"Session expired \u2014 sign back in to the host first",errorSuffix:" (other symbols still show their last good snapshot)","partial.a-share":"A-share search unavailable: ","partial.hk":"HK search unavailable: ","partial.us":"US search unavailable: "},Ot={"a-share":"typeAShare","hk-stock":"typeHkStock","us-stock":"typeUsStock","a-share-index":"typeAIndex","hk-index":"typeHkIndex","us-index":"typeUsIndex","fund-etf":"typeAShare"},Ft={"a-share":"kindStock","hk-stock":"kindStock","us-stock":"kindStock","a-share-index":"kindIndex","hk-index":"kindIndex","us-index":"kindIndex","fund-etf":"kindEtf"};function Dt(e,a){let t=Ot[e];return t===void 0?String(e??""):a(t)}function jt(e,a){let t=Ft[e];return t===void 0?String(e??""):a(t)}var Lt=/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F\u00AD\u200B-\u200F\u2028\u2029\u202A-\u202E\u2060-\u2064\u2066-\u2069\uFEFF]/gu;function A(e){return String(e??"").replace(Lt,"")}function y(e){return Array.isArray(e)?e.map(a=>a===null||typeof a!="object"?a:{...a,name:A(a.name)}):e}var Ut={"a-share":"capital-watchlist-tag-cn","a-share-index":"capital-watchlist-tag-cn","fund-etf":"capital-watchlist-tag-cn","hk-stock":"capital-watchlist-tag-hk","hk-index":"capital-watchlist-tag-hk","us-stock":"capital-watchlist-tag-us","us-index":"capital-watchlist-tag-us"},K=[{id:"all"},{id:"cn",label:"CN"},{id:"hk",label:"HK"},{id:"us",label:"US"}],U=e=>e.exchange==="HK"?"hk":e.exchange==="US"?"us":"cn",qt=`
11
9
  .capital-watchlist-dialog.capital-watchlist-dialog { width: min(420px, 92vw); max-height: 100%; padding: 0; gap: 0; border-radius: 18px; }
12
- /* \u5E95\u8272\u4E0E\u6295\u5F71\u5F52\u5B98\u65B9 .dialog\uFF1B\u6EDA\u52A8\u6761\u6309\u5B98\u65B9\u5951\u7EA6\u53EA\u5728\u5BB9\u5668\u4E0A\u91CD\u7ED1 l2 \u90A3\u4E00\u5BF9\uFF0C\u4E0D\u81EA\u5DF1\u5199 scrollbar-* \u9009\u62E9\u5668\u3002 */
13
10
  .capital-watchlist-card { position: relative; display: flex; flex-direction: column; min-height: 0; overflow: hidden; border-radius: 18px; --capital-watchlist-up: #d1493f; --capital-watchlist-down: #17a063; --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2); --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2); }
14
11
  .capital-watchlist-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 18px 20px 14px; }
15
12
  .capital-watchlist-title { margin: 0; font-size: 17px; line-height: 24px; font-weight: 600; letter-spacing: .3px; color: var(--dsw-alias-label-primary); }
16
- /* \u5706\u5F62\u7070\u5E95\u952E\uFF1A\u7070\u5E95 bg-module-platform + glyph label-secondary\uFF0C\u4E24\u5957\u4E3B\u9898\u90FD\u62C9\u5F97\u5F00\uFF1B\u6B63\u5706\u987B\u914D corner-shape: round\u3002 */
17
13
  .capital-watchlist-close { flex: none; width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; border: none; border-radius: 50%; corner-shape: round; background: var(--dsw-alias-bg-module-platform); color: var(--dsw-alias-label-secondary); cursor: pointer; }
18
14
  .capital-watchlist-close:hover { background: var(--dsw-alias-interactive-bg-hover-accent); color: var(--dsw-alias-label-primary); }
19
- /* \u641C\u7D22\u6BB5\uFF1Aposition:relative \u662F\u4E0B\u62C9\u7684\u5305\u542B\u5757\uFF08\u4E0B\u62C9 top: calc(100% - 8px) \u8D34\u7740\u8F93\u5165\u6846\u4E0B\u6CBF\uFF09\u3002 */
20
15
  .capital-watchlist-search { position: relative; padding: 0 20px 16px; }
21
16
  .capital-watchlist-field { position: relative; display: flex; align-items: center; height: 42px; padding: 0 14px 0 40px; border: none; border-radius: 12px; background: var(--dsw-alias-bg-module-platform); transition: box-shadow .2s var(--ds-ease-in-out); }
22
- /* \u805A\u7126\u7528 inset \u6295\u5F71\u800C\u4E0D\u662F border\uFF08\u5B98\u65B9 .selector \u8FD9\u7C7B\u63A7\u4EF6\u5C31\u6CA1\u6709 border\uFF0C\u52A0\u4E86\u4F1A\u9876\u51FA 1px \u6296\u52A8\uFF09\uFF1B
23
- \u989C\u8272 brand-primary \u6D45=\u8FD1\u9ED1\u3001\u6DF1=\u8FD1\u767D\uFF0C\u4E0E\u5B98\u65B9 Input \u7684 focus-within \u540C\u4E00\u652F\u7B14\u3002 */
24
17
  .capital-watchlist-field:focus-within { box-shadow: inset 0 0 0 1.5px var(--dsw-alias-brand-primary); }
25
18
  .capital-watchlist-searchicon { position: absolute; left: 14px; display: inline-flex; color: var(--dsw-alias-label-tertiary); pointer-events: none; }
26
19
  .capital-watchlist-input { flex: 1 1 auto; min-width: 0; height: 100%; padding: 0; border: none; outline: none; background: transparent; color: var(--dsw-alias-label-primary); font-family: inherit; font-size: 14px; line-height: 22px; }
27
- /* \u5360\u4F4D\u7B26\u6BD4\u5B98\u65B9 Input \u63D0\u4E00\u6863\u5230 tertiary\uFF1Adimmed / caption \u538B\u5728\u6D45\u5E95\u53EA\u6709 1.26 / 1.97:1\uFF0C
28
- \u800C\u8FD9\u4E00\u884C\u662F\u9762\u677F\u91CC\u552F\u4E00\u544A\u8BC9\u7528\u6237"\u8FD9\u91CC\u80FD\u8F93\u5165\u4EC0\u4E48"\u7684\u5730\u65B9\u3002 */
29
20
  .capital-watchlist-input::placeholder { color: var(--dsw-alias-label-tertiary); }
30
- /* \u6E05\u7A7A\u952E\uFF1A\u4E0E\u5173\u95ED\u952E\u540C\u4E00\u652F\u7B14\uFF0C\u6309 42px \u7684\u6846\u7F29\u4E00\u6863\u3002\u5E95\u9762\u4E0D\u80FD\u7528 bg-module-platform\u2014\u2014\u5B83\u6B63\u5750\u5728
31
- \u540C\u8272\u7684\u8F93\u5165\u6846\u5E95\u4E0A\u4F1A\u7CCA\u6210\u4E00\u7247\uFF0C\u6240\u4EE5\u8D70 interactive-bg-hover\uFF0Chover \u518D\u6DF1\u4E00\u6863\u5230 hover-accent\u3002 */
32
21
  .capital-watchlist-clear { flex: none; width: 18px; height: 18px; display: inline-flex; align-items: center; justify-content: center; border: none; border-radius: 50%; corner-shape: round; background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-secondary); cursor: pointer; }
33
22
  .capital-watchlist-clear:hover { background: var(--dsw-alias-interactive-bg-hover-accent); color: var(--dsw-alias-label-primary); }
34
- /* \u4E0B\u62C9\u5019\u9009\uFF1A\u5B98\u65B9\u534A\u900F\u660E\u83DC\u5355\u6750\u8D28\u3002--dsw-specific-menu \u6D45 58% / \u6DF1 45%\uFF0C**\u5FC5\u987B**\u4E0E
35
- --dsw-menu-backdrop-filter\uFF08blur40 saturate150\uFF09\u6210\u5BF9\u58F0\u660E\u2014\u2014\u53EA\u62FF\u586B\u5145\u4E0D\u62FF\u6A21\u7CCA\uFF0C\u5E95\u4E0B\u7684\u6E05\u5355\u884C\u4F1A
36
- \u76F4\u63A5\u900F\u89C6\u4E0A\u6765\uFF08\u5B98\u65B9\u6EDA\u52A8\u6D6E\u5C42 .media \u9762\u677F\u4E0E MenuSurface .material \u90FD\u662F\u8FD9\u4E00\u5BF9\uFF09\u3002border: 0 +
37
- elevation-prominent \u5206\u79BB\uFF1B\u63CF\u8FB9\u6D45\u8272\u91CD\u7ED1 l1\uFF0C\u6DF1\u8272\u7531\u5BBF\u4E3B [data-menu-material] \u89C4\u5219\u7FFB\u6210 l3\u3002 */
38
- /* \u5019\u9009\u4E0B\u62C9\u662F**\u5361\u7247\u5185**\u7684\u6D6E\u5C42\uFF0C\u800C\u5361\u7247 overflow: hidden\uFF08\u5706\u89D2\u4E0E\u6E05\u5355\u6EDA\u52A8\u90FD\u9760\u5B83\uFF09\uFF1A\u6D6E\u5C42\u4E00\u65E6\u6BD4
39
- \u5361\u7247\u5269\u4F59\u7684\u7A7A\u95F4\u9AD8\uFF0C\u591A\u51FA\u6765\u7684\u90E8\u5206\u5C31\u88AB\u65E0\u58F0\u88C1\u6389\u3002\u6240\u4EE5\u5B83\u7684 max-height \u5FC5\u987B\u4E0E\u4E0B\u9762
40
- capital-watchlist-list-open \u90A3\u683C\u7684 min-height **\u540C\u503C**\uFF08\u4E0B\u62C9\u6B63\u597D\u94FA\u6EE1\u6E05\u5355\u90A3\u4E00\u683C\uFF1A\u591F\u9AD8\uFF0C\u53C8\u538B\u4E0D\u5230
41
- \u9875\u811A\uFF09\u2014\u2014246px \u2192 **320px**\uFF082026-10-08 \u7528\u6237\u70B9\u540D"\u4E00\u5C4F\u53EA\u80FD\u663E\u793A 3 \u4E2A\u6807\u7684"\uFF1A\u884C\u9AD8\u538B\u5230\u7EA6 47px\u3001
42
- \u6D6E\u5C42\u62AC\u5230 320\uFF0C\u4E00\u5C4F 5~6 \u884C\uFF1B\u8FD9\u4E24\u4E2A\u6570\u4E00\u6539\u5FC5\u987B\u4E00\u8D77\u6539\uFF0C\u6D4B\u8BD5\u91CC\u6709\u540C\u503C\u65AD\u8A00\uFF09\u3002
43
- \u8FD9\u4E00\u5C42\u81EA\u5DF1\u4E0D\u6EDA\uFF1A\u91CC\u9762 .capital-watchlist-options \u624D\u662F\u6EDA\u52A8\u533A\u2014\u2014\u7B5B\u9009\u5934\u9489\u5728\u9876\u4E0A\uFF08"\u9501\u5B9A\u8FD9\u4E2A\u5934"\uFF09\uFF0C
44
- "\u6CA1\u6709\u66F4\u591A"\u90A3\u53E5\u4F4F\u5728**\u6EDA\u52A8\u533A\u672B\u5C3E**\uFF08\u6EDA\u5230\u5E95\u624D\u770B\u5F97\u89C1\uFF0C\u4E0D\u51BB\u7ED3\u5728\u5E95\u90E8\uFF09\uFF0C\u5176\u4F59 hint \u8D34\u5728\u9009\u9879\u4E4B\u540E\u3002
45
- \u5019\u9009\u6C60\u662F 50+10+10=70 \u884C\uFF08\u4E09\u8DEF\u4E0A\u6E38\u786C\u9876\u4E4B\u548C\uFF0C\u670D\u52A1\u7AEF\u4E0D\u5207\u7247\uFF09\u3002 */
23
+ /* max-height must equal the .capital-watchlist-list-open min-height (test pins both). */
46
24
  .capital-watchlist-dropdown { position: absolute; top: calc(100% - 8px); left: 20px; right: 20px; z-index: 20; display: flex; flex-direction: column; max-height: 320px; overflow: hidden; background: var(--dsw-specific-menu); backdrop-filter: var(--dsw-menu-backdrop-filter); border: 0; border-radius: 12px; --dsw-elevation-stroke-color: var(--dsw-alias-border-l1); box-shadow: var(--dsw-elevation-prominent); animation: capital-watchlist-drop .18s var(--ds-ease-in-out); }
47
- /* \u7B5B\u9009\u5934\u4E0E\u90A3\u51E0\u53E5"\u6B64\u523B\u600E\u4E48\u4E86"\u7684 hint \u90FD\u662F flex: none\uFF0C\u53EA\u6709\u9009\u9879\u5C42 flex: 0 1 auto \u53EF\u6536\u7F29\u3001\u53EF\u6EDA\uFF1A
48
- \u5934\u6C38\u8FDC\u5728\u9876\uFF0Chint \u5728\u9009\u9879\u4E4B\u540E\uFF08\u5185\u5BB9\u77ED\u65F6\u7D27\u8D34\u6700\u540E\u4E00\u884C\uFF0C\u5185\u5BB9\u957F\u65F6\u4E5F\u4E0D\u4F1A\u88AB\u6324\u6CA1\uFF09\u3002 */
49
25
  .capital-watchlist-filter { flex: none; display: flex; align-items: center; gap: 6px; padding: 6px 10px; border-bottom: .5px solid var(--dsw-alias-border-l2); }
50
26
  .capital-watchlist-options { flex: 0 1 auto; min-height: 0; overflow-y: auto; }
51
27
  .capital-watchlist-filterbtn { display: inline-flex; align-items: center; gap: 4px; padding: 3px 9px; border: none; border-radius: 999px; corner-shape: round; background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-secondary); font-family: inherit; font-size: 12px; line-height: 16px; cursor: pointer; }
52
28
  .capital-watchlist-filterbtn:hover { background: var(--dsw-alias-interactive-bg-hover-accent); color: var(--dsw-alias-label-primary); }
53
- /* \u9009\u4E2D\u6001\u8BFB aria-pressed\uFF1A\u72B6\u6001\u4F4F\u5728\u5C5E\u6027\u91CC\uFF0C\u6837\u5F0F\u53EA\u662F\u5B83\u7684\u6295\u5F71\uFF08\u8BFB\u5C4F\u4E5F\u542C\u5F97\u89C1"\u5DF2\u9009\u4E2D"\uFF09\u3002
54
- \u538B\u5728\u534A\u900F\u660E\u83DC\u5355\u6750\u8D28\u4E0A\u7528 color-mix \u7684\u900F\u660E\u6DE1\u67D3\u2014\u2014\u5B83\u4E0D\u5199\u80CC\u666F\u5B9E\u5E95\uFF0C\u5E95\u4E0B\u7684\u83DC\u5355\u6A21\u7CCA\u7167\u5E38\u900F\u4E0A\u6765\u3002 */
55
29
  .capital-watchlist-filterbtn[aria-pressed="true"] { background: color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent); color: var(--dsw-alias-label-primary); }
56
30
  .capital-watchlist-filtercount { font-size: 11px; color: var(--dsw-alias-label-tertiary); font-variant-numeric: tabular-nums; }
57
31
  @keyframes capital-watchlist-drop { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }
58
32
  @keyframes capital-watchlist-breathe { 0% { opacity: 1; } 40% { opacity: .6; } 80%, 100% { opacity: 1; } }
59
33
  @media (prefers-reduced-motion: reduce) { .capital-watchlist-dropdown { animation: none; } .capital-watchlist-skeleton { animation: none; } }
60
- /* \u5019\u9009\u884C\u9AD8\u5EA6\uFF082026-10-08 \u7528\u6237\u70B9\u540D"\u51CF\u5C11\u6BCF\u4E2A\u6807\u7684\u5C55\u793A\u9AD8\u5EA6"\uFF09\uFF1Apadding 6 + \u540D\u79F0 18 + \u95F4\u9699 1 + \u4EE3\u7801\u884C 15
61
- \u2248 47px\u3002\u4E0E\u4E0A\u9762\u90A3\u6761"\u6D6E\u5C42 320px"\u4E00\u8D77\u7B97\uFF1A(320 \u2212 \u7B5B\u9009\u5934\u7EA6 32) \xF7 47 \u2248 6 \u884C\u4E00\u5C4F\uFF08\u6539\u524D\u662F 3 \u884C\uFF09\u3002
62
- \u4E24\u4E2A\u6570\u662F\u4E00\u5BF9\u2014\u2014\u53EA\u62AC\u6D6E\u5C42\u4E0D\u538B\u884C\u9AD8\uFF0C\u591A\u51FA\u6765\u7684\u7A7A\u95F4\u4F1A\u88AB\u884C\u9AD8\u5403\u6389\uFF1B\u53EA\u538B\u884C\u9AD8\u4E0D\u62AC\u6D6E\u5C42\uFF0C\u4E00\u5C4F\u8FD8\u662F 3 \u884C\u3002 */
63
34
  .capital-watchlist-option { display: flex; width: 100%; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 12px; border: none; border-bottom: .5px solid var(--dsw-alias-border-l2); background: transparent; color: inherit; font-family: inherit; text-align: left; cursor: pointer; }
64
35
  .capital-watchlist-option:last-of-type { border-bottom: none; }
65
- /* \u300C\u5DF2\u6DFB\u52A0\u300D\u4E0E"\u5728\u9014"\u8FD9\u4E00\u6863\u8BFB\u7684\u662F **aria-disabled \u800C\u4E0D\u662F :disabled**\uFF08\u771F disabled \u4F1A\u628A\u7126\u70B9\u8E22\u5230
66
- body\uFF0C\u641C\u7D22\u6BB5\u7684 onBlur \u5C31\u5224"\u70B9\u5230\u6846\u5916"\u6536\u8D77\u4E0B\u62C9 \u2014\u2014 \u89C1\u6E32\u67D3\u5904\u90A3\u6BB5\uFF09\uFF0C\u6240\u4EE5\u89C6\u89C9\u964D\u6863\u4E5F\u8DDF\u7740\u8BFB\u5B83\uFF1A
67
- \u6574\u884C opacity .45\u3001\u6307\u9488 not-allowed\uFF0C\u7126\u70B9\u7167\u65E7\u7559\u5728\u8FD9\u4E00\u884C\u3002 */
36
+ /* Reads aria-disabled, not :disabled: real disabled would drop focus and close the dropdown. */
68
37
  .capital-watchlist-option:hover:not([aria-disabled="true"]) { background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 10%, transparent); }
69
38
  .capital-watchlist-option[aria-disabled="true"] { opacity: .45; cursor: not-allowed; }
70
- /* \u952E\u76D8\u7126\u70B9\u8D70\u5B98\u65B9\u8868\u8FBE\u5F0F\uFF1A\u73AF\u8272\u7531\u5BBF\u4E3B\u6309\u4E3B\u9898\u4E0E\u8F93\u5165\u6A21\u6001\u7BA1\u597D\uFF08\u6307\u9488\u6A21\u6001\u81EA\u52A8\u900F\u660E\uFF09\uFF0C\u4E0D\u81EA\u5DF1\u9020\u73AF\u3002 */
71
39
  .capital-watchlist-close:focus-visible, .capital-watchlist-clear:focus-visible, .capital-watchlist-option:focus-visible, .capital-watchlist-filterbtn:focus-visible, .capital-watchlist-more:focus-visible, .capital-watchlist-predict:focus-visible, .capital-watchlist-review:focus-visible, .capital-watchlist-refresh:focus-visible, .capital-watchlist-confirmbtn:focus-visible, .capital-watchlist-stepperbtn:focus-visible { outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary)); outline-offset: 1px; }
72
40
  .capital-watchlist-optionmain { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
73
41
  .capital-watchlist-optionname { font-size: 14px; line-height: 18px; font-weight: 500; color: var(--dsw-alias-label-primary); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
74
42
  .capital-watchlist-optioncode { font-size: 12px; line-height: 15px; color: var(--dsw-alias-label-tertiary); }
75
- /* \u53F3\u4FA7\u90A3\u9897\u300C\u6DFB\u52A0\u300D\u662F**\u6574\u884C\u8FD9\u4E2A button \u7684\u53EF\u89C1\u52A8\u8BCD**\uFF0C\u4E0D\u662F\u7B2C\u4E8C\u4E2A\u53EF\u805A\u7126\u63A7\u4EF6\uFF08button \u91CC\u5957 button
76
- \u662F\u975E\u6CD5 HTML\uFF09\uFF1A\u6240\u4EE5\u5B83\u53EA\u662F\u4E00\u9897\u80F6\u56CA\u2014\u2014\u5E38\u6001\u7070\u5E95\u3001hover \u8DDF\u7740\u6574\u884C\u52A0\u6DF1\uFF1B\u300C\u5DF2\u6DFB\u52A0\u300D\u90A3\u6863\u7531\u6574\u884C disabled
77
- \u7684 opacity \u7EDF\u4E00\u964D\u4E0B\u53BB\uFF0C\u4E0D\u518D\u5F80\u4EE3\u7801\u884C\u91CC\u585E\u300C\xB7 \u5DF2\u6DFB\u52A0\u300D\uFF08\u4EE3\u7801 + \u5FBD\u6807\u624D\u662F\u7B2C\u4E8C\u884C\u8981\u8BFB\u7684\u4E24\u6837\uFF09\u3002 */
78
- /* \u53F3\u4FA7\u90A3\u9897\u300C\u6DFB\u52A0\u300D\u662F**\u6574\u884C\u8FD9\u4E2A button \u7684\u53EF\u89C1\u52A8\u8BCD**\uFF0C\u4E0D\u662F\u7B2C\u4E8C\u4E2A\u53EF\u805A\u7126\u63A7\u4EF6\uFF08button \u91CC\u5957 button
79
- \u662F\u975E\u6CD5 HTML\uFF09\u3002\u4E24\u6001\uFF082026-10-08 \u7B2C\u4E09\u8F6E\u7528\u6237\u70B9\u540D\uFF09\uFF1A
80
- - **\u6DFB\u52A0 = \u9192\u76EE**\uFF1A\u6CBF\u7528\u300C\u5237\u65B0\u62A5\u4EF7\u300D\u90A3\u9897 verb \u6309\u94AE\u7684\u914D\u65B9\uFF08state \u8272 12% \u6DE1\u5E95 + 25% \u63CF\u8FB9 + \u540C\u8272\u5B57\uFF09\uFF0C
81
- \u6574\u884C\u91CC\u552F\u4E00\u5E26\u8272\u7684\u5143\u7D20\u5C31\u662F\u5B83\uFF0C\u4E00\u773C\u77E5\u9053\u70B9\u54EA\u513F\uFF1B
82
- - **\u5DF2\u6DFB\u52A0 = \u6697**\uFF1A\u900F\u660E\u5E95 + l1 \u63CF\u8FB9 + tertiary \u5B57\uFF08data-state="added"\uFF09\uFF0C\u8DDF\u6574\u884C\u7684 aria-disabled
83
- \u4E00\u8D77\u964D\u4E0B\u53BB\uFF0C\u5E76\u4E14\u70B9\u4E86\u4E5F\u4E0D\u518D\u51FA\u7F51\uFF08guard \u5728\u6E32\u67D3\u5904\uFF09\u3002 */
84
43
  .capital-watchlist-addbtn { flex: none; padding: 3px 9px; border: 1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 25%, transparent); border-radius: 999px; corner-shape: round; background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 12%, transparent); color: var(--dsw-alias-state-business-primary); font-size: 12px; line-height: 15px; font-weight: 500; }
85
44
  .capital-watchlist-option:hover:not([aria-disabled="true"]) .capital-watchlist-addbtn { background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 20%, transparent); }
86
45
  .capital-watchlist-addbtn[data-state="added"] { border-color: var(--dsw-alias-border-l1); background: transparent; color: var(--dsw-alias-label-tertiary); font-weight: 400; }
87
46
  .capital-watchlist-tag { flex: none; display: inline-block; padding: 2px 7px; border-radius: 6px; font-size: 11px; line-height: 14px; font-weight: 500; }
88
- /* \u7C7B\u578B\u5FBD\u6807 = \u5B98\u65B9\u72B6\u6001\u5FBD\u6807\u90A3\u5BF9\u5199\u6CD5\uFF1A\u5E95\u8272\u7528 state-*-tertiary\uFF08\u4E3B\u9898\u5305\u4E3A"\u72B6\u6001\u8272\u7684\u5E95"\u51C6\u5907\u7684\u5B9E\u5FC3\u6863\uFF0C
89
- \u81EA\u5DF1 color-mix \u51FA\u6765\u7684\u900F\u660E\u6863\u538B\u5728\u767D\u5361\u7247\u4E0A\u7B49\u4E8E\u6CA1\u6DF7\uFF09\uFF0C\u6587\u5B57\u7528\u540C\u8272\u7CFB primary\uFF1B
90
- amber \u4F8B\u5916\u8D70 warn-label\u2014\u2014warn-primary \u538B\u767D\u5E95\u53EA\u6709 2:1\uFF0C\u5B98\u65B9"\u72B6\u6001\u8272\u5F53\u6587\u5B57"\u53E6\u6709 label \u4E00\u6863\u3002 */
91
- /* \u4E09\u6863\u5FBD\u6807\u6309**\u5E02\u573A**\u914D\u8272\uFF0C\u53D6\u7684\u662F"\u949E\u7968\u7684\u4E3B\u8272"\u8FD9\u628A\u76F4\u89C9\uFF1A\u4EBA\u6C11\u5E01=\u7EA2\u3001\u6E2F\u5E01=\u91D1\u7425\u73C0\u3001\u7F8E\u5143=\u7EFF
92
- \uFF082026-10-07 \u7528\u6237\u70B9\u540D\uFF0C\u5E76\u660E\u786E\u7EFF\u90A3\u4E00\u6863"\u548C\u7F8E\u5143\u5F88\u50CF"\uFF09\u3002\u80A1\u7968\u4E0E\u6307\u6570\u540C\u5E02\u540C\u8272\uFF0C\u54C1\u79CD\u53EA\u7531\u6587\u5B57\u5206\u3002
93
- \u26A0\uFE0F \u7EA2\u6863\u4E0E"\u7EA2\u6DA8"\u90A3\u9897\u7EA2\u662F\u4E24\u79CD\u4E1C\u897F\uFF1A\u5FBD\u6807\u662F\u6574\u884C\u56FA\u5B9A\u7684\u5E95\uFF0C\u4EF7\u683C\u53EA\u5728\u6DA8\u8DCC\u65F6\u4E0A\u8272\u3002
94
- state-*-tertiary \u662F\u4E3B\u9898\u5305\u7ED9\u72B6\u6001\u8272\u51C6\u5907\u7684**\u5B9E\u5FC3\u5E95**\uFF1Berror \u90A3\u4E00\u65CF\u7684 tertiary \u672C\u4ED3\u4ECE\u672A\u7528\u8FC7\u3001
95
- \u65E0\u6CD5\u5728\u6B64\u786E\u8BA4\u5B58\u5728\uFF0C\u4E8E\u662F\u7ED9\u4E00\u6761 color-mix \u515C\u5E95\u2014\u2014\u731C\u9519 token \u7684\u75C7\u72B6\u662F"\u5E95\u8272\u6CA1\u4E86"\uFF0C\u4E0D\u4F1A\u62A5\u9519\u3002
96
- \u26A0\uFE0F \u8FD9\u6BB5 CSS \u4F4F\u5728\u6A21\u677F\u5B57\u7B26\u4E32\u91CC\uFF1A\u6CE8\u91CA\u91CC\u4E0D\u8BB8\u51FA\u73B0\u53CD\u5F15\u53F7\uFF0C\u51FA\u73B0\u5C31\u628A\u6574\u6BB5\u6837\u5F0F\u622A\u65AD\uFF08\u672C\u8F6E\u8E29\u8FC7\uFF09\u3002 */
47
+ /* Badge uses a solid tertiary background; state color as text uses the label tier. */
97
48
  .capital-watchlist-tag-cn { color: var(--dsw-alias-state-error-primary); background: var(--dsw-alias-state-error-tertiary, color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)); }
98
49
  .capital-watchlist-tag-hk { color: var(--dsw-alias-state-warn-label); background: var(--dsw-alias-state-warn-tertiary); }
99
50
  .capital-watchlist-tag-us { color: var(--dsw-alias-state-success-primary); background: var(--dsw-alias-state-success-tertiary); }
100
- /* \u8868\u5934\u4E0E\u6570\u636E\u884C\u5171\u7528\u540C\u4E00\u4E2A grid \u5B9A\u4E49\uFF1A\u5BBD\u5EA6\u53EA\u5728\u8FD9\u4E00\u5904\uFF0C\u4E24\u5904\u5404\u81EA\u6392\u7248\u5C31\u4F1A\u4E32\u884C\uFF08\u5B9E\u673A\u8E29\u8FC7\uFF09\u3002
101
- \u4E09\u5217\uFF1A\u540D\u79F0\uFF08\u7B2C\u4E8C\u884C\u662F\u300C\u4EE3\u7801 \xB7 \u5FBD\u6807\u300D\uFF09/ \u62A5\u4EF7 / \u300C\u64CD\u4F5C\u300D\u90A3\u4E00\u7C07\uFF08\u300C\u9884\u6D4B\u300D\u300C\u590D\u76D8\u300D\u300C\u66F4\u591A\u300D\u4E09\u679A\uFF09\u3002
102
- 92px \u4E0E 84px \u5FC5\u987B\u662F**\u5B9A\u503C**\uFF1A\u8868\u5934\u4E0E\u6570\u636E\u884C\u662F\u4E24\u4E2A\u72EC\u7ACB\u7684 grid \u5BB9\u5668\uFF0C\u53EA\u6709\u5B9A\u503C\u624D\u8BA9\u4E24\u884C\u7684\u5217\u8FB9\u7EBF\u5BF9\u9F50\uFF1B
103
- \u5199\u6210 auto \u5C31\u53D8\u6210"\u8C01\u7684\u5185\u5BB9\u8C01\u5BBD"\uFF0C\u8868\u5934\u8DDF\u7740\u6570\u636E\u4E32\u884C\u300284px = \u4E24\u679A 26px \u56FE\u6807\u952E + \u4E00\u679A 28px\u300C\u66F4\u591A\u300D
104
- + \u4E24\u4E2A 2px \u95F4\u9699\uFF0C\u6574\u7C07\u8D34\u53F3\u7F18\u3002
105
- \u8FD9\u4E00\u7248\u662F 2026-10-01 \u7528\u6237\u7B2C\u4E09\u3001\u7B2C\u56DB\u8F6E\u53CD\u9988\u7684\u7ED3\u679C\uFF1A\u4E24\u679A\u52A8\u4F5C\u4ECE"\u72EC\u7ACB\u4E24\u5217\u7684\u94FA\u6EE1\u65B9\u5757"\u6539\u6210\u56FE\u6807\u952E
106
- \uFF08"\u592A\u5BBD\u3001\u663E\u5F97\u7B28\u3001\u4E14\u6324"\u3001"\u4E0D\u8981\u663E\u793A\u4E2D\u6587\uFF0Ctooltip \u63D0\u793A"\u2192 \u5B57\u9762\u53EA\u6D3B\u5728 aria-label \u4E0E title \u91CC\uFF09\uFF0C
107
- \u5EA7\u4F4D\u518D\u4ECE\u4E2D\u6027\u5316\u7684\u540D\u79F0\u884C**\u632A\u56DE\u300C\u64CD\u4F5C\u300D\u5217**\u2014\u2014\u4E09\u4E2A\u52A8\u4F5C\u540C\u4E00\u680F\uFF0C"\u8FD9\u4E00\u884C\u80FD\u5E72\u4EC0\u4E48"\u624D\u4E00\u5904\u53EF\u8BFB\u3002 */
51
+ /* Header and rows are separate grids, so 92px / 84px must stay fixed for column alignment. */
108
52
  .capital-watchlist-grid { display: grid; grid-template-columns: 1fr 92px 84px; gap: 8px; align-items: center; }
109
53
  .capital-watchlist-head { padding: 0 20px 8px; font-size: 12px; line-height: 18px; letter-spacing: .2px; white-space: nowrap; color: var(--dsw-alias-label-tertiary); }
110
- /* \u300C\u64CD\u4F5C\u300D\u8D34\u5728\u6700\u540E\u4E00\u5217\u4E4B\u4E0A**\u5C45\u53F3**\uFF082026-10-01 \u7528\u6237\u70B9\u540D\uFF1A\u5C45\u4E2D\u592A\u4E11\uFF0C\u8BFB\u8D77\u6765\u50CF\u7B2C\u4E09\u5217\u7684\u5217\u540D\uFF09\u3002
111
- \u8FD9\u4E00\u683C\u88C5\u7740\u8FD9\u4E00\u884C\u7684\u4E09\u4E2A\u52A8\u4F5C\uFF1A\u300C\u9884\u6D4B\u300D\u300C\u590D\u76D8\u300D\u4E0E\u300C\u66F4\u591A\u300D\uFF0C\u8868\u5934\u8D34\u7684\u5C31\u662F\u5B83\u4EEC\u5171\u540C\u90A3\u6761\u53F3\u7F18\u3002 */
112
54
  .capital-watchlist-headaction { text-align: right; }
113
55
  .capital-watchlist-list { max-height: 300px; padding: 0 12px 8px; overflow-y: auto; }
114
- /* \u4E0B\u62C9\u6253\u5F00\u65F6\u628A\u8FD9\u4E00\u683C\u6491\u5230\u6D6E\u5C42\u7684\u6700\u5927\u9AD8\u5EA6\uFF08\u89C1\u4E0A\u9762 capital-watchlist-dropdown \u90A3\u4E00\u6BB5\u7684\u7406\u7531\uFF09\uFF1A
115
- **\u8FD9\u4E24\u4E2A\u6570\u5FC5\u987B\u540C\u503C**\u2014\u2014\u4E00\u4E2A\u6539\u4E86\u53E6\u4E00\u4E2A\u4E0D\u6539\uFF0C\u4E0B\u62C9\u5C31\u4F1A\u88AB\u5361\u7247\u88C1\u6389\u4E00\u622A\uFF08\u6216\u8005\u6E05\u5355\u88AB\u9876\u51FA\u5361\u7247\u5916\uFF09\u3002
116
- 2026-10-08 \u4E00\u8D77\u4ECE 246 \u62AC\u5230 320\uFF08\u7528\u6237\u70B9\u540D"\u4E00\u5C4F\u53EA\u80FD\u663E\u793A 3 \u4E2A\u6807\u7684"\uFF09\uFF0C\u6D4B\u8BD5\u91CC\u6709\u540C\u503C\u65AD\u8A00\u3002
117
- \u53EA\u5728\u6253\u5F00\u65F6\u6491\uFF1A\u5E73\u65F6 1-2 \u884C\u7684\u77ED\u6E05\u5355\u4E0D\u8BE5\u5E73\u767D\u591A\u51FA\u4E00\u622A\u7A7A\u767D\u3002
118
- \u26A0\uFE0F \u6253\u5F00\u65F6 min-height(320) > \u4E0A\u9762\u90A3\u6761 max-height(300)\uFF0C\u800C CSS \u91CC min \u6052\u80DC max \u21D2 \u8FD9\u4E00\u683C\u6B64\u65F6\u6309
119
- 320 \u9AD8\u3001\u5185\u90E8\u7167\u65E7 overflow-y: auto \u81EA\u5DF1\u6EDA\uFF1B\u6536\u8D77\u540E max-height 300 \u6062\u590D\u751F\u6548\u3002 */
56
+ /* Must equal the dropdown max-height; min wins over max-height while open. */
120
57
  .capital-watchlist-list-open { min-height: 320px; }
121
58
  .capital-watchlist-row { padding: 11px 8px; border-radius: 10px; transition: background .15s var(--ds-ease-in-out); }
122
59
  .capital-watchlist-row:hover { background: var(--dsw-alias-interactive-bg-hover); }
123
60
  .capital-watchlist-namewrap { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
124
61
  .capital-watchlist-name { font-size: 14px; font-weight: 500; color: var(--dsw-alias-label-primary); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
125
- /* \u7528\u6237\u5728\u8FD9\u6761\u9762\u677F\u4E0A\u4EB2\u624B\u6807\u8FC7\u6301\u4ED3\u7684\u90A3\u4E00\u884C\uFF1A\u540D\u79F0\u6807\u7EA2\uFF082026-10-09 \u7528\u6237\u70B9\u540D\uFF0C\u66FF\u4EE3\u539F\u5148\u90A3\u679A\u5FBD\u6807\uFF09\u3002
126
- \u26A0\uFE0F \u989C\u8272\u4E0D\u662F\u8FD9\u6761\u6807\u8BB0\u7684\u552F\u4E00\u901A\u9053\u2014\u2014\u5B83\u4E0E"\u7EA2\u6DA8"\u540C\u8272\uFF0C\u6240\u4EE5 title \u91CC\u540C\u65F6\u5199\u7740"\u6301\u4ED3 20%"\uFF0C
127
- \u8BFB\u5C4F\u4E0E\u9F20\u6807\u60AC\u505C\u90FD\u62FF\u5F97\u5230\u540C\u4E00\u53E5\u8BDD\uFF08\u89C1 nameTitle\uFF09\u3002 */
128
62
  .capital-watchlist-name-held { color: var(--capital-watchlist-up); }
129
- /* \u4EE3\u7801\u4E0E\u7C7B\u578B\u5FBD\u6807\u540C\u5904\u7B2C\u4E8C\u884C\uFF082026-10-07 \u8D77\u8FD9\u4E00\u884C\u5C31\u8FD9\u4E24\u6837\uFF0C\u5E01\u79CD\u4E0D\u8FDB\u9762\u677F\uFF09\uFF1Agap \u662F\u8FD9\u4E00\u5BF9\u552F\u4E00\u7684\u95F4\u8DDD\u6765\u6E90\uFF0C\u5FBD\u6807\u81EA\u5E26\u5185\u8FB9\u8DDD\uFF0C\u522B\u518D\u5404\u5199 margin\u300210px \u4E0E\u5019\u9009\u884C capital-watchlist-option \u90A3\u6761 gap \u540C\u503C\u2014\u2014\u540C\u4E00\u4EF6\u4E8B\u7684\u4E24\u79CD\u6392\u6CD5\uFF0C\u4E0D\u8BE5\u4E00\u5904\u7D27\u4E00\u5904\u677E\uFF1B6px \u5728\u5B9E\u673A\u4E0A\u8BFB\u8D77\u6765\u662F"\u8D34\u7740"\uFF082026-10-07 \u7528\u6237\u70B9\u540D\uFF09\u3002 */
130
63
  .capital-watchlist-codeline { display: flex; align-items: center; gap: 10px; min-width: 0; }
131
64
  .capital-watchlist-code { font-size: 11px; color: var(--dsw-alias-label-tertiary); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
132
- /* \u6700\u65B0\u4EF7\u5728\u4E0A\u3001\u6DA8\u8DCC\u5E45\u5728\u4E0B\uFF0C\u53F3\u5BF9\u9F50\uFF1A\u4E24\u884C\u90FD\u540C\u4E00\u5217\u91CC\u6392\uFF0C\u5217\u5BBD\u624D\u4E0D\u9700\u8981\u8DDF\u7740\u6DA8\u8DCC\u4F4D\u6570\u6296\u3002
133
- padding-right \u662F**\u6570\u5B57\u4E0E\u52A8\u4F5C\u533A\u4E4B\u95F4\u90A3\u53E3\u6C14\u7684\u552F\u4E00\u6765\u6E90**\uFF082026-10-01 \u7528\u6237\u70B9\u540D\uFF1A\u62A5\u4EF7\u548C\u9884\u6D4B/\u590D\u76D8\u592A\u8FD1\uFF0C
134
- \u6574\u884C\u4E0D\u5747\u8861\uFF09\uFF1A\u53F3\u5BF9\u9F50\u7684\u6570\u5B57\u6C38\u8FDC\u8D34\u7740\u4E00\u5217\u7684\u53F3\u7F18\u6536\u7B14\uFF0C\u6240\u4EE5\u628A\u8FD9\u4E00\u5217\u6539\u7A84**\u4E0D\u4F1A**\u8BA9\u6570\u5B57\u79BB\u6309\u94AE\u66F4\u8FDC\u2014\u2014
135
- \u5217\u5BBD\u53EA\u6539\u5DE6\u8FB9\u754C\uFF0C\u53F3\u8FB9\u754C\u4E00\u76F4\u662F\u90A3 8px \u7684 gap\u3002\u8868\u5934\u300C\u6700\u65B0\u4EF7 / \u6DA8\u8DCC\u5E45\u300D\u501F\u540C\u4E00\u4E2A\u7C7B\uFF0C\u8DDF\u7740\u4E00\u8D77\u5DE6\u79FB\uFF0C
136
- \u6807\u7B7E\u4E0E\u5B83\u5E95\u4E0B\u7684\u6570\u5B57\u56E0\u6B64\u59CB\u7EC8\u5BF9\u9F50\u3002 */
65
+ /* Right-aligned numbers end at the same edge, so padding-right is the only gap before actions. */
137
66
  .capital-watchlist-quote { min-width: 0; padding-right: 12px; text-align: right; font-variant-numeric: tabular-nums; }
138
67
  .capital-watchlist-price { font-size: 14px; font-weight: 500; color: var(--dsw-alias-label-primary); white-space: nowrap; }
139
68
  .capital-watchlist-change { margin-top: 1px; font-size: 12px; font-weight: 500; white-space: nowrap; }
140
69
  .capital-watchlist-up { color: var(--capital-watchlist-up); }
141
70
  .capital-watchlist-down { color: var(--capital-watchlist-down); }
142
71
  .capital-watchlist-flat { color: var(--dsw-alias-label-secondary); }
143
- /* \u7B2C\u56DB\u6863\uFF1A\u4EF7\u6709\u3001\u6DA8\u8DCC\u8FD8\u6CA1\u6709\uFF08\u505C\u724C / \u672A\u5F00\u76D8\uFF09\u3002\u523B\u610F\u6BD4 flat \u518D\u6D45\u4E00\u6863\u2014\u2014flat \u90A3\u4E00\u6863\u8BF4\u7684\u662F"\u4ECA\u65E5\u5E73\u76D8"
144
- \u8FD9\u4E2A\u7ED3\u8BBA\uFF0C\u501F\u7528\u5B83\u5C31\u628A"\u6CA1\u8FD9\u4E2A\u6570"\u753B\u6210\u4E86\u4E00\u4E2A\u6295\u8D44\u5224\u65AD\u3002 */
145
72
  .capital-watchlist-nodata { color: var(--dsw-alias-label-tertiary); }
146
- /* \u8FD9\u4E00\u884C\u672C\u6B21\u6CA1\u53D6\u5230\u62A5\u4EF7\u3001\u4E14\u4ECE\u6765\u6CA1\u6709\u8FC7\u503C\uFF1A\u7834\u6298\u53F7\u6807\u7EA2\uFF08\u7EA2 = \u6570\u636E\u4E0D\u53EF\u4FE1\uFF0C\u4E0E\u6574\u6279\u5237\u65B0\u540C\u4E00\u6863\uFF09\u3002
147
- \u5199\u5728 up/down/flat \u4E4B\u540E\uFF0C\u4E0E .capital-watchlist-price \u540C specificity \u9760\u6E90\u7801\u5E8F\u8D62\u2014\u2014\u4E0D\u9760 !important \u62A2\u3002 */
148
73
  .capital-watchlist-quotefailed { color: var(--dsw-alias-state-error-primary); }
149
- /* \u672C\u6B21\u6CA1\u53D6\u5230\u3001\u4F46\u4E0A\u4E00\u6B21\u6210\u529F\u7684\u5FEB\u7167\u8FD8\u5728\uFF08\u540E\u7AEF\u53EA\u8986\u5199\u6210\u529F\u7684\u90A3\u51E0\u6761\uFF09\uFF1A\u503C\u7167\u753B\uFF0C\u4E24\u884C\u90FD\u964D\u5230 secondary\u3002
150
- \u7EA2\u6DA8\u7EFF\u8DCC\u662F"\u5F53\u524D"\u7684\u8BED\u4E49\uFF0C\u4E00\u4E2A\u9648\u65E7\u503C\u4E0D\u8BE5\u501F\u7528\uFF1B\u5B83\u662F\u54EA\u4E00\u523B\u7684\u5199\u5728 tooltip \u91CC\u3002 */
74
+ /* Failed refresh keeps the last good snapshot; the tooltip names its time. */
151
75
  .capital-watchlist-stale { color: var(--dsw-alias-label-secondary); }
152
- /* \u9AA8\u67B6\u6761\uFF1Abg-skeleton \u5728\u6D45\u8272\u53EA\u6709 4%\uFF0C\u5B98\u65B9\u90A3\u4E00\u6761\uFF08.skeletonBar\uFF09\u4E5F\u662F\u914D 2s \u547C\u5438\u4E00\u8D77\u7528\u7684\u3002 */
153
76
  .capital-watchlist-skeleton { display: block; height: 12px; margin: 2px 0 0 auto; border-radius: 6px; background: var(--dsw-alias-bg-skeleton); animation: capital-watchlist-breathe 2s cubic-bezier(.36, 0, .64, 1) infinite; }
154
77
  .capital-watchlist-skeleton-price { width: 68px; }
155
78
  .capital-watchlist-skeleton-change { width: 44px; height: 10px; }
156
- /* \u300C\u66F4\u591A\u300D\u952E\uFF1Adimmed \u5728\u6D45\u5E95\u7B49\u4E8E\u56FE\u6807\u6574\u4E2A\u6D88\u5931\uFF0C\u6240\u4EE5\u5E38\u6001\u53D6 label-tertiary\uFF0Chover \u63D0\u4EAE\u5230 primary
157
- \uFF08\u7834\u574F\u6027\u7684\u300C\u79FB\u9664\u300D\u964D\u7EA7\u6210\u83DC\u5355\u91CC\u7684\u4E00\u6761 danger \u884C\uFF0C\u884C\u5185\u4E0D\u518D\u5E38\u9A7B\u4E00\u4E2A\u7EA2\u8272\u52A8\u4F5C\uFF09\u3002 */
158
79
  .capital-watchlist-more { width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; border: none; border-radius: var(--dsw-radius-sm); background: transparent; color: var(--dsw-alias-label-tertiary); cursor: pointer; }
159
80
  .capital-watchlist-more:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary); }
160
81
  .capital-watchlist-more:disabled { opacity: .45; cursor: not-allowed; }
161
- /* \u5B98\u65B9 Menu \u7684\u951A\u70B9\u5305\u7740\u4E00\u5C42 span\uFF08.root \u662F inline-flex\uFF09\uFF1A\u8D34\u53F3\u7F18\u9760 justify-content\u2014\u2014\u65E7\u7248\u5220\u9664\u952E\u662F
162
- \u683C\u5B50\u672C\u8EAB\uFF0C\u7528 margin-left:auto\uFF1B\u5305\u4E00\u5C42\u4E4B\u540E auto \u5916\u8FB9\u8DDD\u843D\u5728 span \u81EA\u5DF1\u8EAB\u4E0A\uFF0C\u5DF2\u65E0\u6548\u679C\u3002
163
- \u73B0\u5728\u5B83\u4F4F\u5728 .capital-watchlist-rowactions \u90A3\u4E00\u7C07\u91CC\uFF0C\u540C\u4E00\u7C07\u8FD8\u6709\u300C\u9884\u6D4B\u300D\u300C\u590D\u76D8\u300D\u4E24\u679A\u56FE\u6807\u952E\u3002 */
164
82
  .capital-watchlist-actions { justify-content: flex-end; }
165
83
  .capital-watchlist-rowactions { display: inline-flex; align-items: center; justify-content: flex-end; gap: 2px; min-width: 0; }
166
- /* \u300C\u9884\u6D4B\u300D\u4E0E\u300C\u590D\u76D8\u300D= \u52A8\u4F5C\u5217\u91CC\u7684\u4E24\u679A**\u56FE\u6807\u952E**\uFF082026-10-01 \u7528\u6237\u4E24\u6B21\u70B9\u540D\uFF1A\u4E0D\u663E\u793A\u4E2D\u6587\uFF0C\u9760 tooltip \u8BF4\uFF1B
167
- \u94FA\u6EE1\u6574\u683C\u7684\u63CF\u8FB9\u65B9\u5757"\u592A\u5BBD\u3001\u663E\u5F97\u7B28\u3001\u4E14\u6324"\uFF1B\u5EA7\u4F4D\u4ECE\u540D\u79F0\u884C\u632A\u56DE\u300C\u64CD\u4F5C\u300D\u5217\uFF0C\u4E09\u4E2A\u52A8\u4F5C\u540C\u680F\u624D\u8BFB\u5F97\u51FA"\u8FD9\u4E00\u884C\u80FD\u5E72\u4EC0\u4E48"\uFF09\u3002
168
- \u56FE\u6807\u53D6\u5B98\u65B9\u96C6\u91CC\u8BED\u4E49\u76F4\u7684\u90A3\u4E24\u652F\uFF1A**\u9776\u5FC3** IconGoalOutlineRegular = \u90A3\u53E5\u8BDD\u8981\u7684\u662F\u672A\u6765\u8D70\u52BF\u4E0E\u5173\u952E\u70B9\u4F4D\uFF0C
169
- **\u5E26\u7B14\u7684\u6E05\u5355** IconListPenOutlineRegular = \u5BF9\u7740\u5DF2\u53D1\u751F\u7684\u884C\u60C5\u628A\u8FD9\u4E00\u884C\u5199\u4E00\u904D\u3002\u5B57\u9762\u53EA\u6D3B\u5728 aria-label \u4E0E
170
- title \u91CC\uFF0C\u6240\u4EE5\u5217\u5BBD\u4E0E\u5B57\u4F53\u5EA6\u91CF\u4E0D\u518D\u662F\u8FD9\u4EF6\u4E8B\u7684\u7EA6\u675F\u2014\u2014\u82F1\u6587\u6807\u7B7E\u5199\u6210\u4EC0\u4E48\u90FD\u4E0D\u4F1A\u6EA2\u51FA\u3002
171
- \u540C\u4E00\u652F\u7B14\u7167\u884C\u5185\u300C\u66F4\u591A\u300D\u952E\u6765\uFF1A\u900F\u660E\u5E95\u3001\u65E0\u63CF\u8FB9\uFF08\u4E00\u884C\u91CC\u6302\u4E09\u4E2A\u65B9\u6846\u4F1A\u62A2\u8BFB\uFF09\uFF0Chover \u624D\u843D bg-hover-accent
172
- \uFF08bg-hover \u5728\u6D45\u8272\u53EA\u6709 6%\uFF0C\u900F\u660E\u5E95\u4E0A\u7B49\u4E8E\u6CA1\u53CD\u5E94\uFF09\uFF1B\u4E5F\u4E0D\u501F\u7528\u6DA8\u8DCC\u7684\u7EA2\u7EFF\u2014\u2014\u5B83\u4EEC\u4E0D\u62A5\u6570\u636E\u3002
173
- 26\xD724 \u662F\u8FD9\u4E00\u6863\u56FE\u6807\u952E\u7684\u4E0B\u9650\uFF0C\u518D\u5C0F\u5C31\u6210\u70B9\u4E0D\u5230\u7684\u88C5\u9970\u3002 */
84
+ /* 26\xD724 is the minimum hit target for icon-only actions. */
174
85
  .capital-watchlist-review, .capital-watchlist-predict { flex: none; width: 26px; height: 24px; display: inline-flex; align-items: center; justify-content: center; border: none; border-radius: var(--dsw-radius-sm); background: transparent; color: var(--dsw-alias-label-secondary); cursor: pointer; }
175
86
  .capital-watchlist-review:hover:not(:disabled), .capital-watchlist-predict:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover-accent); color: var(--dsw-alias-label-primary); }
176
87
  .capital-watchlist-review:disabled, .capital-watchlist-predict:disabled { opacity: .45; cursor: not-allowed; }
177
- /* \u5E95\u90E8\u4E00\u884C\uFF1A\u5DE6\u5217\u662F\u300C\u5237\u65B0\u62A5\u4EF7\u300D\u52A8\u8BCD + \u5B83\u81EA\u5DF1\u7684\u6574\u6279\u5931\u8D25\u884C\uFF0C\u53F3\u5217\u662F\u5171\u7528\u7684\u66F4\u65B0\u65F6\u95F4\u3002
178
- flex-start \u800C\u4E0D\u662F center\uFF1A\u5931\u8D25\u884C\u51FA\u73B0\u65F6\u5DE6\u5217\u53D8\u9AD8\uFF0C\u5C45\u4E2D\u7684\u8BDD\u66F4\u65B0\u65F6\u95F4\u4F1A\u8DDF\u7740\u5F80\u4E0B\u5760\u3002 */
179
88
  .capital-watchlist-footer { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; padding: 14px 20px 18px; border-top: .5px solid var(--dsw-alias-border-l2); }
180
89
  .capital-watchlist-footcol { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; min-width: 0; }
181
- /* \u5237\u65B0\u6309\u94AE\u5E95\u8D70\u5B98\u65B9 Tag \u7684 info \u914D\u65B9\uFF08state \u8272 + color-mix \u900F\u660E\u6863\uFF0C\u8981\u7684\u662F"\u8F7B"\uFF0C\u5B9E\u5FC3 tertiary \u5728\u6309\u94AE\u4E0A
182
- \u4F1A\u7CCA\u6210\u4E00\u5757\u8272\u6591\uFF09\uFF1B\u8FB9\u6846\u6309\u53E3\u5F84\u4F8B\u5916\uFF1A\u72B6\u6001\u8272 border \u4FDD\u6301 1px\uFF0C0.5px \u90A3\u6761\u53EA\u7BA1\u4E2D\u6027 border\u3002 */
183
90
  .capital-watchlist-refresh { display: inline-flex; align-items: center; gap: 6px; height: 34px; padding: 0 14px; border: 1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 25%, transparent); border-radius: 10px; background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 12%, transparent); color: var(--dsw-alias-state-business-primary); font-family: inherit; font-size: 13px; line-height: 20px; font-weight: 500; cursor: pointer; }
184
91
  .capital-watchlist-refresh:hover:not(:disabled) { background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 20%, transparent); }
185
92
  .capital-watchlist-refresh:disabled { opacity: .45; cursor: not-allowed; }
186
- /* 34px = \u5237\u65B0\u6309\u94AE\u7684\u9AD8\u5EA6\uFF1A\u4E0E\u5B83\u540C\u4E00\u884C\u7684\u65F6\u95F4\u6309\u6309\u94AE\u9AD8\u5EA6\u884C\u9AD8\u5C45\u4E2D\uFF0C\u5DE6\u5217\u591A\u51FA\u5931\u8D25\u884C\u4E5F\u4E0D\u53D7\u5F71\u54CD\u3002 */
187
93
  .capital-watchlist-updated { font-size: 12px; line-height: 34px; color: var(--dsw-alias-label-tertiary); }
188
- /* flex: none\uFF1A2026-10-08 \u8D77 hint \u662F\u4E0B\u62C9\u8FD9\u4E2A flex \u5217\u7684\u76F4\u63A5\u5B50\u5143\u7D20\uFF08\u6EDA\u52A8\u533A\u53EA\u5269\u9009\u9879\u90A3\u4E00\u5C42\uFF09\uFF0C
189
- \u4E0D\u9489\u4F4F\u7684\u8BDD\u7A7A\u95F4\u4E00\u7D27\u5B83\u5C31\u4F1A\u88AB\u538B\u6241\u2014\u2014hint \u6CA1\u6709 overflow\uFF0C\u538B\u6241\u5C31\u662F\u6587\u5B57\u88AB\u88C1\u3002 */
190
94
  .capital-watchlist-hint { flex: none; padding: 8px 14px; font-size: 12px; line-height: 18px; color: var(--dsw-alias-label-secondary); }
191
- /* \u9EC4 = \u52A8\u4F5C\u6CA1\u6210\u3002\u4E24\u6761\u9EC4\u5B57\u90FD\u7528 warn-label\uFF1A\u5B98\u65B9"\u72B6\u6001\u8272\u7528\u4F5C\u6587\u5B57"\u7ED9\u7684\u662F label \u90A3\u4E00\u6863\uFF0C
192
- warn-primary \u538B\u5728\u6D45\u5E95\u4E0A\u53EA\u6709 2:1\uFF0C\u62A5\u9519\u6587\u5B57\u53CD\u800C\u662F\u6700\u4E0D\u8BE5\u770B\u4E0D\u89C1\u7684\u4E00\u884C\u3002 */
193
- /* \u641C\u7D22\u5931\u8D25\uFF1A\u5360\u4E0B\u62C9\u7684 hint \u4F4D\uFF08\u4E0E\u300C\u641C\u7D22\u4E2D\u2026\u300D\u300C\u6CA1\u6709\u5339\u914D\u7684\u6807\u7684\u300D\u540C\u4E00\u4E2A\u69FD\uFF0C\u66FF\u6362\u800C\u975E\u5E76\u5217\uFF09\u3002
194
- \u4E0D\u5199 padding\u2014\u2014\u5B83\u9A91\u5728 .capital-watchlist-hint \u7684 8px 14px \u4E0A\uFF0C\u53EA\u6539\u989C\u8272\u3002 */
195
95
  .capital-watchlist-searcherror { color: var(--dsw-alias-state-warn-label); }
196
- /* \u6DFB\u52A0\u5931\u8D25\uFF08list_full / ambiguous\uFF09\uFF1A\u4E0E\u8F93\u5165\u65E0\u5173\uFF0C\u8DDF\u7740\u641C\u7D22\u533A\u5750\u7740\uFF0C\u6539\u5B57\u4E0D\u6E05\u5B83\u3002 */
197
96
  .capital-watchlist-adderror { padding: 0 20px 10px; font-size: 12px; line-height: 18px; color: var(--dsw-alias-state-warn-label); }
198
- /* \u6574\u6279\u5237\u65B0\u5931\u8D25\uFF1A\u7EA2 = \u6570\u636E\u4E0D\u53EF\u4FE1\uFF0C\u8D34\u5728\u300C\u5237\u65B0\u62A5\u4EF7\u300D\u4E0B\u9762\uFF08\u8DDF\u7740\u52A8\u8BCD\u8D70\uFF09\uFF0C\u4E0D\u518D\u5C45\u4E2D\u98D8\u5230\u8F93\u5165\u6846\u4E0B\u65B9\u3002 */
199
97
  .capital-watchlist-notice { font-size: 12px; line-height: 18px; color: var(--dsw-alias-state-error-primary); }
200
98
  .capital-watchlist-empty { padding: 24px 20px; text-align: center; font-size: 13px; line-height: 20px; color: var(--dsw-alias-label-secondary); }
201
- /* \u6E05\u5355\u8BFB\u53D6\u5931\u8D25\uFF1A\u5360\u7A7A\u6001\u90A3\u4E00\u683C\uFF0C\u4F46\u989C\u8272\u662F"\u6570\u636E\u4E0D\u53EF\u4FE1"\u90A3\u4E00\u6863\uFF08\u7EA2\uFF09\u800C\u4E0D\u662F\u7A7A\u6E05\u5355\u7684\u6B21\u8981\u7070\u3002
202
- \u5199\u5728 .capital-watchlist-empty \u4E4B\u540E\u2014\u2014\u4E24\u4E2A\u7C7B\u540C\u843D\u5728\u8FD9\u4E00\u884C\uFF0C\u9760\u6E90\u7801\u5E8F\u8D62\u3002 */
203
99
  .capital-watchlist-loaderror { color: var(--dsw-alias-state-error-primary); }
204
- /* \u5220\u9664\u4E8C\u6B21\u786E\u8BA4\uFF1A\u8D34\u5728\u5361\u7247\u5185\u7684\u7EDD\u5BF9\u5C42\uFF08.dialog \u7684 overflow:hidden \u987A\u5E26\u88C1\u6389\u5706\u89D2\u5916\u6CBF\uFF09\u3002
205
- \u5E38\u9A7B\u6302\u8F7D + \u7C7B\u5207\u6362\uFF0C\u624D\u6709\u6DE1\u5165\u6DE1\u51FA\uFF1Bvisibility:hidden \u7684\u5B50\u8282\u70B9\u5929\u7136\u9000\u51FA Tab \u5E8F\u3002 */
206
100
  .capital-watchlist-confirm { position: absolute; inset: 0; z-index: 50; display: flex; align-items: center; justify-content: center; border-radius: 18px; background: var(--dsw-alias-bg-mask-1); opacity: 0; visibility: hidden; transition: opacity .2s var(--ds-ease-in-out), visibility .2s; }
207
101
  .capital-watchlist-confirm-open { opacity: 1; visibility: visible; }
208
- /* \u786E\u8BA4\u76D2\u662F\u6D6E\u5C42\uFF0C\u6309\u5B98\u65B9\u6A21\u6001\u5361\u53E3\u5F84\u753B\uFF1Aborder:0 + layer-2 + elevation-prominent\uFF0C
209
- \u4E0D\u81EA\u5DF1\u62FF bg-mask \u5F53\u5F71\u5B50\uFF08\u6D45\u5E95\u4E0B 16% \u63CF\u8FB9 + 24% \u9ED1\u5F71\u4F1A\u7CCA\u6210\u4E00\u56E2\u810F\u8FB9\uFF09\u3002 */
210
- /* \u786E\u8BA4\u76D2\u539F\u5148\u5199\u6B7B 280px\uFF1A\u684C\u9762\u7AEF\u7A97\u53E3\u62D6\u7A84\u65F6\uFF0892vw \u5C0F\u4E8E\u7EA6 320px\uFF09\u5B83\u6BD4\u5361\u7247\u8FD8\u5BBD\uFF0C\u88AB
211
- capital-watchlist-card \u7684 overflow: hidden \u88C1\u6389\u2014\u2014\u300C\u53D6\u6D88 / \u786E\u8BA4\u79FB\u9664\u300D\u4E24\u9897\u6309\u94AE\u76F4\u63A5\u591F\u4E0D\u7740\uFF0C
212
- \u8FD9\u4E00\u6B21\u5220\u9664\u65E2\u51FA\u4E0D\u53BB\u4E5F\u70B9\u4E0D\u6389\u3002\u8DDF\u7740\u5361\u7247\u6536\uFF0C280px \u53EA\u662F\u4E0A\u9650\u3002 */
102
+ /* Width follows the card, or a narrow window clips the buttons inside overflow:hidden. */
213
103
  .capital-watchlist-confirmbox { width: min(280px, calc(100% - 24px)); padding: 22px 20px 18px; border: 0; border-radius: 14px; background: var(--dsw-alias-bg-layer-2); box-shadow: var(--dsw-elevation-prominent); text-align: center; transform: scale(.95); transition: transform .2s var(--ds-ease-in-out); }
214
104
  .capital-watchlist-confirm-open .capital-watchlist-confirmbox { transform: scale(1); }
215
105
  .capital-watchlist-confirmtitle { font-size: 15px; line-height: 22px; font-weight: 600; color: var(--dsw-alias-label-primary); }
216
106
  .capital-watchlist-confirmdesc { margin-top: 8px; font-size: 13px; line-height: 1.5; color: var(--dsw-alias-label-secondary); }
217
107
  .capital-watchlist-confirmdesc strong { color: var(--dsw-alias-label-primary); font-weight: 500; }
218
108
  .capital-watchlist-confirmactions { display: flex; gap: 10px; margin-top: 20px; }
219
- /* \u6B21\u8981\u6309\u94AE\u7070\u5E95\u7528 button-primary-dimmed\uFF08\u5B98\u65B9\u7ED9"\u6B21\u8981\u6309\u94AE"\u7684\u5B9E\u5FC3\u6863\uFF09\uFF1A
220
- interactive-bg-hover \u5728\u6D45\u8272\u53EA\u6709 6%\uFF0C\u4E24\u53EA\u6309\u94AE\u5728\u767D\u8272\u786E\u8BA4\u76D2\u4E0A\u5C31\u53EA\u5269\u8FB9\u6846\u91CC\u7684\u7A7A\u6C14\u3002 */
221
109
  .capital-watchlist-confirmbtn { flex: 1 1 0; height: 36px; border: none; border-radius: 10px; background: var(--dsw-alias-button-primary-dimmed); color: var(--dsw-alias-label-primary); font-family: inherit; font-size: 13px; line-height: 20px; font-weight: 500; cursor: pointer; }
222
110
  .capital-watchlist-confirmbtn:hover { background: var(--dsw-alias-interactive-bg-hover-accent); }
223
111
  .capital-watchlist-confirmdanger { border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 25%, transparent); background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent); color: var(--dsw-alias-state-error-primary); }
224
112
  .capital-watchlist-confirmdanger:hover { background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 25%, transparent); }
225
- /* \u6301\u4ED3\u8FD9\u4E00\u7C07\u4F4F\u5728\u300C\u66F4\u591A\u300D\u83DC\u5355\u91CC\uFF08\u52FE\u4E00\u4E0B\u624D\u957F\u51FA\u6BD4\u4F8B\u90A3\u4E00\u884C\uFF09\u3002\u26D4 \u8FD9\u4E9B\u9009\u62E9\u5668\u5FC5\u987B\u662F**\u88F8\u7C7B**\uFF1A\u83DC\u5355\u662F
226
- portal \u5230 document.body \u7684\uFF0C".capital-watchlist-card \u2026" \u90A3\u79CD\u540E\u4EE3\u9009\u62E9\u5668\u591F\u4E0D\u5230\u5B83\uFF0C\u6302\u5728\u90A3\u513F
227
- \u7684\u89C4\u5219\u4F1A\u9759\u9ED8\u4E0D\u751F\u6548\u3002\u989C\u8272\u4E5F\u4E00\u5F8B\u8D70 --dsw-alias-*\uFF1Acard \u4E0A\u90A3\u5BF9\u6DA8\u8DCC\u53D8\u91CF\u540C\u6837\u900F\u4E0D\u8FDB\u53BB\u3002
228
- \u884C\u7684\u51E0\u4F55\u7167\u5B98\u65B9 .item \u6284\uFF08min-height 34 / padding 6px 8px / gap 6 / radius md / 13px 20px\uFF09\uFF1A
229
- \u81EA\u5DF1\u53D1\u660E\u7684\u884C\u9AD8\u4F1A\u5728\u540C\u4E00\u5F20\u83DC\u5355\u91CC\u957F\u51FA\u4E09\u79CD\u8282\u594F\u3002 */
113
+ /* Portal menu: selectors must be bare classes; card-scoped custom properties do not reach it. */
230
114
  .capital-watchlist-checkrow { box-sizing: border-box; display: flex; align-items: center; gap: 6px; width: 100%; min-height: 34px; padding: 6px 8px; border-radius: var(--dsw-radius-md); font-family: inherit; font-size: 13px; line-height: 20px; color: var(--dsw-alias-label-primary); text-align: left; }
231
- /* \u884C\u9996\u56FE\u6807\u7167\u5B98\u65B9 .itemIcon \u7684\u51E0\u4F55\uFF0814x14\u3001flex: none\u3001menu-icon \u8272\uFF09\uFF1A\u4E0E\u300C\u7F6E\u9876\u300D\u300C\u79FB\u9664\u300D\u90A3\u4E24\u884C
232
- \u540C\u4E00\u652F\u4F4D\uFF0C\u56FE\u6807\u5927\u5C0F\u4E00\u4E0D\u4E00\u5217\u624D\u4E0D\u6296\u3002 */
233
115
  .capital-watchlist-checkicon { display: inline-flex; flex: none; width: 14px; height: 14px; align-items: center; justify-content: center; color: var(--dsw-alias-menu-icon); }
234
116
  .capital-watchlist-checklabel { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
235
- /* \u6BD4\u4F8B\u90A3\u4E00\u884C\uFF1A\u6807\u9898\u5728\u5DE6\u3001\u2212/\u8BFB\u6570/+ \u5728\u540C\u4E00\u884C\u7684\u53F3\u8FB9\uFF082026-10-09 \u7528\u6237\u70B9\u540D"\u548C\u6807\u8BB0\u6301\u4ED3\u4E00\u4E2A\u7EA7\u522B"\uFF09\u3002 */
236
117
  .capital-watchlist-stepper { box-sizing: border-box; display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; min-height: 34px; padding: 6px 8px; border-radius: var(--dsw-radius-md); font-size: 13px; line-height: 20px; color: var(--dsw-alias-label-primary); }
237
118
  .capital-watchlist-stepperlabel { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
238
119
  .capital-watchlist-stepperline { display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex: none; }
239
- /* \u6B65\u8FDB\u952E\uFF1A\u5C0F\u65B9\u952E\uFF0C\u63CF\u8FB9\u4E0E\u5E95\u9762\u7167\u641C\u7D22\u6846\u90A3\u4E00\u6761\u53E3\u5F84\uFF08\u4E2D\u6027\u63CF\u8FB9 0.5px\uFF0C\u72B6\u6001\u8272\u624D 1px\uFF09\u3002
240
- \u534A\u5F84\u523B\u610F\u5199 8px \u800C\u4E0D\u662F 999px / 50%\uFF1A\u9762\u677F\u6709\u4E00\u6761"\u6B63\u5706\u4E0E\u80F6\u56CA\u5FC5\u987B\u914D corner-shape: round"\u7684
241
- \u8BA1\u6570\u95F8\u95E8\uFF0C\u4E3A\u4E00\u9897\u6309\u952E\u591A\u914D\u4E00\u5BF9\u6CA1\u6709\u610F\u4E49\u3002 */
242
120
  .capital-watchlist-stepperbtn { flex: none; width: 26px; height: 26px; display: inline-flex; align-items: center; justify-content: center; border: 0.5px solid var(--dsw-alias-border-l1); border-radius: 8px; background: var(--dsw-alias-bg-module-platform); color: var(--dsw-alias-label-secondary); font-family: inherit; font-size: 15px; line-height: 1; cursor: pointer; }
243
121
  .capital-watchlist-stepperbtn:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover-accent); }
244
122
  .capital-watchlist-stepperbtn:disabled { opacity: .45; cursor: not-allowed; }
245
- /* \u8BFB\u6570\uFF1Amin-width \u8BA9 0~100 / 10% / 100% \u8FD9\u51E0\u79CD\u5199\u6CD5\u90FD\u4E0D\u628A\u4E24\u8FB9\u7684\u952E\u63A8\u8D70\uFF08\u6570\u5B57\u7528 tabular-nums\uFF09\u3002
246
- \u6CA1\u586B\u7684\u65F6\u5019\u663E\u793A\u7684\u5C31\u662F\u8FD9\u4E00\u683C\u7684**\u5269\u4F59\u989D\u5EA6**\uFF080~N\uFF09\uFF0C\u4E0D\u518D\u5199"\u672A\u586B"\uFF08\u7528\u6237\u70B9\u540D\u7528 placeholder \u63D0\u793A\uFF09\uFF1B
247
- placeholder \u964D\u4E00\u6863\u989C\u8272\uFF0C\u514D\u5F97"\u6CA1\u8FD9\u4E2A\u6570"\u8BFB\u8D77\u6765\u50CF\u4E00\u4E2A\u6570\u3002 */
248
123
  .capital-watchlist-stepperreadout { min-width: 46px; text-align: center; font-size: 13px; line-height: 18px; font-variant-numeric: tabular-nums; color: var(--dsw-alias-label-primary); }
249
124
  .capital-watchlist-stepperplaceholder { color: var(--dsw-alias-label-tertiary); }
250
- /* \u26D4 \u8FD9\u5F20\u83DC\u5355\u5FC5\u987B**\u56FA\u5B9A\u5BBD\u5EA6**\uFF0C\u4E0D\u80FD\u6309\u5185\u5BB9\u957F\u3002\u5B98\u65B9 .list \u53EA\u7ED9 min-width\uFF08\u6536\u7F29\u5230\u5185\u5BB9\u5BBD\uFF09\uFF0C
251
- \u800C\u6211\u4EEC\u662F align:'end' \u8D34\u53F3\u7F18\u5F00\u7684\u2014\u2014\u6BD4\u4F8B\u90A3\u4E00\u884C\u4E00\u51FA\u73B0\u5C31\u628A\u5217\u8868\u6491\u5BBD\u51E0\u5341\u50CF\u7D20\uFF0C\u5DE6\u7F18\u6574\u5757\u8DF3\u4E00\u4E0B
252
- \uFF082026-10-09 \u5B9E\u673A\uFF1A"\u70B9\u51FB\u6807\u8BB0\u540E\u6574\u4E2A div \u4E25\u91CD\u4F4D\u79FB"\uFF09\u3002\u540C\u4E00\u5904\u5185\u5BB9\u8D85\u51FA\u8FD8\u4F1A\u957F\u51FA\u6A2A\u5411\u6EDA\u52A8\u6761\uFF1A
253
- .scrollable .viewport \u5199\u4E86 overflow-y:auto\uFF0C\u6309 CSS \u53E3\u5F84 overflow-x \u5C31\u8BA1\u7B97\u6210 auto\u3002
254
- 256 = \u5217\u8868\u81EA\u8EAB 4px padding \xD7 2 + \u6700\u5BBD\u90A3\u4E00\u884C\u7684\u5185\u5BB9\uFF08\u56FE\u6807\u884C\u4E0E\u6BD4\u4F8B\u884C\u90FD\u5728 205 \u4E0A\u4E0B\uFF09\uFF0C
255
- \u4E2D\u82F1\u4E24\u5957\u8BED\u8A00\u90FD\u4E0D\u622A\u65AD\u3002 */
125
+ /* Fixed width: content-sized growth from the stepper row shifts the whole right-aligned menu. */
256
126
  .capital-watchlist-rows { width: 256px; }
257
- /* \u884C\u5185\u7684\u6BCF\u4E00\u9897\u6309\u94AE\u90FD\u6309 border-box \u7B97\u5BBD\uFF1A\u5B98\u65B9 .item \u662F width:100% + padding 6px 8px \u800C**\u6CA1\u6709**
258
- \u58F0\u660E box-sizing\uFF08\u8FD9\u5957\u4E3B\u9898\u6CA1\u6709\u5168\u5C40 border-box \u91CD\u7F6E\uFF0C\u53EA\u6709 .list / .root \u81EA\u5DF1\u58F0\u660E\u4E86\uFF09\uFF0C\u4E8E\u662F\u5B83\u5929\u7136
259
- \u6BD4\u5217\u8868\u5185\u5BB9\u76D2\u5BBD 16px\u2014\u2014\u90A3 16px \u5C31\u662F\u4E0A\u9762\u90A3\u6761\u6A2A\u5411\u6EDA\u52A8\u6761\u7684\u53E6\u4E00\u534A\u3002
260
- \u9009\u62E9\u5668\u6839\u5728\u6211\u4EEC\u81EA\u5DF1\u6302\u5728 portal \u5217\u8868\u4E0A\u7684\u7C7B\uFF0C\u6240\u4EE5\u591F\u5F97\u7740\uFF08\u540E\u4EE3\u94FE\u6CA1\u6709\u79BB\u5F00\u8FD9\u5F20\u5217\u8868\uFF09\u3002 */
127
+ /* Theme has no global border-box reset; the official item padding would overflow the list. */
261
128
  .capital-watchlist-rows button { box-sizing: border-box; }
262
- `;function Qt(){let e=globalThis.document;if(!e||typeof e.createElement!="function"||e.querySelector(`style[data-${D}]`))return;let a=e.createElement("style");a.setAttribute(`data-${D}`,""),a.textContent=qt;let t=e.head??e.body;if(!(t===void 0||typeof t.appendChild!="function"))return t.appendChild(a),()=>a.remove()}async function w(e,{query:a,body:t,signal:s}={}){let i=a!==void 0?`${j}${e}?${a}`:`${j}${e}`,d=t===void 0?{method:"GET",cache:"no-store",credentials:"same-origin",signal:s}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t),credentials:"same-origin",signal:s},n=await fetch(i,d),c=await n.text(),o={};try{o=c.length>0?JSON.parse(c):{}}catch{o={}}if(n.ok===!0&&o.ok===!0)return o;let p=typeof o.code=="string"&&o.code.length>0?o.code:n.status===401||n.status===403?"unauthorized":"fuyao_unavailable",h=new Error(p);throw h.code=p,h.candidates=o.candidates,h.limit=o.limit,h}var q=()=>({open:!1,loading:!1,refreshing:!1,searching:!1,items:[],candidates:[],truncated:!1,marketFilter:"all",query:"",dropdownOpen:!1,rowMenu:null,pendingRemove:null,refreshed_at:null,error:null,searchError:null,searchPartial:null,addError:null,loadError:null,failures:{},composing:!1,pendingSearch:!1}),E=class{constructor(){this.store=xt(q()),this.searchController=null,this.timer=null,this.pending=null,this.lastQuery=null,this.holdingOps=new Map}get state(){return this.store}get snapshot(){return this.store.getSnapshot()}patch(a){this.store.update(t=>Object.assign(t,a))}open(){this.patch({...q(),open:!0,loading:!0}),this.load().then(()=>this.refresh(),()=>this.patch({loading:!1}))}close(){this.timer!==null&&clearTimeout(this.timer),this.searchController!==null&&this.searchController.abort(),this.lastQuery=null,this.patch({open:!1,rowMenu:null,composing:!1,pendingSearch:!1}),this.holdingOps.clear()}async load(){try{let a=await w("/list");this.holdingOps.clear(),this.patch({items:v(a.items)??[],seeded_at:a.seeded_at,loading:!1,loadError:null})}catch(a){throw this.patch({loading:!1,loadError:{code:a.code??"fuyao_unavailable"}}),a}}refresh(){if(this.pending!==null)return this.pending;this.patch({refreshing:!0});let a=w("/refresh",{body:{}}).then(t=>{let s={};for(let n of t.failures??[])s[n.thscode]=n.code;let i=v(t.items),d=i??this.snapshot.items;i!==null&&this.holdingOps.clear(),this.patch({items:d,refreshed_at:t.refreshed_at??this.snapshot.refreshed_at,failures:s,error:t.error?{code:t.error.code,partial:d.length>0&&d.some(n=>s[n.thscode]===void 0)}:null})}).catch(t=>{this.patch({error:{code:t.code??"fuyao_unavailable",partial:this.snapshot.items.some(s=>s.quote!==null)}})}).finally(()=>{this.patch({refreshing:!1}),this.pending=null});return this.pending=a,a}onQueryChange(a,t){let s=a.trim(),i=t===void 0?this.snapshot.composing===!0:t===!0;if(this.patch({query:a,searchError:null,composing:i,dropdownOpen:s.length>0}),this.timer!==null&&clearTimeout(this.timer),s.length===0){this.searchController!==null&&this.searchController.abort(),this.lastQuery=null,this.patch({candidates:[],truncated:!1,searching:!1,pendingSearch:!1});return}s===this.lastQuery&&this.snapshot.pendingSearch===!1||(this.patch({candidates:[],truncated:!1,pendingSearch:!i}),i!==!0&&(this.timer=setTimeout(()=>this.search(s),Ht)))}beginComposition(){this.timer!==null&&clearTimeout(this.timer),this.patch({composing:!0})}endComposition(a){this.onQueryChange(a,!1)}hideDropdown(){this.patch({dropdownOpen:!1})}setMarketFilter(a){B.some(t=>t.id===a)&&this.patch({marketFilter:a})}toggleRowMenu(a){this.patch({rowMenu:this.snapshot.rowMenu===a?null:a})}closeRowMenu(){this.snapshot.rowMenu!==null&&this.patch({rowMenu:null})}setPendingRemove(a){this.patch({pendingRemove:a??null})}replaceRow(a){let[t]=v([a]);t===void 0||typeof t?.thscode!="string"||this.patch({items:this.snapshot.items.map(s=>s.thscode===t.thscode?t:s)})}async search(a){this.lastQuery=a,this.searchController!==null&&this.searchController.abort();let t=new AbortController;this.searchController=t,this.patch({searching:!0,searchError:null,searchPartial:null});let s=()=>this.snapshot.query.trim()===a;try{let i=await w("/search",{query:`q=${encodeURIComponent(a)}`,signal:t.signal});if(!s()){this.patch({searching:!1});return}this.patch({candidates:v(i.items)??[],truncated:i.truncated===!0,searching:!1,pendingSearch:!1,searchPartial:Array.isArray(i.partial)&&i.partial.length>0?i.partial:null})}catch(i){if(i.name==="AbortError"||(this.lastQuery===a&&(this.lastQuery=null),!s()))return;this.patch({candidates:[],truncated:!1,searching:!1,pendingSearch:!1,searchError:{code:i.code??"fuyao_unavailable"},searchPartial:null})}}async add(a){try{await w("/add",{body:{thscode:a.thscode}})}catch(s){this.patch({addError:{code:s.code??"fuyao_unavailable",candidates:s.candidates,limit:s.limit}}),s.candidates!==void 0&&this.patch({candidates:s.candidates,truncated:!1});return}this.patch({addError:null,candidates:this.snapshot.candidates.map(s=>s.thscode===a.thscode?{...s,in_list:!0}:s)}),await this.load().catch(()=>{}),await this.refresh();let t=this.snapshot.items.find(s=>s.thscode===a.thscode);t!==void 0&&t.quote===null&&this.snapshot.failures[a.thscode]===void 0&&await this.refresh()}async remove(a){let t=this.snapshot.items;this.patch({items:t.filter(s=>s.thscode!==a),rowMenu:null});try{await w("/remove",{body:{thscode:a}}),this.snapshot.addError?.code==="list_full"&&this.patch({addError:null})}catch{this.patch({items:t})}}async pin(a){let t=this.snapshot.items,s=t.find(i=>i.thscode===a);if(s!==void 0){this.patch({items:[s,...t.filter(i=>i.thscode!==a)],rowMenu:null});try{let i=await w("/pin",{body:{thscode:a}});Array.isArray(i.items)&&this.patch({items:v(i.items)})}catch{let i=this.snapshot.items,d=t.map(c=>i.find(o=>o.thscode===c.thscode)).filter(Boolean),n=new Set(d.map(c=>c.thscode));this.patch({items:[...d,...i.filter(c=>!n.has(c.thscode))]})}}}async writeHolding(a,t,s){let i=this.snapshot.items.find(o=>o.thscode===a);if(i===void 0)return;let d=this.holdingOps.get(a)??{seq:0,baseline:i};this.holdingOps.set(a,d);let n=++d.seq;this.patch({items:this.snapshot.items.map(o=>o.thscode===a?s(o):o)});let c=()=>this.holdingOps.get(a)!==d||d.seq!==n;try{let o=await w("/holding",{body:t});if(c())return;this.replaceRow(o.item),d.baseline=o.item??s(i),this.holdingOps.delete(a)}catch{if(c())return;this.replaceRow(d.baseline),this.holdingOps.delete(a)}}markHolding(a,t){return this.writeHolding(a,{thscode:a,weight_pct:t},s=>({...s,holding:{weight_pct:t,marked_at:Date.now()}}))}clearHolding(a){return this.writeHolding(a,{thscode:a,clear:!0},t=>{let s={...t};return delete s.holding,s})}stepHolding(a,t){let s=this.snapshot.items,i=s.find(n=>n.thscode===a)?.holding?.weight_pct;if(typeof i!="number"&&t<0)return;let d=Math.min(W(s,a),Math.max(0,(typeof i=="number"?i:0)+t));if(d!==i)return this.markHolding(a,d)}async copyToClipboard(){let a=this.snapshot.items.map(t=>[t.thscode,T(t.name),t.asset_type,t.quote?.price??"",t.quote?.change_pct??"",t.quote?.captured_at??""].join(" ")).join(`
263
- `);return await navigator.clipboard.writeText(a),a}dispose(){this.timer!==null&&clearTimeout(this.timer),this.searchController!==null&&this.searchController.abort()}};function K(e){if(typeof e!="number"||!Number.isFinite(e))return"";let a=new Date(e),t=s=>String(s).padStart(2,"0");return`${t(a.getMonth()+1)}-${t(a.getDate())} ${t(a.getHours())}:${t(a.getMinutes())}`}function Q({assetType:e,t:a}){return l("span",{className:`capital-watchlist-tag ${Ut[e]??"capital-watchlist-tag-cn"}`},Lt(e,a))}function Wt(e,a,t){let s=T(e.name);return`${a(`${t}PromptPrefix`)}${s} (${e.thscode} \xB7 ${jt(e.asset_type,a)})${a(`${t}PromptSuffix`)}`}function Bt({quote:e,failureCode:a,refreshing:t,t:s}){let i=a!==void 0;if(e==null)return t===!0?l("div",{className:"capital-watchlist-quote"},l("span",{className:"capital-watchlist-skeleton capital-watchlist-skeleton-price"}),l("span",{className:"capital-watchlist-skeleton capital-watchlist-skeleton-change"})):i?l("div",{className:"capital-watchlist-quote",title:s(`error.${a}`)},l("div",{className:"capital-watchlist-price capital-watchlist-quotefailed"},"\u2014")):l("div",{className:"capital-watchlist-quote"},l("div",{className:"capital-watchlist-price"},s("notRefreshed")));let d=typeof e.change_pct=="number"&&Number.isFinite(e.change_pct),n=d?`${e.change_pct>0?"+":""}${e.change_pct.toFixed(2)}%`:"\u2014",c=i?"capital-watchlist-stale":d?e.change_pct>0?"capital-watchlist-up":e.change_pct<0?"capital-watchlist-down":"capital-watchlist-flat":"capital-watchlist-nodata",o=typeof e.source_time=="string"&&e.source_time.length>0?`${s("exchangeTime")} ${e.source_time}`:"",p=[];return i?p.push(`${s(`error.${a}`)} \xB7 ${s("stale")} ${K(e.captured_at)}`):d||p.push(s("noChangePct")),o.length>0&&p.push(o),l("div",{className:"capital-watchlist-quote",title:p.length===0?void 0:p.join(" \xB7 ")},l("div",{className:i?"capital-watchlist-price capital-watchlist-stale":"capital-watchlist-price"},e.price.toFixed(2)),l("div",{className:`capital-watchlist-change ${c}`},n))}function Kt(e,a){if(a.code!=="list_full")return e(`error.${a.code}`);let t=a.limit;return typeof t!="number"||!Number.isFinite(t)?e("error.list_full_noMax"):e("error.list_full").replace("{max}",String(t))}function Yt(e,a){let t=e?.weight_pct;return t==null?a("holdingName"):`${a("holdingName")} ${t}%`}function Gt(e,a){let t=`${e.name} ${e.ticker}`;return e.holding===null||e.holding===void 0?t:`${t} \xB7 ${Yt(e.holding,a)}`}function Xt({useDialog:e,surface:a,t,inputActions:s}){let i=e(r=>r),[d,n]=M(!1),[c,o]=M(null),p=i.pendingRemove??null;if(bt(()=>()=>a.dispose(),[a]),!i.open)return null;let h=i.dropdownOpen===!0,g=p!==null,Y=r=>{if(r.key==="Escape"){if(g){r.stopPropagation(),a.setPendingRemove(null);return}h&&(r.stopPropagation(),a.hideDropdown())}},G=r=>{if(!h)return;let m=r.relatedTarget;m!=null&&r.currentTarget?.contains?.(m)===!0||a.hideDropdown()},b=i.error,X=b==null?null:l("p",{className:"capital-watchlist-notice",role:"alert","data-code":b.code},`${t(`error.${b.code}`)}${b.partial===!0?t("errorSuffix"):""}`),A=(r,m)=>{s.insertText(Wt(r,t,m),s.captureInsertion())===!0&&a.close()},y=i.marketFilter==="all"?i.candidates:i.candidates.filter(r=>U(r)===i.marketFilter),$={all:i.candidates.length,cn:0,hk:0,us:0};for(let r of i.candidates)$[U(r)]+=1;let J=i.candidates.length===0?null:l("div",{className:"capital-watchlist-filter",role:"group","aria-label":t("filterLabel")},B.map(r=>l("button",{key:r.id,type:"button",className:"capital-watchlist-filterbtn","aria-pressed":i.marketFilter===r.id,onClick:()=>a.setMarketFilter(r.id)},l("span",{className:"capital-watchlist-filterlabel"},r.id==="all"?t("filterAll"):r.label),l("span",{className:"capital-watchlist-filtercount"},String($[r.id]))))),V=h?l("div",{className:"capital-watchlist-dropdown","aria-label":t("title"),"data-menu-material":"translucent"},J,l("div",{className:"capital-watchlist-options",role:"listbox","aria-label":t("title")},y.map(r=>l("button",{key:r.thscode,type:"button",role:"option",className:"capital-watchlist-option",title:r.name,"aria-disabled":r.in_list===!0||c===r.thscode,onClick:()=>{r.in_list===!0||c===r.thscode||(n(!0),o(r.thscode),a.add(r).finally(()=>{n(!1),o(null)}))}},l("span",{className:"capital-watchlist-optionmain"},l("span",{className:"capital-watchlist-optionname"},r.name),l("span",{className:"capital-watchlist-codeline"},l("span",{className:"capital-watchlist-optioncode"},r.thscode),l(Q,{assetType:r.asset_type,t}))),l("span",{className:"capital-watchlist-addbtn","data-state":r.in_list===!0?"added":"idle"},r.in_list===!0?t("added"):t("add")))),i.truncated===!0&&y.length>0?l("div",{className:"capital-watchlist-hint capital-watchlist-endhint"},t("truncated")):null),i.composing===!0?l("div",{className:"capital-watchlist-hint"},t("composingHint")):i.searching===!0||i.pendingSearch===!0?l("div",{className:"capital-watchlist-hint"},t("searching")):i.searchError!==null&&i.searchError!==void 0?l("div",{className:"capital-watchlist-hint capital-watchlist-searcherror",role:"alert","data-code":i.searchError.code},t(`error.${i.searchError.code}`)):i.candidates.length===0?l("div",{className:"capital-watchlist-hint"},t("noHit")):y.length===0?l("div",{className:"capital-watchlist-hint","data-filter":i.marketFilter},t("filterNoHit")):null,...(i.searchPartial??[]).map(r=>l("div",{key:`partial-${r.market}`,className:"capital-watchlist-hint capital-watchlist-searcherror",role:"status","data-market":r.market,"data-code":r.code},`${t(`partial.${r.market}`)}${t(`error.${r.code}`)}`))):null,Z=i.items.length===0?null:l("div",{className:"capital-watchlist-grid capital-watchlist-head"},l("span",null,t("colName")),l("span",{className:"capital-watchlist-quote"},t("colQuote")),l("span",{className:"capital-watchlist-headaction"},t("colAction"))),tt=i.loadError!==null&&i.loadError!==void 0?l("p",{className:"capital-watchlist-empty capital-watchlist-loaderror",role:"alert","data-code":i.loadError.code},t(`error.${i.loadError.code}`)):l("p",{className:"capital-watchlist-empty"},t("empty")),at=i.loading?l("p",{className:"capital-watchlist-empty"},t("loading")):i.items.length===0?tt:l("div",{className:h?"capital-watchlist-list capital-watchlist-list-open":"capital-watchlist-list"},i.items.map((r,m)=>{let x=r.holding!==null&&r.holding!==void 0,u=r.holding?.weight_pct,it=F(r)||x,k=W(i.items,r.thscode),lt=!x||u===null||u===void 0||u<=0,rt=(typeof u=="number"?u:0)+C>k;return l("div",{key:r.thscode,className:"capital-watchlist-grid capital-watchlist-row","data-thscode":r.thscode},l("span",{className:"capital-watchlist-namewrap"},l("span",{className:x?"capital-watchlist-name capital-watchlist-name-held":"capital-watchlist-name",title:Gt(r,t)},r.name),l("span",{className:"capital-watchlist-codeline"},l("span",{className:"capital-watchlist-code"},r.ticker),l(Q,{assetType:r.asset_type,t}))),l(Bt,{quote:r.quote,failureCode:i.failures[r.thscode],refreshing:i.refreshing,t}),l("span",{className:"capital-watchlist-rowactions"},l("button",{type:"button",className:"capital-watchlist-predict",disabled:d,title:t("predictTip"),"aria-label":`${t("predict")} ${r.name}`,onClick:()=>A(r,"predict")},l(Nt,{size:14})),l("button",{type:"button",className:"capital-watchlist-review",disabled:d,title:t("reviewTip"),"aria-label":`${t("review")} ${r.name}`,onClick:()=>A(r,"review")},l(St,{size:14})),l(At,{open:i.rowMenu===r.thscode,anchor:l("button",{type:"button",className:"capital-watchlist-more",disabled:d,title:t("more"),"aria-label":`${t("more")} ${r.name}`,"aria-haspopup":"menu","aria-expanded":i.rowMenu===r.thscode,onClick:()=>a.toggleRowMenu(r.thscode)},l(kt,{size:14})),items:[{id:"pin",label:t("pin"),icon:l(_t,{size:14}),disabled:m===0}],children:[...it?[l("div",{key:"holding-check",role:"group","aria-label":t("holdingName"),className:"capital-watchlist-checkrow"},l("span",{className:"capital-watchlist-checkicon","aria-hidden":"true"},l(yt,{size:14})),l("span",{className:"capital-watchlist-checklabel"},t("holdingName")),l(It,{checked:x,disabled:d,label:t("holdingName"),onChange:N=>N?a.markHolding(r.thscode,null):a.clearHolding(r.thscode)}))]:[],...x&&F(r)?[l("div",{key:"holding-step",className:"capital-watchlist-stepper",role:"group","aria-label":t("holdingStepper")},l("span",{className:"capital-watchlist-stepperlabel"},t("holdingWeightLabel")),l("span",{className:"capital-watchlist-stepperline"},l("button",{type:"button",className:"capital-watchlist-stepperbtn","aria-label":t("holdingStepDown"),disabled:lt,onClick:()=>a.stepHolding(r.thscode,-C)},"\u2212"),l("span",{className:typeof u=="number"?"capital-watchlist-stepperreadout":"capital-watchlist-stepperreadout capital-watchlist-stepperplaceholder",role:"status"},typeof u=="number"?`${u}%`:`0~${k}`),l("button",{type:"button",className:"capital-watchlist-stepperbtn","aria-label":t("holdingStepUp"),title:`0~${k}`,disabled:rt,onClick:()=>a.stepHolding(r.thscode,C)},"+")))]:[],l($t,{key:"remove",danger:!0,separatorBefore:!0,icon:l(Tt,{size:14}),onSelect:()=>{a.closeRowMenu(),a.setPendingRemove(r)}},t("remove"))],onSelect:N=>{N==="pin"&&(a.closeRowMenu(),a.pin(r.thscode))},onClose:()=>a.closeRowMenu(),align:"end",portal:!0,listClassName:"capital-watchlist-rows",className:"capital-watchlist-actions"})))})),et=l("div",{className:g?"capital-watchlist-confirm capital-watchlist-confirm-open":"capital-watchlist-confirm","aria-hidden":g?void 0:"true"},l("div",{className:"capital-watchlist-confirmbox",role:g?"alertdialog":void 0,"aria-label":t("confirmTitle")},l("div",{className:"capital-watchlist-confirmtitle"},t("confirmTitle")),g?l("p",{className:"capital-watchlist-confirmdesc"},t("confirmDescPrefix"),l("strong",null,`${p.name} \xB7 ${p.ticker}`),t("confirmDescSuffix")):null,l("div",{className:"capital-watchlist-confirmactions"},l("button",{type:"button",className:"capital-watchlist-confirmbtn",onClick:()=>a.setPendingRemove(null)},t("confirmCancel")),l("button",{type:"button",className:"capital-watchlist-confirmbtn capital-watchlist-confirmdanger",onClick:()=>{let r=p;a.setPendingRemove(null),r!==null&&a.remove(r.thscode)}},t("confirmOk")))));return l(Pt,{open:!0,onClose:()=>a.close(),title:t("title"),headless:!0,shortcutModal:"watchlist",className:"capital-watchlist-dialog"},l("div",{className:"capital-watchlist-card",onKeyDown:Y},l("div",{className:"capital-watchlist-header"},l("h2",{className:"capital-watchlist-title"},t("title")),l("button",{type:"button",className:"capital-watchlist-close","aria-label":t("close"),onClick:()=>a.close()},l(O,{size:14}))),l("div",{className:"capital-watchlist-search",onBlur:G},l("div",{className:"capital-watchlist-field"},l("span",{className:"capital-watchlist-searchicon"},l(Et,{size:16})),l("input",{className:"capital-watchlist-input","data-modal-autofocus":!0,value:i.query,placeholder:t("searchPlaceholder"),onChange:r=>a.onQueryChange(r.target.value,r.isComposing),onCompositionStart:()=>a.beginComposition(),onCompositionEnd:r=>a.endComposition(r.target.value)}),i.query.length>0?l("button",{type:"button",className:"capital-watchlist-clear",title:t("clearInput"),"aria-label":t("clearInput"),onMouseDown:r=>r.preventDefault(),onClick:()=>a.onQueryChange("",!1)},l(O,{size:12})):null),V),i.addError!==null&&i.addError!==void 0?l("p",{className:"capital-watchlist-adderror",role:"status","data-code":i.addError.code},Kt(t,i.addError)):null,Z,at,l("div",{className:"capital-watchlist-footer"},l("div",{className:"capital-watchlist-footcol"},l("button",{type:"button",className:"capital-watchlist-refresh",disabled:i.refreshing||d,onClick:()=>{a.refresh()}},l(Ct,{size:14}),i.refreshing?t("refreshing"):t("refresh")),X),l("span",{className:"capital-watchlist-updated"},`${t("updated")} ${i.refreshed_at===null||i.refreshed_at===void 0?t("notRefreshed"):K(i.refreshed_at)}`)),et))}function Jt(e){e.effect(Qt,`${f}: styles`),e.effect(()=>e.locale.register(_,{zh:zt,en:Mt}),`${f}: dictionaries`);let a=new Map,t=n=>{let c=a.get(n);return c===void 0&&(c=new E,a.set(n,c)),c};e.effect(()=>()=>{for(let n of a.values())n.dispose();a.clear()},`${f}: per-session surfaces`);let s=n=>{let o=e.sessions?.list?.getSnapshot?.().byId?.[n]?.projectionValues?.agentPreset;return typeof o=="string"?o:void 0},i=new Set,d=n=>{let c=s(n);return c!==void 0?c===Rt:(i.has(n)||(i.add(n),Promise.resolve(e.sessions?.refreshProjections?.(n)).catch(()=>{})),!1)};e.slots.inject(L,()=>e.slots.register({name:L,id:"capital-watchlist-dialog",order:3,locale:_,inject:n=>{let c=t(n);return{hooks:{dialog:c.state},surface:c}}},Xt)),e.inject(["commandUi"],n=>{let c=e.locale.bind(_);n.effect(()=>n.commandUi.register({name:"watchlist",label:()=>c("command.label"),description:()=>c("command.description"),icon:vt,available:o=>d(o.sessionId),ui:{kind:"action",run:o=>{t(o.sessionId).open()}}}),`${f}: /watchlist contribution`)}),e.logger?.info?.(`${f}: \u5BA2\u6237\u7AEF\u534A\u8FB9\u5DF2\u6302\u8F7D\uFF08/watchlist \u83DC\u5355\u884C + \u81EA\u9009\u80A1\u5F39\u7A97\uFF09`)}exports.name=f;exports.inject=["slots","locale","commandUi","sessions"];exports.apply=Jt;
129
+ `;function Wt(){let e=globalThis.document;if(!e||typeof e.createElement!="function"||e.querySelector(`style[data-${L}]`))return;let a=e.createElement("style");a.setAttribute(`data-${L}`,""),a.textContent=qt;let t=e.head??e.body;if(!(t===void 0||typeof t.appendChild!="function"))return t.appendChild(a),()=>a.remove()}async function m(e,{query:a,body:t,signal:r}={}){let i=a!==void 0?`${j}${e}?${a}`:`${j}${e}`,d=t===void 0?{method:"GET",cache:"no-store",credentials:"same-origin",signal:r}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t),credentials:"same-origin",signal:r},n=await fetch(i,d),c=await n.text(),o={};try{o=c.length>0?JSON.parse(c):{}}catch{o={}}if(n.ok===!0&&o.ok===!0)return o;let p=typeof o.code=="string"&&o.code.length>0?o.code:n.status===401||n.status===403?"unauthorized":"fuyao_unavailable",h=new Error(p);throw h.code=p,h.candidates=o.candidates,h.limit=o.limit,h}var q=()=>({open:!1,loading:!1,refreshing:!1,searching:!1,items:[],candidates:[],truncated:!1,marketFilter:"all",query:"",dropdownOpen:!1,rowMenu:null,pendingRemove:null,refreshed_at:null,error:null,searchError:null,searchPartial:null,addError:null,loadError:null,failures:{},composing:!1,pendingSearch:!1}),E=class{constructor(){this.store=xt(q()),this.searchController=null,this.timer=null,this.pending=null,this.lastQuery=null,this.holdingOps=new Map}get state(){return this.store}get snapshot(){return this.store.getSnapshot()}patch(a){this.store.update(t=>Object.assign(t,a))}open(){this.patch({...q(),open:!0,loading:!0}),this.load().then(()=>this.refresh(),()=>this.patch({loading:!1}))}close(){this.timer!==null&&clearTimeout(this.timer),this.searchController!==null&&this.searchController.abort(),this.lastQuery=null,this.patch({open:!1,rowMenu:null,composing:!1,pendingSearch:!1}),this.holdingOps.clear()}async load(){try{let a=await m("/list");this.holdingOps.clear(),this.patch({items:y(a.items)??[],seeded_at:a.seeded_at,loading:!1,loadError:null})}catch(a){throw this.patch({loading:!1,loadError:{code:a.code??"fuyao_unavailable"}}),a}}refresh(){if(this.pending!==null)return this.pending;this.patch({refreshing:!0});let a=m("/refresh",{body:{}}).then(t=>{let r={};for(let n of t.failures??[])r[n.thscode]=n.code;let i=y(t.items),d=i??this.snapshot.items;i!==null&&this.holdingOps.clear(),this.patch({items:d,refreshed_at:t.refreshed_at??this.snapshot.refreshed_at,failures:r,error:t.error?{code:t.error.code,partial:d.length>0&&d.some(n=>r[n.thscode]===void 0)}:null})}).catch(t=>{this.patch({error:{code:t.code??"fuyao_unavailable",partial:this.snapshot.items.some(r=>r.quote!==null)}})}).finally(()=>{this.patch({refreshing:!1}),this.pending=null});return this.pending=a,a}onQueryChange(a,t){let r=a.trim(),i=t===void 0?this.snapshot.composing===!0:t===!0;if(this.patch({query:a,searchError:null,composing:i,dropdownOpen:r.length>0}),this.timer!==null&&clearTimeout(this.timer),r.length===0){this.searchController!==null&&this.searchController.abort(),this.lastQuery=null,this.patch({candidates:[],truncated:!1,searching:!1,pendingSearch:!1});return}r===this.lastQuery&&this.snapshot.pendingSearch===!1||(this.patch({candidates:[],truncated:!1,pendingSearch:!i}),i!==!0&&(this.timer=setTimeout(()=>this.search(r),Ht)))}beginComposition(){this.timer!==null&&clearTimeout(this.timer),this.patch({composing:!0})}endComposition(a){this.onQueryChange(a,!1)}hideDropdown(){this.patch({dropdownOpen:!1})}setMarketFilter(a){K.some(t=>t.id===a)&&this.patch({marketFilter:a})}toggleRowMenu(a){this.patch({rowMenu:this.snapshot.rowMenu===a?null:a})}closeRowMenu(){this.snapshot.rowMenu!==null&&this.patch({rowMenu:null})}setPendingRemove(a){this.patch({pendingRemove:a??null})}replaceRow(a){let[t]=y([a]);t===void 0||typeof t?.thscode!="string"||this.patch({items:this.snapshot.items.map(r=>r.thscode===t.thscode?t:r)})}async search(a){this.lastQuery=a,this.searchController!==null&&this.searchController.abort();let t=new AbortController;this.searchController=t,this.patch({searching:!0,searchError:null,searchPartial:null});let r=()=>this.snapshot.query.trim()===a;try{let i=await m("/search",{query:`q=${encodeURIComponent(a)}`,signal:t.signal});if(!r()){this.patch({searching:!1});return}this.patch({candidates:y(i.items)??[],truncated:i.truncated===!0,searching:!1,pendingSearch:!1,searchPartial:Array.isArray(i.partial)&&i.partial.length>0?i.partial:null})}catch(i){if(i.name==="AbortError"||(this.lastQuery===a&&(this.lastQuery=null),!r()))return;this.patch({candidates:[],truncated:!1,searching:!1,pendingSearch:!1,searchError:{code:i.code??"fuyao_unavailable"},searchPartial:null})}}async add(a){try{await m("/add",{body:{thscode:a.thscode}})}catch(r){this.patch({addError:{code:r.code??"fuyao_unavailable",candidates:r.candidates,limit:r.limit}}),r.candidates!==void 0&&this.patch({candidates:r.candidates,truncated:!1});return}this.patch({addError:null,candidates:this.snapshot.candidates.map(r=>r.thscode===a.thscode?{...r,in_list:!0}:r)}),await this.load().catch(()=>{}),await this.refresh();let t=this.snapshot.items.find(r=>r.thscode===a.thscode);t!==void 0&&t.quote===null&&this.snapshot.failures[a.thscode]===void 0&&await this.refresh()}async remove(a){let t=this.snapshot.items;this.patch({items:t.filter(r=>r.thscode!==a),rowMenu:null});try{await m("/remove",{body:{thscode:a}}),this.snapshot.addError?.code==="list_full"&&this.patch({addError:null})}catch{this.patch({items:t})}}async pin(a){let t=this.snapshot.items,r=t.find(i=>i.thscode===a);if(r!==void 0){this.patch({items:[r,...t.filter(i=>i.thscode!==a)],rowMenu:null});try{let i=await m("/pin",{body:{thscode:a}});Array.isArray(i.items)&&this.patch({items:y(i.items)})}catch{let i=this.snapshot.items,d=t.map(c=>i.find(o=>o.thscode===c.thscode)).filter(Boolean),n=new Set(d.map(c=>c.thscode));this.patch({items:[...d,...i.filter(c=>!n.has(c.thscode))]})}}}async writeHolding(a,t,r){let i=this.snapshot.items.find(o=>o.thscode===a);if(i===void 0)return;let d=this.holdingOps.get(a)??{seq:0,baseline:i};this.holdingOps.set(a,d);let n=++d.seq;this.patch({items:this.snapshot.items.map(o=>o.thscode===a?r(o):o)});let c=()=>this.holdingOps.get(a)!==d||d.seq!==n;try{let o=await m("/holding",{body:t});if(c())return;this.replaceRow(o.item),d.baseline=o.item??r(i),this.holdingOps.delete(a)}catch{if(c())return;this.replaceRow(d.baseline),this.holdingOps.delete(a)}}markHolding(a,t){return this.writeHolding(a,{thscode:a,weight_pct:t},r=>({...r,holding:{weight_pct:t,marked_at:Date.now()}}))}clearHolding(a){return this.writeHolding(a,{thscode:a,clear:!0},t=>{let r={...t};return delete r.holding,r})}stepHolding(a,t){let r=this.snapshot.items,i=r.find(n=>n.thscode===a)?.holding?.weight_pct;if(typeof i!="number"&&t<0)return;let d=Math.min(Q(r,a),Math.max(0,(typeof i=="number"?i:0)+t));if(d!==i)return this.markHolding(a,d)}async copyToClipboard(){let a=this.snapshot.items.map(t=>[t.thscode,A(t.name),t.asset_type,t.quote?.price??"",t.quote?.change_pct??"",t.quote?.captured_at??""].join(" ")).join(`
130
+ `);return await navigator.clipboard.writeText(a),a}dispose(){this.timer!==null&&clearTimeout(this.timer),this.searchController!==null&&this.searchController.abort()}};function B(e){if(typeof e!="number"||!Number.isFinite(e))return"";let a=new Date(e),t=r=>String(r).padStart(2,"0");return`${t(a.getMonth()+1)}-${t(a.getDate())} ${t(a.getHours())}:${t(a.getMinutes())}`}function W({assetType:e,t:a}){return l("span",{className:`capital-watchlist-tag ${Ut[e]??"capital-watchlist-tag-cn"}`},Dt(e,a))}function Qt(e,a,t){let r=A(e.name);return`${a(`${t}PromptPrefix`)}${r} (${e.thscode} \xB7 ${jt(e.asset_type,a)})${a(`${t}PromptSuffix`)}`}function Kt({quote:e,failureCode:a,refreshing:t,t:r}){let i=a!==void 0;if(e==null)return t===!0?l("div",{className:"capital-watchlist-quote"},l("span",{className:"capital-watchlist-skeleton capital-watchlist-skeleton-price"}),l("span",{className:"capital-watchlist-skeleton capital-watchlist-skeleton-change"})):i?l("div",{className:"capital-watchlist-quote",title:r(`error.${a}`)},l("div",{className:"capital-watchlist-price capital-watchlist-quotefailed"},"\u2014")):l("div",{className:"capital-watchlist-quote"},l("div",{className:"capital-watchlist-price"},r("notRefreshed")));let d=typeof e.change_pct=="number"&&Number.isFinite(e.change_pct),n=d?`${e.change_pct>0?"+":""}${e.change_pct.toFixed(2)}%`:"\u2014",c=i?"capital-watchlist-stale":d?e.change_pct>0?"capital-watchlist-up":e.change_pct<0?"capital-watchlist-down":"capital-watchlist-flat":"capital-watchlist-nodata",o=typeof e.source_time=="string"&&e.source_time.length>0?`${r("exchangeTime")} ${e.source_time}`:"",p=[];return i?p.push(`${r(`error.${a}`)} \xB7 ${r("stale")} ${B(e.captured_at)}`):d||p.push(r("noChangePct")),o.length>0&&p.push(o),l("div",{className:"capital-watchlist-quote",title:p.length===0?void 0:p.join(" \xB7 ")},l("div",{className:i?"capital-watchlist-price capital-watchlist-stale":"capital-watchlist-price"},e.price.toFixed(2)),l("div",{className:`capital-watchlist-change ${c}`},n))}function Bt(e,a){if(a.code!=="list_full")return e(`error.${a.code}`);let t=a.limit;return typeof t!="number"||!Number.isFinite(t)?e("error.list_full_noMax"):e("error.list_full").replace("{max}",String(t))}function Yt(e,a){let t=e?.weight_pct;return t==null?a("holdingName"):`${a("holdingName")} ${t}%`}function Gt(e,a){let t=`${e.name} ${e.ticker}`;return e.holding===null||e.holding===void 0?t:`${t} \xB7 ${Yt(e.holding,a)}`}function Xt({useDialog:e,surface:a,t,inputActions:r}){let i=e(s=>s),[d,n]=M(!1),[c,o]=M(null),p=i.pendingRemove??null;if(bt(()=>()=>a.dispose(),[a]),!i.open)return null;let h=i.dropdownOpen===!0,g=p!==null,Y=s=>{if(s.key==="Escape"){if(g){s.stopPropagation(),a.setPendingRemove(null);return}h&&(s.stopPropagation(),a.hideDropdown())}},G=s=>{if(!h)return;let w=s.relatedTarget;w!=null&&s.currentTarget?.contains?.(w)===!0||a.hideDropdown()},b=i.error,X=b==null?null:l("p",{className:"capital-watchlist-notice",role:"alert","data-code":b.code},`${t(`error.${b.code}`)}${b.partial===!0?t("errorSuffix"):""}`),$=(s,w)=>{r.insertText(Qt(s,t,w),r.captureInsertion())===!0&&a.close()},v=i.marketFilter==="all"?i.candidates:i.candidates.filter(s=>U(s)===i.marketFilter),T={all:i.candidates.length,cn:0,hk:0,us:0};for(let s of i.candidates)T[U(s)]+=1;let J=i.candidates.length===0?null:l("div",{className:"capital-watchlist-filter",role:"group","aria-label":t("filterLabel")},K.map(s=>l("button",{key:s.id,type:"button",className:"capital-watchlist-filterbtn","aria-pressed":i.marketFilter===s.id,onClick:()=>a.setMarketFilter(s.id)},l("span",{className:"capital-watchlist-filterlabel"},s.id==="all"?t("filterAll"):s.label),l("span",{className:"capital-watchlist-filtercount"},String(T[s.id]))))),V=h?l("div",{className:"capital-watchlist-dropdown","aria-label":t("title"),"data-menu-material":"translucent"},J,l("div",{className:"capital-watchlist-options",role:"listbox","aria-label":t("title")},v.map(s=>l("button",{key:s.thscode,type:"button",role:"option",className:"capital-watchlist-option",title:s.name,"aria-disabled":s.in_list===!0||c===s.thscode,onClick:()=>{s.in_list===!0||c===s.thscode||(n(!0),o(s.thscode),a.add(s).finally(()=>{n(!1),o(null)}))}},l("span",{className:"capital-watchlist-optionmain"},l("span",{className:"capital-watchlist-optionname"},s.name),l("span",{className:"capital-watchlist-codeline"},l("span",{className:"capital-watchlist-optioncode"},s.thscode),l(W,{assetType:s.asset_type,t}))),l("span",{className:"capital-watchlist-addbtn","data-state":s.in_list===!0?"added":"idle"},s.in_list===!0?t("added"):t("add")))),i.truncated===!0&&v.length>0?l("div",{className:"capital-watchlist-hint capital-watchlist-endhint"},t("truncated")):null),i.composing===!0?l("div",{className:"capital-watchlist-hint"},t("composingHint")):i.searching===!0||i.pendingSearch===!0?l("div",{className:"capital-watchlist-hint"},t("searching")):i.searchError!==null&&i.searchError!==void 0?l("div",{className:"capital-watchlist-hint capital-watchlist-searcherror",role:"alert","data-code":i.searchError.code},t(`error.${i.searchError.code}`)):i.candidates.length===0?l("div",{className:"capital-watchlist-hint"},t("noHit")):v.length===0?l("div",{className:"capital-watchlist-hint","data-filter":i.marketFilter},t("filterNoHit")):null,...(i.searchPartial??[]).map(s=>l("div",{key:`partial-${s.market}`,className:"capital-watchlist-hint capital-watchlist-searcherror",role:"status","data-market":s.market,"data-code":s.code},`${t(`partial.${s.market}`)}${t(`error.${s.code}`)}`))):null,Z=i.items.length===0?null:l("div",{className:"capital-watchlist-grid capital-watchlist-head"},l("span",null,t("colName")),l("span",{className:"capital-watchlist-quote"},t("colQuote")),l("span",{className:"capital-watchlist-headaction"},t("colAction"))),tt=i.loadError!==null&&i.loadError!==void 0?l("p",{className:"capital-watchlist-empty capital-watchlist-loaderror",role:"alert","data-code":i.loadError.code},t(`error.${i.loadError.code}`)):l("p",{className:"capital-watchlist-empty"},t("empty")),at=i.loading?l("p",{className:"capital-watchlist-empty"},t("loading")):i.items.length===0?tt:l("div",{className:h?"capital-watchlist-list capital-watchlist-list-open":"capital-watchlist-list"},i.items.map((s,w)=>{let x=s.holding!==null&&s.holding!==void 0,u=s.holding?.weight_pct,it=F(s)||x,k=Q(i.items,s.thscode),lt=!x||u===null||u===void 0||u<=0,st=(typeof u=="number"?u:0)+C>k;return l("div",{key:s.thscode,className:"capital-watchlist-grid capital-watchlist-row","data-thscode":s.thscode},l("span",{className:"capital-watchlist-namewrap"},l("span",{className:x?"capital-watchlist-name capital-watchlist-name-held":"capital-watchlist-name",title:Gt(s,t)},s.name),l("span",{className:"capital-watchlist-codeline"},l("span",{className:"capital-watchlist-code"},s.ticker),l(W,{assetType:s.asset_type,t}))),l(Kt,{quote:s.quote,failureCode:i.failures[s.thscode],refreshing:i.refreshing,t}),l("span",{className:"capital-watchlist-rowactions"},l("button",{type:"button",className:"capital-watchlist-predict",disabled:d,title:t("predictTip"),"aria-label":`${t("predict")} ${s.name}`,onClick:()=>$(s,"predict")},l(Nt,{size:14})),l("button",{type:"button",className:"capital-watchlist-review",disabled:d,title:t("reviewTip"),"aria-label":`${t("review")} ${s.name}`,onClick:()=>$(s,"review")},l(St,{size:14})),l($t,{open:i.rowMenu===s.thscode,anchor:l("button",{type:"button",className:"capital-watchlist-more",disabled:d,title:t("more"),"aria-label":`${t("more")} ${s.name}`,"aria-haspopup":"menu","aria-expanded":i.rowMenu===s.thscode,onClick:()=>a.toggleRowMenu(s.thscode)},l(kt,{size:14})),items:[{id:"pin",label:t("pin"),icon:l(_t,{size:14}),disabled:w===0}],children:[...it?[l("div",{key:"holding-check",role:"group","aria-label":t("holdingName"),className:"capital-watchlist-checkrow"},l("span",{className:"capital-watchlist-checkicon","aria-hidden":"true"},l(vt,{size:14})),l("span",{className:"capital-watchlist-checklabel"},t("holdingName")),l(Rt,{checked:x,disabled:d,label:t("holdingName"),onChange:N=>N?a.markHolding(s.thscode,null):a.clearHolding(s.thscode)}))]:[],...x&&F(s)?[l("div",{key:"holding-step",className:"capital-watchlist-stepper",role:"group","aria-label":t("holdingStepper")},l("span",{className:"capital-watchlist-stepperlabel"},t("holdingWeightLabel")),l("span",{className:"capital-watchlist-stepperline"},l("button",{type:"button",className:"capital-watchlist-stepperbtn","aria-label":t("holdingStepDown"),disabled:lt,onClick:()=>a.stepHolding(s.thscode,-C)},"\u2212"),l("span",{className:typeof u=="number"?"capital-watchlist-stepperreadout":"capital-watchlist-stepperreadout capital-watchlist-stepperplaceholder",role:"status"},typeof u=="number"?`${u}%`:`0~${k}`),l("button",{type:"button",className:"capital-watchlist-stepperbtn","aria-label":t("holdingStepUp"),title:`0~${k}`,disabled:st,onClick:()=>a.stepHolding(s.thscode,C)},"+")))]:[],l(Tt,{key:"remove",danger:!0,separatorBefore:!0,icon:l(At,{size:14}),onSelect:()=>{a.closeRowMenu(),a.setPendingRemove(s)}},t("remove"))],onSelect:N=>{N==="pin"&&(a.closeRowMenu(),a.pin(s.thscode))},onClose:()=>a.closeRowMenu(),align:"end",portal:!0,listClassName:"capital-watchlist-rows",className:"capital-watchlist-actions"})))})),et=l("div",{className:g?"capital-watchlist-confirm capital-watchlist-confirm-open":"capital-watchlist-confirm","aria-hidden":g?void 0:"true"},l("div",{className:"capital-watchlist-confirmbox",role:g?"alertdialog":void 0,"aria-label":t("confirmTitle")},l("div",{className:"capital-watchlist-confirmtitle"},t("confirmTitle")),g?l("p",{className:"capital-watchlist-confirmdesc"},t("confirmDescPrefix"),l("strong",null,`${p.name} \xB7 ${p.ticker}`),t("confirmDescSuffix")):null,l("div",{className:"capital-watchlist-confirmactions"},l("button",{type:"button",className:"capital-watchlist-confirmbtn",onClick:()=>a.setPendingRemove(null)},t("confirmCancel")),l("button",{type:"button",className:"capital-watchlist-confirmbtn capital-watchlist-confirmdanger",onClick:()=>{let s=p;a.setPendingRemove(null),s!==null&&a.remove(s.thscode)}},t("confirmOk")))));return l(Pt,{open:!0,onClose:()=>a.close(),title:t("title"),headless:!0,shortcutModal:"watchlist",className:"capital-watchlist-dialog"},l("div",{className:"capital-watchlist-card",onKeyDown:Y},l("div",{className:"capital-watchlist-header"},l("h2",{className:"capital-watchlist-title"},t("title")),l("button",{type:"button",className:"capital-watchlist-close","aria-label":t("close"),onClick:()=>a.close()},l(O,{size:14}))),l("div",{className:"capital-watchlist-search",onBlur:G},l("div",{className:"capital-watchlist-field"},l("span",{className:"capital-watchlist-searchicon"},l(Et,{size:16})),l("input",{className:"capital-watchlist-input","data-modal-autofocus":!0,value:i.query,placeholder:t("searchPlaceholder"),onChange:s=>a.onQueryChange(s.target.value,s.isComposing),onCompositionStart:()=>a.beginComposition(),onCompositionEnd:s=>a.endComposition(s.target.value)}),i.query.length>0?l("button",{type:"button",className:"capital-watchlist-clear",title:t("clearInput"),"aria-label":t("clearInput"),onMouseDown:s=>s.preventDefault(),onClick:()=>a.onQueryChange("",!1)},l(O,{size:12})):null),V),i.addError!==null&&i.addError!==void 0?l("p",{className:"capital-watchlist-adderror",role:"status","data-code":i.addError.code},Bt(t,i.addError)):null,Z,at,l("div",{className:"capital-watchlist-footer"},l("div",{className:"capital-watchlist-footcol"},l("button",{type:"button",className:"capital-watchlist-refresh",disabled:i.refreshing||d,onClick:()=>{a.refresh()}},l(Ct,{size:14}),i.refreshing?t("refreshing"):t("refresh")),X),l("span",{className:"capital-watchlist-updated"},`${t("updated")} ${i.refreshed_at===null||i.refreshed_at===void 0?t("notRefreshed"):B(i.refreshed_at)}`)),et))}function Jt(e){e.effect(Wt,`${f}: styles`),e.effect(()=>e.locale.register(_,{zh:zt,en:Mt}),`${f}: dictionaries`);let a=new Map,t=n=>{let c=a.get(n);return c===void 0&&(c=new E,a.set(n,c)),c};e.effect(()=>()=>{for(let n of a.values())n.dispose();a.clear()},`${f}: per-session surfaces`);let r=n=>{let o=e.sessions?.list?.getSnapshot?.().byId?.[n]?.projectionValues?.agentPreset;return typeof o=="string"?o:void 0},i=new Set,d=n=>{let c=r(n);return c!==void 0?c===It:(i.has(n)||(i.add(n),Promise.resolve(e.sessions?.refreshProjections?.(n)).catch(()=>{})),!1)};e.slots.inject(D,()=>e.slots.register({name:D,id:"capital-watchlist-dialog",order:3,locale:_,inject:n=>{let c=t(n);return{hooks:{dialog:c.state},surface:c}}},Xt)),e.inject(["commandUi"],n=>{let c=e.locale.bind(_);n.effect(()=>n.commandUi.register({name:"watchlist",label:()=>c("command.label"),description:()=>c("command.description"),icon:yt,available:o=>d(o.sessionId),ui:{kind:"action",run:o=>{t(o.sessionId).open()}}}),`${f}: /watchlist contribution`)}),e.logger?.info?.(`${f}: \u5BA2\u6237\u7AEF\u534A\u8FB9\u5DF2\u6302\u8F7D\uFF08/watchlist \u83DC\u5355\u884C + \u81EA\u9009\u80A1\u5F39\u7A97\uFF09`)}exports.name=f;exports.inject=["slots","locale","commandUi","sessions"];exports.apply=Jt;
264
131
  return module.exports
265
132
  },
266
133
  })