cursor-feedback 1.1.1 → 2.0.0
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 +14 -0
- package/README.md +48 -4
- package/README_CN.md +48 -4
- package/dist/extension.js +546 -53
- package/dist/feishu.js +667 -0
- package/dist/i18n/en.json +49 -7
- package/dist/i18n/index.js +46 -4
- package/dist/i18n/zh-CN.json +49 -7
- package/dist/mcp-server.js +514 -20
- package/dist/webview/index.html +193 -43
- package/dist/webview/script.js +795 -145
- package/dist/webview/styles.css +921 -298
- package/package.json +38 -1
- package/.github/workflows/release-please.yml +0 -19
- package/.husky/pre-commit +0 -2
- package/.husky/pre-push +0 -1
- package/.versionrc.json +0 -15
- package/.vscode/launch.json +0 -28
- package/.vscode/tasks.json +0 -22
- package/.vscodeignore +0 -11
- package/demo.gif +0 -0
- package/dist/extension.js.map +0 -1
- package/dist/i18n/index.js.map +0 -1
- package/dist/mcp-server.js.map +0 -1
- package/icon.png +0 -0
- package/mcp-install-dark.png +0 -0
- package/resources/icon.svg +0 -4
- package/resources/vendor/marked.min.js +0 -69
- package/scripts/check-changelog.js +0 -42
- package/src/extension.ts +0 -692
- package/src/i18n/en.json +0 -34
- package/src/i18n/index.ts +0 -131
- package/src/i18n/zh-CN.json +0 -34
- package/src/mcp-server.ts +0 -768
- package/src/webview/index.html +0 -69
- package/src/webview/script.js +0 -318
- package/src/webview/styles.css +0 -422
- package/tsconfig.json +0 -17
package/dist/webview/index.html
CHANGED
|
@@ -6,62 +6,212 @@
|
|
|
6
6
|
<meta http-equiv="Content-Security-Policy" content="{{CSP}}">
|
|
7
7
|
<title>Cursor Feedback</title>
|
|
8
8
|
<script src="{{MARKED_JS_URI}}"></script>
|
|
9
|
+
<script src="{{HIGHLIGHT_JS_URI}}"></script>
|
|
9
10
|
<link rel="stylesheet" href="{{STYLES_CSS_URI}}">
|
|
10
11
|
</head>
|
|
11
12
|
<body>
|
|
12
|
-
<div class="
|
|
13
|
-
<!--
|
|
14
|
-
<
|
|
15
|
-
<span class="
|
|
16
|
-
<span id="serverStatusText">{{i18n.checkingConnection}}</span>
|
|
17
|
-
<
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
13
|
+
<div class="app">
|
|
14
|
+
<!-- 顶部状态栏 -->
|
|
15
|
+
<header id="serverStatus" class="statusbar">
|
|
16
|
+
<span class="statusbar__dot" aria-hidden="true"></span>
|
|
17
|
+
<span id="serverStatusText" class="statusbar__text">{{i18n.checkingConnection}}</span>
|
|
18
|
+
<div class="statusbar__actions">
|
|
19
|
+
<button id="langSwitchBtn" class="iconbtn" type="button" aria-label="Switch Language / 切换语言" data-tip="Switch Language / 切换语言">
|
|
20
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/></svg>
|
|
21
|
+
</button>
|
|
22
|
+
<button id="autoRetryBtn" class="iconbtn" type="button" aria-label="Timeout keep-waiting / 超时续期" data-tip="Timeout keep-waiting / 超时续期">
|
|
23
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"/><path d="M21 3v5h-5"/><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"/><path d="M3 21v-5h5"/></svg>
|
|
24
|
+
</button>
|
|
25
|
+
<button id="themeAccentBtn" class="iconbtn" type="button" aria-label="Accent color / 主题色" data-tip="Accent color / 主题色">
|
|
26
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"/><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"/><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"/><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"/><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.555C21.965 6.012 17.461 2 12 2z"/></svg>
|
|
27
|
+
</button>
|
|
28
|
+
<button id="feishuBtn" class="iconbtn" type="button" aria-label="{{i18n.notifySettingsTitle}}" data-tip="{{i18n.notifySettingsTitle}}">
|
|
29
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"/></svg>
|
|
30
|
+
</button>
|
|
31
|
+
<div class="debug">
|
|
32
|
+
<button id="debugIcon" class="iconbtn" type="button" aria-label="Debug Info">
|
|
33
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m8 2 1.88 1.88"/><path d="M14.12 3.88 16 2"/><path d="M9 7.13v-1a3.003 3.003 0 1 1 6 0v1"/><path d="M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6"/><path d="M12 20v-9"/><path d="M6.53 9C4.6 8.8 3 7.1 3 5"/><path d="M6 13H2"/><path d="M3 21c0-2.1 1.7-3.9 3.8-4"/><path d="M20.97 5c0 2.1-1.6 3.8-3.5 4"/><path d="M22 13h-4"/><path d="M17.2 17c2.1.1 3.8 1.9 3.8 4"/></svg>
|
|
34
|
+
</button>
|
|
35
|
+
<div id="debugTooltip" class="debug__tooltip"></div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</header>
|
|
39
|
+
|
|
40
|
+
<!-- 等待态 -->
|
|
41
|
+
<section id="waitingStatus" class="empty">
|
|
42
|
+
<div class="empty__icon" aria-hidden="true">
|
|
43
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
|
|
44
|
+
</div>
|
|
45
|
+
<p class="empty__title">{{i18n.waitingForAI}}</p>
|
|
46
|
+
<p class="empty__hint">{{i18n.waitingHint}}</p>
|
|
47
|
+
</section>
|
|
48
|
+
|
|
29
49
|
<!-- 反馈表单 -->
|
|
30
|
-
<
|
|
50
|
+
<main id="feedbackForm" class="form hidden">
|
|
31
51
|
<!-- AI 摘要 -->
|
|
32
|
-
<
|
|
33
|
-
<div class="
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
52
|
+
<section class="card card--summary" id="summaryCard">
|
|
53
|
+
<div class="card__head">
|
|
54
|
+
<span class="card__icon" aria-hidden="true">
|
|
55
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .962 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.962 0z"/><path d="M20 3v4"/><path d="M22 5h-4"/></svg>
|
|
56
|
+
</span>
|
|
57
|
+
<h2 class="card__title">{{i18n.aiSummary}}</h2>
|
|
58
|
+
</div>
|
|
59
|
+
<div id="summaryContent" class="summary markdown-body"></div>
|
|
60
|
+
<div id="projectInfo" class="project-chip"></div>
|
|
61
|
+
</section>
|
|
62
|
+
|
|
63
|
+
<!-- 可拖动分隔条:上下拖动调整摘要 / 反馈区高度 -->
|
|
64
|
+
<div id="splitter" class="splitter" role="separator" aria-orientation="horizontal"
|
|
65
|
+
aria-label="Drag to resize / 拖动调整高度" title="Drag to resize / 拖动调整高度"></div>
|
|
66
|
+
|
|
38
67
|
<!-- 反馈输入 -->
|
|
39
|
-
<
|
|
40
|
-
<div class="
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
68
|
+
<section class="card card--input">
|
|
69
|
+
<div class="card__head">
|
|
70
|
+
<span class="card__icon" aria-hidden="true">
|
|
71
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>
|
|
72
|
+
</span>
|
|
73
|
+
<h2 id="feedbackLabel" class="card__title">{{i18n.yourFeedback}}</h2>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<div class="composer">
|
|
77
|
+
<div id="refChips" class="ref-chips"></div>
|
|
78
|
+
<textarea id="feedbackInput" class="composer__input" rows="4"
|
|
79
|
+
aria-labelledby="feedbackLabel" placeholder="{{i18n.feedbackPlaceholder}}"></textarea>
|
|
80
|
+
<div class="composer__footer">
|
|
81
|
+
<div class="composer__tools">
|
|
82
|
+
<button id="uploadBtn" class="iconbtn" type="button" data-tip="{{i18n.uploadImage}}" aria-label="{{i18n.uploadImage}}">
|
|
83
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></svg>
|
|
84
|
+
</button>
|
|
85
|
+
<button id="selectPathBtn" class="iconbtn" type="button" data-tip="{{i18n.selectFilesOrFolders}}" aria-label="{{i18n.selectFilesOrFolders}}">
|
|
86
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"/></svg>
|
|
87
|
+
</button>
|
|
88
|
+
<button id="insertContextBtn" class="iconbtn" type="button" data-tip="{{i18n.insertSelection}}" aria-label="{{i18n.insertSelection}}">
|
|
89
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>
|
|
90
|
+
</button>
|
|
91
|
+
</div>
|
|
92
|
+
<span class="composer__hint">{{i18n.contextHint}}</span>
|
|
93
|
+
<span id="charCount" class="composer__count">0</span>
|
|
48
94
|
</div>
|
|
49
95
|
<input type="file" id="imageInput" accept="image/*" multiple class="hidden">
|
|
50
|
-
<div id="imagePreview" class="image-preview"></div>
|
|
51
|
-
<div id="fileList" class="file-list"></div>
|
|
52
96
|
</div>
|
|
53
|
-
|
|
54
|
-
<div id="
|
|
97
|
+
|
|
98
|
+
<div id="imagePreview" class="previews"></div>
|
|
99
|
+
</section>
|
|
100
|
+
|
|
101
|
+
</main>
|
|
102
|
+
|
|
103
|
+
<!-- 提交区(移出表单,贴底常驻,矮屏也不会被遮挡) -->
|
|
104
|
+
<footer id="submitBar" class="submitbar hidden">
|
|
105
|
+
<!-- 倒计时进度 -->
|
|
106
|
+
<div id="timeoutWrap" class="countdown" hidden>
|
|
107
|
+
<div class="countdown__track" role="progressbar" aria-label="Time remaining">
|
|
108
|
+
<div id="timeoutBar" class="countdown__bar"></div>
|
|
109
|
+
</div>
|
|
110
|
+
<span id="timeoutInfo" class="countdown__text"></span>
|
|
55
111
|
</div>
|
|
56
|
-
|
|
57
|
-
<!--
|
|
58
|
-
<div class="
|
|
59
|
-
<button id="submitBtn" class="
|
|
60
|
-
|
|
112
|
+
|
|
113
|
+
<!-- 提交按钮 -->
|
|
114
|
+
<div class="actions">
|
|
115
|
+
<button id="submitBtn" class="btn btn--primary" type="button">
|
|
116
|
+
<span class="btn__icon" aria-hidden="true">
|
|
117
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z"/><path d="m21.854 2.147-10.94 10.939"/></svg>
|
|
118
|
+
</span>
|
|
119
|
+
<span class="btn__spinner" aria-hidden="true"></span>
|
|
120
|
+
<span id="submitLabel" class="btn__label">{{i18n.submitFeedback}}</span>
|
|
121
|
+
<kbd id="submitKbd" class="btn__kbd">{{i18n.submitHintCtrl}}</kbd>
|
|
122
|
+
</button>
|
|
123
|
+
<button id="toggleKeyModeBtn" class="btn btn--ghost" type="button" title="{{i18n.toggleKeyMode}}" aria-label="{{i18n.toggleKeyMode}}">
|
|
124
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="M6 8h.001"/><path d="M10 8h.001"/><path d="M14 8h.001"/><path d="M18 8h.001"/><path d="M8 12h.001"/><path d="M12 12h.001"/><path d="M16 12h.001"/><path d="M7 16h10"/></svg>
|
|
125
|
+
</button>
|
|
126
|
+
</div>
|
|
127
|
+
</footer>
|
|
128
|
+
</div>
|
|
129
|
+
|
|
130
|
+
<!-- 拖拽上传遮罩 -->
|
|
131
|
+
<div id="dropOverlay" class="dropzone hidden" aria-hidden="true">
|
|
132
|
+
<div class="dropzone__inner">
|
|
133
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" x2="12" y1="3" y2="15"/></svg>
|
|
134
|
+
<span>{{i18n.dropToUpload}}</span>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
<!-- 图片放大查看 -->
|
|
139
|
+
<div id="lightbox" class="lightbox hidden" aria-hidden="true">
|
|
140
|
+
<img id="lightboxImg" class="lightbox__img" alt="">
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
<!-- 飞书通知配置弹窗 -->
|
|
144
|
+
<div id="feishuModal" class="feishu-modal hidden" aria-hidden="true">
|
|
145
|
+
<div class="feishu-modal__panel" role="dialog" aria-modal="true" aria-label="{{i18n.notifySettingsTitle}}">
|
|
146
|
+
<div class="feishu-modal__head">
|
|
147
|
+
<h3 class="feishu-modal__title">{{i18n.notifySettingsTitle}}</h3>
|
|
148
|
+
<button id="feishuCloseBtn" class="iconbtn" type="button" aria-label="{{i18n.feishuClose}}" data-tip="{{i18n.feishuClose}}">
|
|
149
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>
|
|
150
|
+
</button>
|
|
151
|
+
</div>
|
|
152
|
+
<!-- 区块①:插件通知(主)+ 子项:失焦时系统提示 -->
|
|
153
|
+
<div class="feishu-section">
|
|
154
|
+
<label class="feishu-switch">
|
|
155
|
+
<span class="feishu-switch__label feishu-switch__label--strong">{{i18n.systemNotifyLabel}}</span>
|
|
156
|
+
<input id="systemNotifyToggle" type="checkbox" class="feishu-switch__input">
|
|
157
|
+
<span class="feishu-switch__track"><span class="feishu-switch__thumb"></span></span>
|
|
158
|
+
</label>
|
|
159
|
+
<p class="feishu-modal__desc">{{i18n.pluginNotifyDesc}}</p>
|
|
160
|
+
<div id="osNotifySub" class="feishu-subitem">
|
|
161
|
+
<label class="feishu-switch">
|
|
162
|
+
<span class="feishu-switch__label">{{i18n.osNotifyLabel}}</span>
|
|
163
|
+
<input id="osNotifyToggle" type="checkbox" class="feishu-switch__input">
|
|
164
|
+
<span class="feishu-switch__track"><span class="feishu-switch__thumb"></span></span>
|
|
165
|
+
</label>
|
|
166
|
+
<p class="feishu-modal__desc feishu-modal__desc--sub">{{i18n.osNotifyDesc}}</p>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
<!-- 区块②:飞书通知(推送开关 + 凭证 + 绑定状态) -->
|
|
171
|
+
<div class="feishu-section">
|
|
172
|
+
<label class="feishu-switch">
|
|
173
|
+
<span class="feishu-switch__label feishu-switch__label--strong">{{i18n.feishuSettings}}</span>
|
|
174
|
+
<input id="feishuEnabledToggle" type="checkbox" class="feishu-switch__input">
|
|
175
|
+
<span class="feishu-switch__track"><span class="feishu-switch__thumb"></span></span>
|
|
176
|
+
</label>
|
|
177
|
+
<p class="feishu-modal__desc">{{i18n.feishuDesc}}</p>
|
|
178
|
+
<div id="feishuAckSub" class="feishu-subitem">
|
|
179
|
+
<label class="feishu-switch">
|
|
180
|
+
<span class="feishu-switch__label">{{i18n.feishuAckLabel}}</span>
|
|
181
|
+
<input id="feishuAckToggle" type="checkbox" class="feishu-switch__input">
|
|
182
|
+
<span class="feishu-switch__track"><span class="feishu-switch__thumb"></span></span>
|
|
183
|
+
</label>
|
|
184
|
+
<p class="feishu-modal__desc feishu-modal__desc--sub">{{i18n.feishuAckDesc}}</p>
|
|
185
|
+
</div>
|
|
186
|
+
<label class="feishu-field">
|
|
187
|
+
<span class="feishu-field__label">{{i18n.feishuAppId}}</span>
|
|
188
|
+
<input id="feishuAppId" class="feishu-input" type="text" placeholder="{{i18n.feishuAppIdPlaceholder}}" autocomplete="off" spellcheck="false">
|
|
189
|
+
</label>
|
|
190
|
+
<label class="feishu-field">
|
|
191
|
+
<span class="feishu-field__label">{{i18n.feishuAppSecret}}</span>
|
|
192
|
+
<div class="feishu-input-wrap">
|
|
193
|
+
<input id="feishuAppSecret" class="feishu-input" type="password" placeholder="{{i18n.feishuSecretPlaceholder}}" autocomplete="off" spellcheck="false">
|
|
194
|
+
<button id="feishuSecretToggle" class="feishu-eye" type="button" aria-label="{{i18n.showSecret}}" data-tip="{{i18n.showSecret}}">
|
|
195
|
+
<svg class="feishu-eye__icon feishu-eye__show" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>
|
|
196
|
+
<svg class="feishu-eye__icon feishu-eye__hide" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9.88 9.88a3 3 0 0 0 4.24 4.24"/><path d="M10.73 5.08A10.43 10.43 0 0 1 12 5c6.5 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68"/><path d="M6.61 6.61A13.526 13.526 0 0 0 2 12s3.5 7 10 7a9.74 9.74 0 0 0 5.39-1.61"/><line x1="2" x2="22" y1="2" y2="22"/></svg>
|
|
197
|
+
</button>
|
|
198
|
+
</div>
|
|
199
|
+
</label>
|
|
200
|
+
<div class="feishu-status">
|
|
201
|
+
<span id="feishuDot" class="feishu-status__dot"></span>
|
|
202
|
+
<span id="feishuStatusText" class="feishu-status__text">{{i18n.feishuStatusUnconfigured}}</span>
|
|
203
|
+
</div>
|
|
204
|
+
<div class="feishu-modal__actions">
|
|
205
|
+
<button id="feishuGuideBtn" class="feishu-link" type="button">{{i18n.feishuGuide}}</button>
|
|
206
|
+
</div>
|
|
207
|
+
<p class="feishu-modal__hint">{{i18n.feishuHint}}</p>
|
|
61
208
|
</div>
|
|
62
209
|
</div>
|
|
63
210
|
</div>
|
|
64
|
-
|
|
211
|
+
|
|
212
|
+
<!-- @ 文件引用浮层(fixed 定位,避免被裁切) -->
|
|
213
|
+
<div id="mentionPopup" class="mention-popup hidden" role="listbox" aria-label="{{i18n.mentionFiles}}"></div>
|
|
214
|
+
|
|
65
215
|
<!-- 注入 i18n 数据 -->
|
|
66
216
|
<script>window.i18n = {{I18N_JSON}};</script>
|
|
67
217
|
<script src="{{SCRIPT_JS_URI}}"></script>
|