@v587d/capital-generation 0.0.0-stage → 2.6.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.
- package/CHANGELOG.md +814 -0
- package/LICENSE +21 -0
- package/README.md +118 -2
- package/assets/cg-icon.png +0 -0
- package/capital-config/client.js +28 -0
- package/capital-config/client.src.cjs +388 -0
- package/capital-config/index.js +113 -0
- package/capital-config/package.json +36 -0
- package/capital-watchlist/client.js +182 -0
- package/capital-watchlist/client.src.cjs +1229 -0
- package/capital-watchlist/index.js +772 -0
- package/capital-watchlist/package.json +37 -0
- package/chart-ui/README.md +112 -0
- package/chart-ui/client.js +16 -0
- package/chart-ui/client.src.cjs +126 -0
- package/chart-ui/index.js +205 -0
- package/chart-ui/package.json +30 -0
- package/cordis.patch.yml +72 -0
- package/lib/agents/bash-guard.d.ts +55 -0
- package/lib/agents/bash-guard.js +162 -0
- package/lib/agents/root-tool-policy.d.ts +164 -0
- package/lib/agents/root-tool-policy.js +309 -0
- package/lib/chart/artifact-ref.d.ts +65 -0
- package/lib/chart/artifact-ref.js +107 -0
- package/lib/chart/downsample.d.ts +8 -0
- package/lib/chart/downsample.js +53 -0
- package/lib/chart/errors.d.ts +16 -0
- package/lib/chart/errors.js +15 -0
- package/lib/chart/events.d.ts +120 -0
- package/lib/chart/events.js +471 -0
- package/lib/chart/html.d.ts +21 -0
- package/lib/chart/html.js +154 -0
- package/lib/chart/runtime.d.ts +20 -0
- package/lib/chart/runtime.js +270 -0
- package/lib/chart/series.d.ts +102 -0
- package/lib/chart/series.js +424 -0
- package/lib/chart/source-token.d.ts +64 -0
- package/lib/chart/source-token.js +217 -0
- package/lib/chart/spec.d.ts +58 -0
- package/lib/chart/spec.js +265 -0
- package/lib/chart/tool.d.ts +86 -0
- package/lib/chart/tool.js +288 -0
- package/lib/chart/vendor/LICENSE +201 -0
- package/lib/chart/vendor/VERSION.json +8 -0
- package/lib/chart/vendor/lightweight-charts.standalone.production.js +7 -0
- package/lib/data-collector/args.d.ts +38 -0
- package/lib/data-collector/args.js +114 -0
- package/lib/data-collector/dataset-tools.d.ts +3 -0
- package/lib/data-collector/dataset-tools.js +421 -0
- package/lib/data-collector/describe.d.ts +99 -0
- package/lib/data-collector/describe.js +256 -0
- package/lib/data-collector/hub.d.ts +187 -0
- package/lib/data-collector/hub.js +469 -0
- package/lib/data-collector/query-time.d.ts +58 -0
- package/lib/data-collector/query-time.js +101 -0
- package/lib/data-collector/query.d.ts +57 -0
- package/lib/data-collector/query.js +473 -0
- package/lib/data-collector/store.d.ts +499 -0
- package/lib/data-collector/store.js +1486 -0
- package/lib/data-collector/time-axis.d.ts +169 -0
- package/lib/data-collector/time-axis.js +419 -0
- package/lib/data-collector/tools.d.ts +32 -0
- package/lib/data-collector/tools.js +216 -0
- package/lib/index.d.ts +275 -0
- package/lib/index.js +458 -0
- package/lib/net/eastmoney-client.d.ts +104 -0
- package/lib/net/eastmoney-client.js +118 -0
- package/lib/net/throttle.d.ts +16 -0
- package/lib/net/throttle.js +34 -0
- package/lib/ocr/client.d.ts +82 -0
- package/lib/ocr/client.js +281 -0
- package/lib/ocr/markdown.d.ts +75 -0
- package/lib/ocr/markdown.js +209 -0
- package/lib/ocr/store.d.ts +119 -0
- package/lib/ocr/store.js +226 -0
- package/lib/sources/eastmoney-http.d.ts +2 -0
- package/lib/sources/eastmoney-http.js +1253 -0
- package/lib/sources/fuyao-core.d.ts +52 -0
- package/lib/sources/fuyao-core.js +96 -0
- package/lib/sources/fuyao-rest.d.ts +14 -0
- package/lib/sources/fuyao-rest.js +2057 -0
- package/lib/sources/security-code.d.ts +27 -0
- package/lib/sources/security-code.js +104 -0
- package/lib/sources/security-identity.d.ts +24 -0
- package/lib/sources/security-identity.js +89 -0
- package/lib/sources/tencent-http.d.ts +2 -0
- package/lib/sources/tencent-http.js +1053 -0
- package/lib/sources/wind-mcp.d.ts +8 -0
- package/lib/sources/wind-mcp.js +593 -0
- package/lib/time/tools.d.ts +74 -0
- package/lib/time/tools.js +464 -0
- package/lib/tool-exec.d.ts +29 -0
- package/lib/tool-exec.js +17 -0
- package/lib/web-retriever/engines.d.ts +61 -0
- package/lib/web-retriever/engines.js +202 -0
- package/lib/web-retriever/html-markdown.d.ts +50 -0
- package/lib/web-retriever/html-markdown.js +321 -0
- package/lib/web-retriever/local-fetch.d.ts +121 -0
- package/lib/web-retriever/local-fetch.js +562 -0
- package/lib/web-retriever/retriever.d.ts +58 -0
- package/lib/web-retriever/retriever.js +94 -0
- package/lib/web-retriever/sources.d.ts +235 -0
- package/lib/web-retriever/sources.js +961 -0
- package/lib/web-retriever/tools.d.ts +50 -0
- package/lib/web-retriever/tools.js +1029 -0
- package/lib/web-retriever/wind-client.d.ts +69 -0
- package/lib/web-retriever/wind-client.js +311 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +84 -4
- package/preset/capital-generation/README.md +161 -0
- package/preset/capital-generation/agent.patch.yml +509 -0
- package/preset/capital-generation/skills/capital-chart-protocol/SKILL.md +137 -0
- package/preset/capital-generation/skills/capital-data-protocol/SKILL.md +416 -0
- package/preset/capital-generation/skills/capital-orchestration/SKILL.md +174 -0
- package/preset/capital-generation/skills/capital-visualization-protocol/SKILL.md +296 -0
- package/preset/capital-generation/skills/capital-web-protocol/SKILL.md +240 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import z from '@deepseek-ai/schemastery'
|
|
2
|
+
|
|
3
|
+
export const name = 'capital-config'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 本包在 profile 里的**条目 id**。0.1.7 起它就是 settings 命名空间本身:
|
|
7
|
+
* `dsh-settings` 不再接受 `settings.register()`,而是把**活动 profile 条目**的 Config schema 里
|
|
8
|
+
* 声明为 `.volatile()` 的字段投影成表单,`ns` 恒等于 `entry.options.id`。两个事实因此承重:
|
|
9
|
+
*
|
|
10
|
+
* 1. **它是卡片的取数通道**:浏览器半边 `ctx.configForms.get(条目 id)` 与
|
|
11
|
+
* `whileServed([条目 id])` 都按它寻址;卡片本身注册进 `plugins.bundle.config`,
|
|
12
|
+
* key 是**组合包的包名**(`@v587d/capital-generation`),不是 `<包名>#<行 id>`。
|
|
13
|
+
* 条目 id 或包名任一处漂移,表现都是**卡片静默消失**(零报错)。
|
|
14
|
+
* 2. **它是取数配置的来源**:主插件 `@v587d/capital-generation` 经
|
|
15
|
+
* `settings.describe()` 读同一条目的解析值,拿 `fuyaoCredentialRef` /
|
|
16
|
+
* `retriever.credentialRef` / `retriever.windDocs.credentialRef` /
|
|
17
|
+
* `retriever.paddleOcr.credentialRef` 这些**引用名**去寻密钥。
|
|
18
|
+
*
|
|
19
|
+
* 密钥本身恒不进本条目:API Key 写在 credentials 域(`remote.credentials.set`),
|
|
20
|
+
* 这里只存引用名。唯一写进配置的偏好是回退开关 `retriever.localFetch.enabled`。
|
|
21
|
+
*
|
|
22
|
+
* ⛔ 字段必须 `.volatile()`:`volatileForm(schema)` 在没有任何 volatile 字段时返回
|
|
23
|
+
* `undefined`,该条目就**不进** describe 镜像——卡片读不到命名空间,写入也会被
|
|
24
|
+
* `Config field "…" is not volatile` 拒绝。非 volatile 字段仍是普通配置,只能改 profile 文件。
|
|
25
|
+
*
|
|
26
|
+
* 浏览器半边镜像了这个 id(`client.src.cjs` 的 `ENTRY_ID`),两处同改由
|
|
27
|
+
* `test/capital-config.test.mjs` 钉住。
|
|
28
|
+
*/
|
|
29
|
+
export const SETTINGS_ENTRY_ID = 'capital-config'
|
|
30
|
+
|
|
31
|
+
const WindDocsSchema = z.object({
|
|
32
|
+
endpoint: z.string().default('').volatile().description('可选:覆盖 Wind 文档检索端点'),
|
|
33
|
+
credentialRef: z.string().default('WIND_API_KEY').volatile().description('Wind credentials 引用名'),
|
|
34
|
+
timeoutMs: z.number().default(60000).volatile().description('Wind 请求超时毫秒'),
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 本地直连回退默认值。必须与主插件 `src/index.ts` 的 `LOCAL_FETCH_DEFAULTS` 逐字一致
|
|
39
|
+
* (两处 schema 漂移会被 `test/capital-config.test.mjs` 的 deepEqual 用例抓住)。
|
|
40
|
+
* 数值口径对齐官方 `dsh-web-fetch-http`(timeoutMs=30000 / maxBodyChars=100000);
|
|
41
|
+
* `maxContentChars` 切在转换前的原始 HTML 上,所以按 HTML 体积给足。
|
|
42
|
+
* `userAgent` 默认是产品标识;显式配成空串时消费点回落到插件版本号。
|
|
43
|
+
*/
|
|
44
|
+
export const LOCAL_FETCH_DEFAULTS = {
|
|
45
|
+
enabled: true,
|
|
46
|
+
timeoutMs: 30000,
|
|
47
|
+
maxBytes: 524288,
|
|
48
|
+
maxContentChars: 100000,
|
|
49
|
+
maxRedirects: 5,
|
|
50
|
+
userAgent: '@v587d/capital-generation',
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const LocalFetchSchema = z.object({
|
|
54
|
+
enabled: z.boolean().default(LOCAL_FETCH_DEFAULTS.enabled).volatile().description('是否允许本机直连出网:AnySearch 失败后的回退抓取 + 具名来源工具的执行(默认开启;关闭时来源工具调用响亮失败)'),
|
|
55
|
+
timeoutMs: z.number().default(LOCAL_FETCH_DEFAULTS.timeoutMs).volatile().description('本机直连单次请求超时毫秒'),
|
|
56
|
+
maxBytes: z.number().default(LOCAL_FETCH_DEFAULTS.maxBytes).volatile().description('本机直连响应体字节上限'),
|
|
57
|
+
maxContentChars: z.number().default(LOCAL_FETCH_DEFAULTS.maxContentChars).volatile().description('本机直连正文码点上限(切在转换前的原始 HTML 上,不是 markdown 输出)'),
|
|
58
|
+
maxRedirects: z.number().default(LOCAL_FETCH_DEFAULTS.maxRedirects).volatile().description('本机直连最大重定向跳数'),
|
|
59
|
+
userAgent: z.string().default(LOCAL_FETCH_DEFAULTS.userAgent).volatile().description('本机直连 User-Agent;空 = 回落到插件版本号'),
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* PaddleOCR 文档解析(`ocr` 工具)默认值。必须与主插件 `src/index.ts` 的
|
|
64
|
+
* `PADDLE_OCR_DEFAULTS` 逐字一致(漂移被 `test/capital-config.test.mjs` 的 deepEqual 抓住)。
|
|
65
|
+
*
|
|
66
|
+
* `endpoint` / `model` 留空是把真值让给 `src/ocr/client.ts`;`pollBudgetMs: 0` = 客户端默认的
|
|
67
|
+
* 200000 毫秒自有等待预算,必须小于 `ocr` 工具声明的 240000 超时,否则框架先超时、
|
|
68
|
+
* 回执里没有 `doc_id` 可续查。
|
|
69
|
+
*/
|
|
70
|
+
export const PADDLE_OCR_DEFAULTS = {
|
|
71
|
+
endpoint: '',
|
|
72
|
+
credentialRef: 'PADDLE_OCR_TOKEN',
|
|
73
|
+
model: '',
|
|
74
|
+
pollBudgetMs: 0,
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const PaddleOcrSchema = z.object({
|
|
78
|
+
endpoint: z.string().default(PADDLE_OCR_DEFAULTS.endpoint).volatile().description('PaddleOCR 作业端点;空 = 官方端点'),
|
|
79
|
+
credentialRef: z.string().default(PADDLE_OCR_DEFAULTS.credentialRef).volatile().description('PaddleOCR Token 的 credentials 引用名'),
|
|
80
|
+
model: z.string().default(PADDLE_OCR_DEFAULTS.model).volatile().description('解析模型名;空 = PaddleOCR-VL-1.6'),
|
|
81
|
+
pollBudgetMs: z.number().default(PADDLE_OCR_DEFAULTS.pollBudgetMs).volatile().description('ocr 内部等作业的预算毫秒,0 = 默认 200000'),
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
export const Config = z.object({
|
|
85
|
+
customPersona: z.string().default('').volatile().description('Capital 模式附加人设文本'),
|
|
86
|
+
fuyaoCredentialRef: z.string().default('FUYAO_API_KEY').volatile().description('Fuyao credentials 引用名'),
|
|
87
|
+
retriever: z.object({
|
|
88
|
+
baseURL: z.string().default('').volatile().description('AnySearch API 地址'),
|
|
89
|
+
credentialRef: z.string().default('ANYSEARCH_API_KEY').volatile().description('AnySearch credentials 引用名'),
|
|
90
|
+
windDocs: WindDocsSchema.default({
|
|
91
|
+
endpoint: '',
|
|
92
|
+
credentialRef: 'WIND_API_KEY',
|
|
93
|
+
timeoutMs: 60000,
|
|
94
|
+
}),
|
|
95
|
+
localFetch: LocalFetchSchema.default({ ...LOCAL_FETCH_DEFAULTS }),
|
|
96
|
+
paddleOcr: PaddleOcrSchema.default({ ...PADDLE_OCR_DEFAULTS }),
|
|
97
|
+
}).default({
|
|
98
|
+
baseURL: '',
|
|
99
|
+
credentialRef: 'ANYSEARCH_API_KEY',
|
|
100
|
+
windDocs: { endpoint: '', credentialRef: 'WIND_API_KEY', timeoutMs: 60000 },
|
|
101
|
+
localFetch: { ...LOCAL_FETCH_DEFAULTS },
|
|
102
|
+
paddleOcr: { ...PADDLE_OCR_DEFAULTS },
|
|
103
|
+
}),
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 本行**不消费**自己的配置,也不需要注册任何服务:可编辑性全部是 schema 事实
|
|
108
|
+
* (`.volatile()`),`dsh-settings` 从条目 Config 投影出表单,主插件再经
|
|
109
|
+
* `settings.describe()` 读回解析值。所以这里只留一行日志,证明这颗行激活了。
|
|
110
|
+
*/
|
|
111
|
+
export function apply(ctx) {
|
|
112
|
+
ctx.logger?.info?.('capital-config: settings entry active (volatile config surface)')
|
|
113
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@v587d/capital-config",
|
|
3
|
+
"version": "2.6.1",
|
|
4
|
+
"description": "Capital 模式的取数凭据与偏好配置行:卡片坐在 @v587d/capital-generation 插件主页的「配置」段,点这一行本身没有表单。",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"default": "./index.js"
|
|
10
|
+
},
|
|
11
|
+
"./client": {
|
|
12
|
+
"default": "./client.js"
|
|
13
|
+
},
|
|
14
|
+
"./package.json": "./package.json"
|
|
15
|
+
},
|
|
16
|
+
"dsh": {
|
|
17
|
+
"client": {
|
|
18
|
+
"platform": "web",
|
|
19
|
+
"inject": [
|
|
20
|
+
"@deepseek-ai/dsh-client-locale",
|
|
21
|
+
"@deepseek-ai/dsh-client-ui-primitives",
|
|
22
|
+
"@deepseek-ai/dsh-client-ui-settings",
|
|
23
|
+
"@deepseek-ai/dsh-client-ui-plugin-manager",
|
|
24
|
+
"@deepseek-ai/dsh-api-remotes"
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@deepseek-ai/schemastery": "^3.18.4"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"index.js",
|
|
33
|
+
"client.js",
|
|
34
|
+
"package.json"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// 由 scripts/build-capital-watchlist-client.mjs 生成,请勿手改;源码见 capital-watchlist/client.src.cjs。
|
|
2
|
+
window.__ModuleLoader__.load({
|
|
3
|
+
id: '@v587d/capital-watchlist',
|
|
4
|
+
factory: (require) => {
|
|
5
|
+
var module = { exports: {} }
|
|
6
|
+
var exports = module.exports
|
|
7
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
|
|
8
|
+
"use strict";var{createElement:e,useEffect:F,useState:q}=require("react"),{createSnapshotStore:D}=require("@deepseek-ai/dsh-client-store"),{IconChecklistOutlineRegular:Q,IconCloseOutlineRegular:k,IconEllipsisOutlineRegular:L,IconGoalOutlineRegular:H,IconListPenOutlineRegular:B,IconPinOutlineRegular:U,IconRefreshOutlineRegular:Y,IconSearchOutlineRegular:W,IconTrashOutlineRegular:G,Menu:K,Modal:J}=require("@deepseek-ai/dsh-client-ui-primitives"),m="capital-watchlist",b="capital.watchlist",N="conversation.input.overlay",_="/capital-watchlist",V="capital-generation",X=300,S="capital-watchlist-css",Z={"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\u4E2D\u6587\u540D\uFF0C\u652F\u6301A\u80A1/\u6307\u6570/ETF",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",noChangePct:"\u6682\u65E0\u6DA8\u8DCC\u6570\u636E",typeStock:"\u80A1\u7968",typeIndex:"\u6307\u6570",typeEtf:"ETF",remove:"\u79FB\u9664",more:"\u66F4\u591A",pin:"\u7F6E\u9876",predict:"\u9884\u6D4B",predictTip:"AI\u9884\u6D4B\u8BE5\u8BC1\u5238\u6807\u7684",review:"\u590D\u76D8",reviewTip:"AI\u590D\u76D8\u8BE5\u8BC1\u5238\u6807\u7684",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:"\u5019\u9009\u8D85\u8FC7 10 \u6761\uFF0C\u8BF7\u8F93\u5165\u51C6\u786E\u8BC1\u5238\u4EE3\u7801\u6216\u540D\u79F0\u3002",noHit:"\u6CA1\u6709\u5339\u914D\u7684\u6807\u7684\uFF08\u652F\u6301\u6CAA\u6DF1 A \u80A1 / \u6307\u6570 / \u573A\u5185 ETF\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","error.rate_limited":"\u884C\u60C5\u670D\u52A1\u9650\u6D41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.fuyao_unavailable":"\u884C\u60C5\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528\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"},aa={"command.label":"Watchlist","command.description":"Add / view / remove watched symbols",title:"Watchlist",close:"Close",searchPlaceholder:"Symbol code or Chinese name \u2014 A-share / index / ETF",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",noChangePct:"No change data yet",typeStock:"Stock",typeIndex:"Index",typeEtf:"ETF",remove:"Remove",more:"More",pin:"Pin to top",predict:"Predict",predictTip:"AI prediction for this symbol",review:"Review",reviewTip:"AI review of this symbol",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:"More than 10 candidates \u2014 enter the exact code or name.",noHit:"No matching symbol (A-share / index / on-exchange ETF).","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","error.rate_limited":"Quote service is rate limited \u2014 try again later","error.fuyao_unavailable":"Quote service 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)"},ta={"a-share":"typeStock","a-share-index":"typeIndex","fund-etf":"typeEtf"};function $(r,t){let a=ta[r];return a===void 0?String(r??""):t(a)}var ea=/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F\u00AD\u200B-\u200F\u2028\u2029\u202A-\u202E\u2060-\u2064\u2066-\u2069\uFEFF]/gu;function v(r){return String(r??"").replace(ea,"")}function g(r){return Array.isArray(r)?r.map(t=>t===null||typeof t!="object"?t:{...t,name:v(t.name)}):r}var ia={"a-share":"capital-watchlist-tag-stock","a-share-index":"capital-watchlist-tag-index","fund-etf":"capital-watchlist-tag-etf"},ra=`
|
|
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 */
|
|
11
|
+
.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
|
+
.capital-watchlist-card { position: relative; display: flex; flex-direction: column; min-height: 0; overflow: hidden; border-radius: 18px; --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2); --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2); }
|
|
14
|
+
.capital-watchlist-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 18px 20px 14px; }
|
|
15
|
+
.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
|
+
.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
|
+
.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
|
+
.capital-watchlist-search { position: relative; padding: 0 20px 16px; }
|
|
21
|
+
.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
|
+
.capital-watchlist-field:focus-within { box-shadow: inset 0 0 0 1.5px var(--dsw-alias-brand-primary); }
|
|
25
|
+
.capital-watchlist-searchicon { position: absolute; left: 14px; display: inline-flex; color: var(--dsw-alias-label-tertiary); pointer-events: none; }
|
|
26
|
+
.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
|
+
.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
|
+
.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
|
+
.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\u2014\u2014\u5B9E\u6D4B\u9ED8\u8BA4\u64AD\u79CD 4 \u884C\u88C1\u6389\u7EA6 50px\uFF0C1 \u884C\u65F6\u53EA\u5269\u4E24\u4E09\u6761
|
|
40
|
+
\u53EF\u89C1\uFF0C\u7528\u6237\u65E2\u770B\u4E0D\u5230"\u4E0B\u9762\u8FD8\u6709"\uFF0C\u4E5F\u591F\u4E0D\u7740\u6700\u540E\u4E00\u6761\u3002\u6240\u4EE5\u6700\u5927\u9AD8\u5EA6\u6536\u5230 246px\uFF0C\u5E76\u7531\u4E0B\u9762
|
|
41
|
+
capital-watchlist-list-open \u5728\u6253\u5F00\u4E0B\u62C9\u65F6\u628A\u6E05\u5355\u90A3\u4E00\u683C\u6491\u5230\u540C\u4E00\u9AD8\u5EA6\uFF1A\u5361\u7247\u56E0\u6B64\u603B\u662F\u591F\u9AD8\uFF0C
|
|
42
|
+
\u8D85\u51FA 246px \u7684\u5019\u9009\u5728\u8FD9\u5C42\u81EA\u5DF1\u7684\u76D2\u5B50\u91CC\u6EDA\uFF08SEARCH_LIMIT \u662F 10 \u6761\uFF0C\u6EDA\u5F97\u5230\u5E95\uFF09\u3002 */
|
|
43
|
+
.capital-watchlist-dropdown { position: absolute; top: calc(100% - 8px); left: 20px; right: 20px; z-index: 20; max-height: 246px; overflow-y: auto; 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); }
|
|
44
|
+
@keyframes capital-watchlist-drop { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }
|
|
45
|
+
@keyframes capital-watchlist-breathe { 0% { opacity: 1; } 40% { opacity: .6; } 80%, 100% { opacity: 1; } }
|
|
46
|
+
@media (prefers-reduced-motion: reduce) { .capital-watchlist-dropdown { animation: none; } .capital-watchlist-skeleton { animation: none; } }
|
|
47
|
+
.capital-watchlist-option { display: flex; width: 100%; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 14px; border: none; border-bottom: .5px solid var(--dsw-alias-border-l2); background: transparent; color: inherit; font-family: inherit; text-align: left; cursor: pointer; }
|
|
48
|
+
.capital-watchlist-option:last-of-type { border-bottom: none; }
|
|
49
|
+
.capital-watchlist-option:hover:not(:disabled) { background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 10%, transparent); }
|
|
50
|
+
.capital-watchlist-option:disabled { opacity: .45; cursor: not-allowed; }
|
|
51
|
+
/* \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 */
|
|
52
|
+
.capital-watchlist-close:focus-visible, .capital-watchlist-clear:focus-visible, .capital-watchlist-option: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 { outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary)); outline-offset: 1px; }
|
|
53
|
+
.capital-watchlist-optionmain { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
|
|
54
|
+
.capital-watchlist-optionname { font-size: 14px; font-weight: 500; color: var(--dsw-alias-label-primary); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
|
|
55
|
+
.capital-watchlist-optioncode { font-size: 12px; color: var(--dsw-alias-label-tertiary); }
|
|
56
|
+
.capital-watchlist-tag { flex: none; display: inline-block; padding: 2px 7px; border-radius: 6px; font-size: 11px; line-height: 14px; font-weight: 500; }
|
|
57
|
+
/* \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
|
|
58
|
+
\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
|
|
59
|
+
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 */
|
|
60
|
+
.capital-watchlist-tag-index { color: var(--dsw-alias-state-business-primary); background: var(--dsw-alias-state-business-tertiary); }
|
|
61
|
+
.capital-watchlist-tag-stock { color: var(--dsw-alias-state-warn-label); background: var(--dsw-alias-state-warn-tertiary); }
|
|
62
|
+
.capital-watchlist-tag-etf { color: var(--dsw-alias-state-success-primary); background: var(--dsw-alias-state-success-tertiary); }
|
|
63
|
+
/* \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
|
|
64
|
+
\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
|
|
65
|
+
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
|
|
66
|
+
\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
|
|
67
|
+
+ \u4E24\u4E2A 2px \u95F4\u9699\uFF0C\u6574\u7C07\u8D34\u53F3\u7F18\u3002
|
|
68
|
+
\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
|
|
69
|
+
\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
|
|
70
|
+
\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 */
|
|
71
|
+
.capital-watchlist-grid { display: grid; grid-template-columns: 1fr 92px 84px; gap: 8px; align-items: center; }
|
|
72
|
+
.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); }
|
|
73
|
+
/* \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
|
|
74
|
+
\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 */
|
|
75
|
+
.capital-watchlist-headaction { text-align: right; }
|
|
76
|
+
.capital-watchlist-list { max-height: 300px; padding: 0 12px 8px; overflow-y: auto; }
|
|
77
|
+
/* \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\u3002
|
|
78
|
+
\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 */
|
|
79
|
+
.capital-watchlist-list-open { min-height: 246px; }
|
|
80
|
+
.capital-watchlist-row { padding: 11px 8px; border-radius: 10px; transition: background .15s var(--ds-ease-in-out); }
|
|
81
|
+
.capital-watchlist-row:hover { background: var(--dsw-alias-interactive-bg-hover); }
|
|
82
|
+
.capital-watchlist-namewrap { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
|
|
83
|
+
.capital-watchlist-name { font-size: 14px; font-weight: 500; color: var(--dsw-alias-label-primary); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
|
|
84
|
+
/* \u4EE3\u7801\u4E0E\u7C7B\u578B\u5FBD\u6807\u540C\u5904\u7B2C\u4E8C\u884C\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\u3002 */
|
|
85
|
+
.capital-watchlist-codeline { display: flex; align-items: center; gap: 6px; min-width: 0; }
|
|
86
|
+
.capital-watchlist-code { font-size: 11px; color: var(--dsw-alias-label-tertiary); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
|
|
87
|
+
/* \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
|
|
88
|
+
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
|
|
89
|
+
\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
|
|
90
|
+
\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
|
|
91
|
+
\u6807\u7B7E\u4E0E\u5B83\u5E95\u4E0B\u7684\u6570\u5B57\u56E0\u6B64\u59CB\u7EC8\u5BF9\u9F50\u3002 */
|
|
92
|
+
.capital-watchlist-quote { min-width: 0; padding-right: 12px; text-align: right; font-variant-numeric: tabular-nums; }
|
|
93
|
+
.capital-watchlist-price { font-size: 14px; font-weight: 500; color: var(--dsw-alias-label-primary); white-space: nowrap; }
|
|
94
|
+
.capital-watchlist-change { margin-top: 1px; font-size: 12px; font-weight: 500; white-space: nowrap; }
|
|
95
|
+
.capital-watchlist-up { color: #d1493f; }
|
|
96
|
+
.capital-watchlist-down { color: #17a063; }
|
|
97
|
+
.capital-watchlist-flat { color: var(--dsw-alias-label-secondary); }
|
|
98
|
+
/* \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"
|
|
99
|
+
\u8FD9\u4E2A\u7ED3\u8BBA\uFF0C\u501F\u7528\u5B83\u5C31\u628A"\u6CA1\u8FD9\u4E2A\u6570"\u753B\u6210\u4E86\u4E00\u4E2A\u6295\u8D44\u5224\u65AD\u3002 */
|
|
100
|
+
.capital-watchlist-nodata { color: var(--dsw-alias-label-tertiary); }
|
|
101
|
+
/* \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
|
|
102
|
+
\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 */
|
|
103
|
+
.capital-watchlist-quotefailed { color: var(--dsw-alias-state-error-primary); }
|
|
104
|
+
/* \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
|
|
105
|
+
\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 */
|
|
106
|
+
.capital-watchlist-stale { color: var(--dsw-alias-label-secondary); }
|
|
107
|
+
/* \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 */
|
|
108
|
+
.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; }
|
|
109
|
+
.capital-watchlist-skeleton-price { width: 68px; }
|
|
110
|
+
.capital-watchlist-skeleton-change { width: 44px; height: 10px; }
|
|
111
|
+
/* \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
|
|
112
|
+
\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 */
|
|
113
|
+
.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; }
|
|
114
|
+
.capital-watchlist-more:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary); }
|
|
115
|
+
.capital-watchlist-more:disabled { opacity: .45; cursor: not-allowed; }
|
|
116
|
+
/* \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
|
|
117
|
+
\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
|
|
118
|
+
\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 */
|
|
119
|
+
.capital-watchlist-actions { justify-content: flex-end; }
|
|
120
|
+
.capital-watchlist-rowactions { display: inline-flex; align-items: center; justify-content: flex-end; gap: 2px; min-width: 0; }
|
|
121
|
+
/* \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
|
|
122
|
+
\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
|
|
123
|
+
\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
|
|
124
|
+
**\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
|
|
125
|
+
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
|
|
126
|
+
\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
|
|
127
|
+
\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
|
|
128
|
+
26\xD724 \u662F\u8FD9\u4E00\u6863\u56FE\u6807\u952E\u7684\u4E0B\u9650\uFF0C\u518D\u5C0F\u5C31\u6210\u70B9\u4E0D\u5230\u7684\u88C5\u9970\u3002 */
|
|
129
|
+
.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; }
|
|
130
|
+
.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); }
|
|
131
|
+
.capital-watchlist-review:disabled, .capital-watchlist-predict:disabled { opacity: .45; cursor: not-allowed; }
|
|
132
|
+
/* \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
|
|
133
|
+
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 */
|
|
134
|
+
.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); }
|
|
135
|
+
.capital-watchlist-footcol { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; min-width: 0; }
|
|
136
|
+
/* \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
|
|
137
|
+
\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 */
|
|
138
|
+
.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; }
|
|
139
|
+
.capital-watchlist-refresh:hover:not(:disabled) { background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 20%, transparent); }
|
|
140
|
+
.capital-watchlist-refresh:disabled { opacity: .45; cursor: not-allowed; }
|
|
141
|
+
/* 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 */
|
|
142
|
+
.capital-watchlist-updated { font-size: 12px; line-height: 34px; color: var(--dsw-alias-label-tertiary); }
|
|
143
|
+
.capital-watchlist-hint { padding: 8px 14px; font-size: 12px; line-height: 18px; color: var(--dsw-alias-label-secondary); }
|
|
144
|
+
/* \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
|
|
145
|
+
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 */
|
|
146
|
+
/* \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
|
|
147
|
+
\u4E0D\u5199 padding\u2014\u2014\u5B83\u9A91\u5728 .capital-watchlist-hint \u7684 8px 14px \u4E0A\uFF0C\u53EA\u6539\u989C\u8272\u3002 */
|
|
148
|
+
.capital-watchlist-searcherror { color: var(--dsw-alias-state-warn-label); }
|
|
149
|
+
/* \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 */
|
|
150
|
+
.capital-watchlist-adderror { padding: 0 20px 10px; font-size: 12px; line-height: 18px; color: var(--dsw-alias-state-warn-label); }
|
|
151
|
+
/* \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 */
|
|
152
|
+
.capital-watchlist-notice { font-size: 12px; line-height: 18px; color: var(--dsw-alias-state-error-primary); }
|
|
153
|
+
.capital-watchlist-empty { padding: 24px 20px; text-align: center; font-size: 13px; line-height: 20px; color: var(--dsw-alias-label-secondary); }
|
|
154
|
+
/* \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
|
|
155
|
+
\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 */
|
|
156
|
+
.capital-watchlist-loaderror { color: var(--dsw-alias-state-error-primary); }
|
|
157
|
+
/* \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
|
|
158
|
+
\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 */
|
|
159
|
+
.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; }
|
|
160
|
+
.capital-watchlist-confirm-open { opacity: 1; visibility: visible; }
|
|
161
|
+
/* \u786E\u8BA4\u76D2\u662F\u6D6E\u5C42\uFF0C\u6309\u5B98\u65B9\u6A21\u6001\u5361\u53E3\u5F84\u753B\uFF1Aborder:0 + layer-2 + elevation-prominent\uFF0C
|
|
162
|
+
\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 */
|
|
163
|
+
/* \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
|
|
164
|
+
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
|
|
165
|
+
\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 */
|
|
166
|
+
.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); }
|
|
167
|
+
.capital-watchlist-confirm-open .capital-watchlist-confirmbox { transform: scale(1); }
|
|
168
|
+
.capital-watchlist-confirmtitle { font-size: 15px; line-height: 22px; font-weight: 600; color: var(--dsw-alias-label-primary); }
|
|
169
|
+
.capital-watchlist-confirmdesc { margin-top: 8px; font-size: 13px; line-height: 1.5; color: var(--dsw-alias-label-secondary); }
|
|
170
|
+
.capital-watchlist-confirmdesc strong { color: var(--dsw-alias-label-primary); font-weight: 500; }
|
|
171
|
+
.capital-watchlist-confirmactions { display: flex; gap: 10px; margin-top: 20px; }
|
|
172
|
+
/* \u6B21\u8981\u6309\u94AE\u7070\u5E95\u7528 button-primary-dimmed\uFF08\u5B98\u65B9\u7ED9"\u6B21\u8981\u6309\u94AE"\u7684\u5B9E\u5FC3\u6863\uFF09\uFF1A
|
|
173
|
+
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 */
|
|
174
|
+
.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; }
|
|
175
|
+
.capital-watchlist-confirmbtn:hover { background: var(--dsw-alias-interactive-bg-hover-accent); }
|
|
176
|
+
.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); }
|
|
177
|
+
.capital-watchlist-confirmdanger:hover { background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 25%, transparent); }
|
|
178
|
+
`;function la(){let r=globalThis.document;if(!r||typeof r.createElement!="function"||r.querySelector(`style[data-${S}]`))return;let t=r.createElement("style");t.setAttribute(`data-${S}`,""),t.textContent=ra;let a=r.head??r.body;if(!(a===void 0||typeof a.appendChild!="function"))return a.appendChild(t),()=>t.remove()}async function f(r,{query:t,body:a,signal:s}={}){let i=t!==void 0?`${_}${r}?${t}`:`${_}${r}`,p=a===void 0?{method:"GET",cache:"no-store",credentials:"same-origin",signal:s}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(a),credentials:"same-origin",signal:s},n=await fetch(i,p),o=await n.text(),c={};try{c=o.length>0?JSON.parse(o):{}}catch{c={}}if(n.ok===!0&&c.ok===!0)return c;let d=typeof c.code=="string"&&c.code.length>0?c.code:n.status===401||n.status===403?"unauthorized":"fuyao_unavailable",u=new Error(d);throw u.code=d,u.candidates=c.candidates,u.limit=c.limit,u}var E=()=>({open:!1,loading:!1,refreshing:!1,searching:!1,items:[],candidates:[],truncated:!1,query:"",dropdownOpen:!1,rowMenu:null,pendingRemove:null,refreshed_at:null,error:null,searchError:null,addError:null,loadError:null,failures:{},composing:!1,pendingSearch:!1}),y=class{constructor(){this.store=D(E()),this.searchController=null,this.timer=null,this.pending=null,this.lastQuery=null}get state(){return this.store}get snapshot(){return this.store.getSnapshot()}patch(t){this.store.update(a=>Object.assign(a,t))}open(){this.patch({...E(),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})}async load(){try{let t=await f("/list");this.patch({items:g(t.items)??[],seeded_at:t.seeded_at,loading:!1,loadError:null})}catch(t){throw this.patch({loading:!1,loadError:{code:t.code??"fuyao_unavailable"}}),t}}refresh(){if(this.pending!==null)return this.pending;this.patch({refreshing:!0});let t=f("/refresh",{body:{}}).then(a=>{let s={};for(let p of a.failures??[])s[p.thscode]=p.code;let i=g(a.items)??this.snapshot.items;this.patch({items:i,refreshed_at:a.refreshed_at??this.snapshot.refreshed_at,failures:s,error:a.error?{code:a.error.code,partial:i.length>0&&i.some(p=>s[p.thscode]===void 0)}:null})}).catch(a=>{this.patch({error:{code:a.code??"fuyao_unavailable",partial:this.snapshot.items.some(s=>s.quote!==null)}})}).finally(()=>{this.patch({refreshing:!1}),this.pending=null});return this.pending=t,t}onQueryChange(t,a){let s=t.trim(),i=a===void 0?this.snapshot.composing===!0:a===!0;if(this.patch({query:t,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),X)))}beginComposition(){this.timer!==null&&clearTimeout(this.timer),this.patch({composing:!0})}endComposition(t){this.onQueryChange(t,!1)}hideDropdown(){this.patch({dropdownOpen:!1})}toggleRowMenu(t){this.patch({rowMenu:this.snapshot.rowMenu===t?null:t})}closeRowMenu(){this.snapshot.rowMenu!==null&&this.patch({rowMenu:null})}setPendingRemove(t){this.patch({pendingRemove:t??null})}async search(t){this.lastQuery=t,this.searchController!==null&&this.searchController.abort();let a=new AbortController;this.searchController=a,this.patch({searching:!0,searchError:null});let s=()=>this.snapshot.query.trim()===t;try{let i=await f("/search",{query:`q=${encodeURIComponent(t)}`,signal:a.signal});if(!s()){this.patch({searching:!1});return}this.patch({candidates:g(i.items)??[],truncated:i.truncated===!0,searching:!1,pendingSearch:!1})}catch(i){if(i.name==="AbortError"||(this.lastQuery===t&&(this.lastQuery=null),!s()))return;this.patch({candidates:[],truncated:!1,searching:!1,pendingSearch:!1,searchError:{code:i.code??"fuyao_unavailable"}})}}async add(t){try{await f("/add",{body:{thscode:t.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:[],query:"",dropdownOpen:!1,pendingSearch:!1}),this.lastQuery=null,await this.load().catch(()=>{}),await this.refresh();let a=this.snapshot.items.find(s=>s.thscode===t.thscode);a!==void 0&&a.quote===null&&this.snapshot.failures[t.thscode]===void 0&&await this.refresh()}async remove(t){let a=this.snapshot.items;this.patch({items:a.filter(s=>s.thscode!==t),rowMenu:null});try{await f("/remove",{body:{thscode:t}}),this.snapshot.addError?.code==="list_full"&&this.patch({addError:null})}catch{this.patch({items:a})}}async pin(t){let a=this.snapshot.items,s=a.find(i=>i.thscode===t);if(s!==void 0){this.patch({items:[s,...a.filter(i=>i.thscode!==t)],rowMenu:null});try{let i=await f("/pin",{body:{thscode:t}});Array.isArray(i.items)&&this.patch({items:g(i.items)})}catch{this.patch({items:a})}}}async copyToClipboard(){let t=this.snapshot.items.map(a=>[a.thscode,v(a.name),a.asset_type,a.quote?.price??"",a.quote?.change_pct??"",a.quote?.captured_at??""].join(" ")).join(`
|
|
179
|
+
`);return await navigator.clipboard.writeText(t),t}dispose(){this.timer!==null&&clearTimeout(this.timer),this.searchController!==null&&this.searchController.abort()}};function P(r){if(typeof r!="number"||!Number.isFinite(r))return"";let t=new Date(r),a=s=>String(s).padStart(2,"0");return`${a(t.getMonth()+1)}-${a(t.getDate())} ${a(t.getHours())}:${a(t.getMinutes())}`}function C({assetType:r,t}){return e("span",{className:`capital-watchlist-tag ${ia[r]??"capital-watchlist-tag-stock"}`},$(r,t))}function sa(r,t,a){let s=v(r.name);return`${t(`${a}PromptPrefix`)}${s} (${r.thscode} \xB7 ${$(r.asset_type,t)})${t(`${a}PromptSuffix`)}`}function na({quote:r,failureCode:t,refreshing:a,t:s}){let i=t!==void 0;if(r==null)return a===!0?e("div",{className:"capital-watchlist-quote"},e("span",{className:"capital-watchlist-skeleton capital-watchlist-skeleton-price"}),e("span",{className:"capital-watchlist-skeleton capital-watchlist-skeleton-change"})):i?e("div",{className:"capital-watchlist-quote",title:s(`error.${t}`)},e("div",{className:"capital-watchlist-price capital-watchlist-quotefailed"},"\u2014")):e("div",{className:"capital-watchlist-quote"},e("div",{className:"capital-watchlist-price"},s("notRefreshed")));let p=typeof r.change_pct=="number"&&Number.isFinite(r.change_pct),n=p?`${r.change_pct>0?"+":""}${r.change_pct.toFixed(2)}%`:"\u2014",o=i?"capital-watchlist-stale":p?r.change_pct>0?"capital-watchlist-up":r.change_pct<0?"capital-watchlist-down":"capital-watchlist-flat":"capital-watchlist-nodata";return e("div",{className:"capital-watchlist-quote",title:i?`${s(`error.${t}`)} \xB7 ${s("stale")} ${P(r.captured_at)}`:p?void 0:s("noChangePct")},e("div",{className:i?"capital-watchlist-price capital-watchlist-stale":"capital-watchlist-price"},r.price.toFixed(2)),e("div",{className:`capital-watchlist-change ${o}`},n))}function oa(r,t){if(t.code!=="list_full")return r(`error.${t.code}`);let a=t.limit;return typeof a!="number"||!Number.isFinite(a)?r("error.list_full_noMax"):r("error.list_full").replace("{max}",String(a))}function ca({useDialog:r,surface:t,t:a,inputActions:s}){let i=r(l=>l),[p,n]=q(!1),o=i.pendingRemove??null;if(F(()=>()=>t.dispose(),[t]),!i.open)return null;let c=i.dropdownOpen===!0,d=o!==null,u=l=>{if(l.key==="Escape"){if(d){l.stopPropagation(),t.setPendingRemove(null);return}c&&(l.stopPropagation(),t.hideDropdown())}},R=l=>{if(!c)return;let h=l.relatedTarget;h!=null&&l.currentTarget?.contains?.(h)===!0||t.hideDropdown()},w=i.error,T=w==null?null:e("p",{className:"capital-watchlist-notice",role:"alert","data-code":w.code},`${a(`error.${w.code}`)}${w.partial===!0?a("errorSuffix"):""}`),x=(l,h)=>{s.insertText(sa(l,a,h),s.captureInsertion())===!0&&t.close()},z=c?e("div",{className:"capital-watchlist-dropdown",role:"listbox","aria-label":a("title"),"data-menu-material":"translucent"},i.candidates.map(l=>e("button",{key:l.thscode,type:"button",role:"option",className:"capital-watchlist-option",title:l.in_list===!0?a("added"):a("add"),disabled:l.in_list===!0||p,onClick:()=>{n(!0),t.add(l).finally(()=>n(!1))}},e("span",{className:"capital-watchlist-optionmain"},e("span",{className:"capital-watchlist-optionname"},l.name),e("span",{className:"capital-watchlist-optioncode"},l.in_list===!0?`${l.ticker} \xB7 ${a("added")}`:l.ticker)),e(C,{assetType:l.asset_type,t:a}))),i.composing===!0?e("div",{className:"capital-watchlist-hint"},a("composingHint")):i.searching===!0||i.pendingSearch===!0?e("div",{className:"capital-watchlist-hint"},a("searching")):i.searchError!==null&&i.searchError!==void 0?e("div",{className:"capital-watchlist-hint capital-watchlist-searcherror",role:"alert","data-code":i.searchError.code},a(`error.${i.searchError.code}`)):i.candidates.length===0?e("div",{className:"capital-watchlist-hint"},a("noHit")):null,i.truncated?e("div",{className:"capital-watchlist-hint"},a("truncated")):null):null,I=i.items.length===0?null:e("div",{className:"capital-watchlist-grid capital-watchlist-head"},e("span",null,a("colName")),e("span",{className:"capital-watchlist-quote"},a("colQuote")),e("span",{className:"capital-watchlist-headaction"},a("colAction"))),M=i.loadError!==null&&i.loadError!==void 0?e("p",{className:"capital-watchlist-empty capital-watchlist-loaderror",role:"alert","data-code":i.loadError.code},a(`error.${i.loadError.code}`)):e("p",{className:"capital-watchlist-empty"},a("empty")),A=i.loading?e("p",{className:"capital-watchlist-empty"},a("loading")):i.items.length===0?M:e("div",{className:c?"capital-watchlist-list capital-watchlist-list-open":"capital-watchlist-list"},i.items.map((l,h)=>e("div",{key:l.thscode,className:"capital-watchlist-grid capital-watchlist-row","data-thscode":l.thscode},e("span",{className:"capital-watchlist-namewrap"},e("span",{className:"capital-watchlist-name",title:`${l.name} ${l.ticker}`},l.name),e("span",{className:"capital-watchlist-codeline"},e("span",{className:"capital-watchlist-code"},l.ticker),e(C,{assetType:l.asset_type,t:a}))),e(na,{quote:l.quote,failureCode:i.failures[l.thscode],refreshing:i.refreshing,t:a}),e("span",{className:"capital-watchlist-rowactions"},e("button",{type:"button",className:"capital-watchlist-predict",disabled:p,title:a("predictTip"),"aria-label":`${a("predict")} ${l.name}`,onClick:()=>x(l,"predict")},e(H,{size:14})),e("button",{type:"button",className:"capital-watchlist-review",disabled:p,title:a("reviewTip"),"aria-label":`${a("review")} ${l.name}`,onClick:()=>x(l,"review")},e(B,{size:14})),e(K,{open:i.rowMenu===l.thscode,anchor:e("button",{type:"button",className:"capital-watchlist-more",disabled:p,title:a("more"),"aria-label":`${a("more")} ${l.name}`,"aria-haspopup":"menu","aria-expanded":i.rowMenu===l.thscode,onClick:()=>t.toggleRowMenu(l.thscode)},e(L,{size:14})),items:[{id:"pin",label:a("pin"),icon:e(U,{size:14}),disabled:h===0},{id:"remove",label:a("remove"),icon:e(G,{size:14}),danger:!0}],onSelect:j=>{t.closeRowMenu(),j==="pin"?t.pin(l.thscode):t.setPendingRemove(l)},onClose:()=>t.closeRowMenu(),align:"end",portal:!0,className:"capital-watchlist-actions"}))))),O=e("div",{className:d?"capital-watchlist-confirm capital-watchlist-confirm-open":"capital-watchlist-confirm","aria-hidden":d?void 0:"true"},e("div",{className:"capital-watchlist-confirmbox",role:d?"alertdialog":void 0,"aria-label":a("confirmTitle")},e("div",{className:"capital-watchlist-confirmtitle"},a("confirmTitle")),d?e("p",{className:"capital-watchlist-confirmdesc"},a("confirmDescPrefix"),e("strong",null,`${o.name} \xB7 ${o.ticker}`),a("confirmDescSuffix")):null,e("div",{className:"capital-watchlist-confirmactions"},e("button",{type:"button",className:"capital-watchlist-confirmbtn",onClick:()=>t.setPendingRemove(null)},a("confirmCancel")),e("button",{type:"button",className:"capital-watchlist-confirmbtn capital-watchlist-confirmdanger",onClick:()=>{let l=o;t.setPendingRemove(null),l!==null&&t.remove(l.thscode)}},a("confirmOk")))));return e(J,{open:!0,onClose:()=>t.close(),title:a("title"),headless:!0,shortcutModal:"watchlist",className:"capital-watchlist-dialog"},e("div",{className:"capital-watchlist-card",onKeyDown:u},e("div",{className:"capital-watchlist-header"},e("h2",{className:"capital-watchlist-title"},a("title")),e("button",{type:"button",className:"capital-watchlist-close","aria-label":a("close"),onClick:()=>t.close()},e(k,{size:14}))),e("div",{className:"capital-watchlist-search",onBlur:R},e("div",{className:"capital-watchlist-field"},e("span",{className:"capital-watchlist-searchicon"},e(W,{size:16})),e("input",{className:"capital-watchlist-input","data-modal-autofocus":!0,value:i.query,placeholder:a("searchPlaceholder"),onChange:l=>t.onQueryChange(l.target.value,l.isComposing),onCompositionStart:()=>t.beginComposition(),onCompositionEnd:l=>t.endComposition(l.target.value)}),i.query.length>0?e("button",{type:"button",className:"capital-watchlist-clear",title:a("clearInput"),"aria-label":a("clearInput"),onMouseDown:l=>l.preventDefault(),onClick:()=>t.onQueryChange("",!1)},e(k,{size:12})):null),z),i.addError!==null&&i.addError!==void 0?e("p",{className:"capital-watchlist-adderror",role:"status","data-code":i.addError.code},oa(a,i.addError)):null,I,A,e("div",{className:"capital-watchlist-footer"},e("div",{className:"capital-watchlist-footcol"},e("button",{type:"button",className:"capital-watchlist-refresh",disabled:i.refreshing||p,onClick:()=>{t.refresh()}},e(Y,{size:14}),i.refreshing?a("refreshing"):a("refresh")),T),e("span",{className:"capital-watchlist-updated"},`${a("updated")} ${i.refreshed_at===null||i.refreshed_at===void 0?a("notRefreshed"):P(i.refreshed_at)}`)),O))}function pa(r){r.effect(la,`${m}: styles`),r.effect(()=>r.locale.register(b,{zh:Z,en:aa}),`${m}: dictionaries`);let t=new Map,a=n=>{let o=t.get(n);return o===void 0&&(o=new y,t.set(n,o)),o};r.effect(()=>()=>{for(let n of t.values())n.dispose();t.clear()},`${m}: per-session surfaces`);let s=n=>{let c=r.sessions?.list?.getSnapshot?.().byId?.[n]?.projectionValues?.agentPreset;return typeof c=="string"?c:void 0},i=new Set,p=n=>{let o=s(n);return o!==void 0?o===V:(i.has(n)||(i.add(n),Promise.resolve(r.sessions?.refreshProjections?.(n)).catch(()=>{})),!1)};r.slots.inject(N,()=>r.slots.register({name:N,id:"capital-watchlist-dialog",order:3,locale:b,inject:n=>{let o=a(n);return{hooks:{dialog:o.state},surface:o}}},ca)),r.inject(["commandUi"],n=>{let o=r.locale.bind(b);n.effect(()=>n.commandUi.register({name:"watchlist",label:()=>o("command.label"),description:()=>o("command.description"),icon:Q,available:c=>p(c.sessionId),ui:{kind:"action",run:c=>{a(c.sessionId).open()}}}),`${m}: /watchlist contribution`)}),r.logger?.info?.(`${m}: \u5BA2\u6237\u7AEF\u534A\u8FB9\u5DF2\u6302\u8F7D\uFF08/watchlist \u83DC\u5355\u884C + \u81EA\u9009\u80A1\u5F39\u7A97\uFF09`)}exports.name=m;exports.inject=["slots","locale","commandUi","sessions"];exports.apply=pa;
|
|
180
|
+
return module.exports
|
|
181
|
+
},
|
|
182
|
+
})
|