yidaconnector 2026.6.11

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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +383 -0
  3. package/bin/yida.js +670 -0
  4. package/lib/app/form-navigation.js +58 -0
  5. package/lib/app/get-schema.js +538 -0
  6. package/lib/auth/auth.js +294 -0
  7. package/lib/auth/cdp-browser-login.js +390 -0
  8. package/lib/auth/codex-login.js +71 -0
  9. package/lib/auth/login.js +475 -0
  10. package/lib/auth/org.js +363 -0
  11. package/lib/auth/qr-login.js +1563 -0
  12. package/lib/core/chalk.js +384 -0
  13. package/lib/core/check-update.js +82 -0
  14. package/lib/core/cli-error.js +39 -0
  15. package/lib/core/command-manifest.js +106 -0
  16. package/lib/core/env-cmd.js +545 -0
  17. package/lib/core/env-manager.js +601 -0
  18. package/lib/core/env.js +287 -0
  19. package/lib/core/i18n.js +177 -0
  20. package/lib/core/locales/ar.js +805 -0
  21. package/lib/core/locales/de.js +805 -0
  22. package/lib/core/locales/en.js +1623 -0
  23. package/lib/core/locales/es.js +805 -0
  24. package/lib/core/locales/fr.js +805 -0
  25. package/lib/core/locales/hi.js +805 -0
  26. package/lib/core/locales/ja.js +1197 -0
  27. package/lib/core/locales/ko.js +807 -0
  28. package/lib/core/locales/pt.js +805 -0
  29. package/lib/core/locales/vi.js +805 -0
  30. package/lib/core/locales/zh-HK.js +1233 -0
  31. package/lib/core/locales/zh.js +1584 -0
  32. package/lib/core/query-data.js +781 -0
  33. package/lib/core/redact.js +100 -0
  34. package/lib/core/utils.js +799 -0
  35. package/lib/core/yida-client.js +117 -0
  36. package/package.json +94 -0
  37. package/project/config.json +4 -0
  38. package/project/pages/src/demo-birthday-game.oyd.jsx +832 -0
  39. package/project/pages/src/demo-chip-insight.oyd.jsx +983 -0
  40. package/project/pages/src/demo-compat-smoke.oyd.jsx +58 -0
  41. package/project/pages/src/demo-crm-batch-entry.oyd.jsx +805 -0
  42. package/project/pages/src/demo-crm-dashboard.oyd.jsx +677 -0
  43. package/project/pages/src/demo-future-vision-2026.oyd.jsx +1102 -0
  44. package/project/pages/src/demo-ppt.oyd.jsx +1192 -0
  45. package/project/pages/src/demo-salary-calculator.oyd.jsx +904 -0
  46. package/project/pages/src/yidaconnector-knowledge-doc.oyd.jsx +1714 -0
  47. package/project/prd/demo-birthday-game.md +39 -0
  48. package/project/prd/demo-crm.md +463 -0
  49. package/project/prd/demo-dingtalk-ai-solution-center.md +425 -0
  50. package/project/prd/demo-future-vision-2026.md +78 -0
  51. package/project/prd/demo-salary-calculator.md +101 -0
  52. package/scripts/build-skills-package.js +406 -0
  53. package/scripts/check-syntax.js +59 -0
  54. package/scripts/demo-dws.sh +106 -0
  55. package/scripts/e2e-real/cleanup.js +67 -0
  56. package/scripts/e2e-real/fixtures/form-fields.json +18 -0
  57. package/scripts/e2e-real/full-runner.js +1566 -0
  58. package/scripts/e2e-real/runner.js +293 -0
  59. package/scripts/e2e-real/skill-coverage.js +115 -0
  60. package/scripts/generate-command-docs.js +109 -0
  61. package/scripts/nightly-smoke.js +134 -0
  62. package/scripts/postinstall.js +545 -0
  63. package/scripts/solution-center-runner.js +368 -0
  64. package/scripts/validate-ci.sh +50 -0
  65. package/scripts/validate-command-manifest.js +119 -0
  66. package/scripts/validate-package-size.js +78 -0
  67. package/scripts/validate-skills.js +247 -0
  68. package/scripts/validate-structure.js +66 -0
  69. package/yida-skills/SKILL.md +163 -0
  70. package/yida-skills/references/yida-api.md +1309 -0
  71. package/yida-skills/skills/large-file-write/SKILL.md +91 -0
  72. package/yida-skills/skills/large-file-write/references/write-patterns.md +149 -0
  73. package/yida-skills/skills/large-file-write/scripts/write.js +157 -0
  74. package/yida-skills/skills/yida-data-management/SKILL.md +252 -0
  75. package/yida-skills/skills/yida-data-management/references/api-matrix.md +49 -0
  76. package/yida-skills/skills/yida-data-management/references/data-format-guide.md +159 -0
  77. package/yida-skills/skills/yida-data-management/references/verified-endpoints.md +62 -0
  78. package/yida-skills/skills/yida-login/SKILL.md +159 -0
  79. package/yida-skills/skills/yida-logout/SKILL.md +67 -0
@@ -0,0 +1,1714 @@
1
+ /**
2
+ * YidaConnector Knowledge Document
3
+ *
4
+ * A Notion-like read-only document page for YidaConnector knowledge records.
5
+ * It is intended to be opened from the assistant source links:
6
+ * /s/yidaconnector-doc#doc=<knowledge formInstId>
7
+ */
8
+
9
+ var MARKDOWN_IT_URL = 'https://g.alicdn.com/code/lib/markdown-it/13.0.1/markdown-it.min.js';
10
+ var REACT2_URL = 'https://g.alicdn.com/code/lib/react/18.2.0/umd/react.production.min.js';
11
+ var REACTDOM2_URL = 'https://g.alicdn.com/code/lib/react-dom/18.2.0/umd/react-dom.production.min.js';
12
+ var BLOCKNOTE_REACT_URL = 'https://esm.sh/@blocknote/react@0.51.2?deps=react@18.2.0,react-dom@18.2.0';
13
+ var BLOCKNOTE_MANTINE_URL = 'https://esm.sh/@blocknote/mantine@0.51.2?deps=react@18.2.0,react-dom@18.2.0,@mantine/core@8.3.11,@mantine/hooks@8.3.11';
14
+ var REACT2_ESM_URL = 'https://esm.sh/react@18.2.0';
15
+ var REACTDOM2_CLIENT_ESM_URL = 'https://esm.sh/react-dom@18.2.0/client';
16
+ var BLOCKNOTE_CORE_CSS_URL = 'https://cdn.jsdelivr.net/npm/@blocknote/core@0.51.2/fonts/inter.css';
17
+ var BLOCKNOTE_MANTINE_CSS_URL = 'https://cdn.jsdelivr.net/npm/@blocknote/mantine@0.51.2/style.css';
18
+ var APP_HOME_PATH = '/s/yidaconnector';
19
+ var DOC_SHARE_PATH = '/s/yidaconnector-doc';
20
+ var KNOWLEDGE_DATA_FORM_UUID = 'FORM-2FD50D15418B4C609998FFF364AF8DE0GJ7Z';
21
+ var KNOWLEDGE_DATA_FIELDS = {
22
+ title: 'textField_h8ys1jqwe',
23
+ type: 'selectField_h8ys2bliv',
24
+ keywords: 'textField_h8ys3733s',
25
+ summary: 'textareaField_h8ys4sf65',
26
+ body: 'textareaField_h8ys5mj70',
27
+ source: 'textField_h8ys6jhou',
28
+ status: 'selectField_h8ys7m5i7',
29
+ updatedAt: 'dateField_h8ys8icjo',
30
+ contributors: 'employeeField_pxnq1w9l6',
31
+ };
32
+ var EDIT_SUGGESTION_FORM_UUID = 'FORM-56E05195F4E84FF99A2B80A5E23222E26A5Z';
33
+ var EDIT_SUGGESTION_FIELDS = {
34
+ originalId: 'textField_sd0l1e1hm',
35
+ originalTitle: 'textField_sd0l2rxwn',
36
+ newTitle: 'textField_sd0l3ooan',
37
+ newCategory: 'selectField_sd0l4q2od',
38
+ newKeywords: 'textField_sd0l5yn0h',
39
+ newSummary: 'textareaField_sd0l6fa58',
40
+ newBody: 'textareaField_sd0l710x4',
41
+ editNote: 'textareaField_sd0l8tz9d',
42
+ submitter: 'employeeField_sd0l9b95r',
43
+ };
44
+ var KNOWLEDGE_QUERY_PAGE_SIZE = 100;
45
+ var KNOWLEDGE_CACHE_KEY = 'yidaconnector.knowledgeBase.cache.v1.' + KNOWLEDGE_DATA_FORM_UUID;
46
+ var KNOWLEDGE_CACHE_TTL_MS = 30 * 60 * 1000;
47
+ var KNOWLEDGE_CACHE_STALE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
48
+ var YIDA_SOURCE_ICON_DATA_URI = 'data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%201024%201024%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill%3D%22%230089ff%22%3E%3Cpath%20d%3D%22M966.743%200H57.498A57.197%2057.197%200%200%200%20.06%2057.077v218.07a61.772%2061.772%200%200%201%2012.042%204.936L348.538%20473.83l336.196-193.987a64.421%2064.421%200%200%201%2087.902%2023.36l34.92%2060.208a63.94%2063.94%200%200%201-23.24%2087.54L449.084%20643.613v379.905h517.78a57.197%2057.197%200%200%200%2056.714-56.594V57.077A57.197%2057.197%200%200%200%20966.743%200z%22%2F%3E%3Cpath%20d%3D%22M.663%20501.163v465.76a56.715%2056.715%200%200%200%2016.255%2040.34%2057.558%2057.558%200%200%200%2040.58%2016.255H252.93V646.141z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E';
49
+
50
+ var DOC_CSS = [
51
+ 'body{background:#050505!important;font-family:"-apple-system-body","ui-sans-serif","-apple-system","system-ui","Segoe UI","Helvetica","Apple Color Emoji","Arial","sans-serif","Segoe UI Emoji","Segoe UI Symbol"!important;-webkit-font-smoothing:antialiased;}',
52
+ '.next-aside-navigation{display:none!important;}',
53
+ '.next-shell-main{padding-left:0!important;}',
54
+ '.next-shell-sub-main{left:0!important;margin-left:0!important;width:100%!important;}',
55
+ '.next-shell-page,.next-shell-content,.next-shell-content-inner,.render-engine-container,.vc-jsx{height:100%!important;min-height:100vh!important;background:#050505!important;}',
56
+ '.vc-rootheader{display:none!important;}',
57
+ '.vc-page-yida-page,.vc-deep-container-entry.vc-rootcontent{background:#050505!important;}',
58
+ '.oy-doc-scroll{scrollbar-width:thin;scrollbar-color:#4a4a4a transparent;}',
59
+ '.oy-doc-scroll::-webkit-scrollbar{width:8px;height:8px;}',
60
+ '.oy-doc-scroll::-webkit-scrollbar-thumb{background:#4a4a4a;border-radius:999px;}',
61
+ '.oy-doc-markdown{font-size:16px;line-height:1.82;color:#f4f4f4;word-break:break-word;font-weight:400;}',
62
+ '.oy-doc-markdown h1,.oy-doc-markdown h2,.oy-doc-markdown h3{color:#fff;font-weight:650;line-height:1.28;letter-spacing:0;}',
63
+ '.oy-doc-markdown h1{font-size:32px;margin:0 0 22px;}',
64
+ '.oy-doc-markdown h2{font-size:24px;margin:38px 0 14px;}',
65
+ '.oy-doc-markdown h3{font-size:19px;margin:28px 0 10px;}',
66
+ '.oy-doc-markdown p{margin:0 0 18px;}',
67
+ '.oy-doc-markdown p:last-child{margin-bottom:0;}',
68
+ '.oy-doc-markdown strong{font-weight:650;color:#fff;}',
69
+ '.oy-doc-markdown ol,.oy-doc-markdown ul{margin:10px 0 22px 26px;padding:0;}',
70
+ '.oy-doc-markdown li{margin:7px 0;padding-left:5px;}',
71
+ '.oy-doc-markdown code{border:1px solid #393939;border-radius:5px;background:#202020;color:#f5f5f5;padding:2px 6px;font-family:Menlo,Consolas,monospace;font-size:.88em;}',
72
+ '.oy-doc-markdown pre{margin:18px 0;padding:16px 18px;border:1px solid #343434;border-radius:8px;background:#171717;color:#e7e7e7;overflow:auto;}',
73
+ '.oy-doc-markdown pre code{border:0;background:transparent;color:inherit;padding:0;}',
74
+ '.oy-doc-markdown blockquote{margin:18px 0;padding:13px 16px;border-left:3px solid #0089ff;background:#101923;color:#dcecff;border-radius:0 8px 8px 0;}',
75
+ '.oy-doc-markdown a{color:#9dccff;text-decoration:underline;text-underline-offset:4px;font-weight:650;}',
76
+ '.oy-doc-markdown table{border-collapse:collapse;width:100%;margin:18px 0;font-size:14px;}',
77
+ '.oy-doc-markdown th,.oy-doc-markdown td{border:1px solid #343434;padding:9px 11px;text-align:left;}',
78
+ '.oy-doc-markdown th{background:#202020;font-weight:650;color:#fff;}',
79
+ '.oy-doc-blocknote-host{position:relative;margin-top:0;}',
80
+ '.oy-doc-blocknote-frame{display:block;width:100%;min-height:220px;border:0;background:#050505;overflow:hidden;}',
81
+ '.oy-doc-blocknote-host[data-blocknote-ready="true"] .oy-doc-blocknote-fallback{display:none!important;}',
82
+ ].join('\n');
83
+
84
+ var _blockNoteMountKey = '';
85
+ var _blockNoteMountTimer = null;
86
+ var _blockNoteMessageHandler = null;
87
+
88
+ var _customState = {
89
+ ready: false,
90
+ status: 'loading',
91
+ docId: '',
92
+ record: null,
93
+ docs: [],
94
+ error: '',
95
+ markdownReady: false,
96
+ };
97
+
98
+ var _editState = {
99
+ editing: false,
100
+ submitting: false,
101
+ editTitle: '',
102
+ editCategory: '',
103
+ editKeywords: '',
104
+ editSummary: '',
105
+ editBody: '',
106
+ editNote: '',
107
+ editError: '',
108
+ };
109
+
110
+ function getSearchDataList(res) {
111
+ return (res && res.data) || (res && res.content && res.content.data) || [];
112
+ }
113
+
114
+ function getRowFormData(row) {
115
+ return (row && row.formData) || (row && row.data) || {};
116
+ }
117
+
118
+ function getRowId(row) {
119
+ return row && (row.formInstId || row.instId || row.id) ? String(row.formInstId || row.instId || row.id) : '';
120
+ }
121
+
122
+ function normalizeKnowledgeValue(value) {
123
+ if (value === undefined || value === null) {
124
+ return '';
125
+ }
126
+ if (Array.isArray(value)) {
127
+ return value.map((item) => normalizeKnowledgeValue(item)).filter(Boolean).join('、');
128
+ }
129
+ if (typeof value === 'object') {
130
+ if (value.value !== undefined) {
131
+ return normalizeKnowledgeValue(value.value);
132
+ }
133
+ if (value.text !== undefined) {
134
+ return normalizeKnowledgeValue(value.text);
135
+ }
136
+ if (value.zh_CN !== undefined) {
137
+ return normalizeKnowledgeValue(value.zh_CN);
138
+ }
139
+ return JSON.stringify(value);
140
+ }
141
+ return String(value || '');
142
+ }
143
+
144
+ function normalizeText(value) {
145
+ return String(value || '').trim();
146
+ }
147
+
148
+ function parseSearchParams(raw) {
149
+ var params = {};
150
+ var text = String(raw || '').replace(/^[?#]/, '');
151
+ if (!text) {
152
+ return params;
153
+ }
154
+ try {
155
+ var search = new URLSearchParams(text);
156
+ search.forEach(function(value, key) {
157
+ params[key] = value;
158
+ });
159
+ } catch (err) {
160
+ text.split('&').forEach(function(part) {
161
+ var pair = part.split('=');
162
+ if (pair[0]) {
163
+ params[decodeURIComponent(pair[0])] = decodeURIComponent(pair.slice(1).join('=') || '');
164
+ }
165
+ });
166
+ }
167
+ return params;
168
+ }
169
+
170
+ function readDocIdFromLocation() {
171
+ if (typeof window === 'undefined' || !window.location) {
172
+ return '';
173
+ }
174
+ var fromQuery = parseSearchParams(window.location.search || '');
175
+ var fromHash = parseSearchParams(window.location.hash || '');
176
+ return fromQuery.doc || fromQuery.id || fromQuery.formInstId || fromHash.doc || fromHash.id || fromHash.formInstId || '';
177
+ }
178
+
179
+ function getAliworkOrigin() {
180
+ if (typeof window !== 'undefined' && window.location && window.location.origin && /(^|\.)aliwork\.com$/.test(window.location.hostname || '')) {
181
+ return String(window.location.origin || '').replace(/\/+$/, '');
182
+ }
183
+ return 'https://demo.aliwork.com';
184
+ }
185
+
186
+ function getAppHomeUrl() {
187
+ return getAliworkOrigin() + APP_HOME_PATH;
188
+ }
189
+
190
+ function getDocUrl(docId) {
191
+ var baseUrl = getAliworkOrigin() + DOC_SHARE_PATH;
192
+ if (!docId) {
193
+ return baseUrl;
194
+ }
195
+ return baseUrl + '#doc=' + encodeURIComponent(docId);
196
+ }
197
+
198
+ function escapeHtml(value) {
199
+ return String(value || '')
200
+ .replace(/&/g, '&amp;')
201
+ .replace(/</g, '&lt;')
202
+ .replace(/>/g, '&gt;')
203
+ .replace(/"/g, '&quot;')
204
+ .replace(/'/g, '&#39;');
205
+ }
206
+
207
+ function inlineFallbackMarkdown(value) {
208
+ var escaped = escapeHtml(value);
209
+ escaped = escaped.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
210
+ escaped = escaped.replace(/`([^`]+)`/g, '<code>$1</code>');
211
+ escaped = escaped.replace(/\[([^\]]+)\]\((https?:\/\/[^)]+)\)/g, '<a href="$2" target="_blank" rel="noreferrer">$1</a>');
212
+ return escaped;
213
+ }
214
+
215
+ function fallbackMarkdownToHtml(text) {
216
+ var lines = String(text || '').split('\n');
217
+ var html = [];
218
+ var listOpen = false;
219
+ lines.forEach((line) => {
220
+ var heading = line.match(/^(#{1,3})\s+(.+)$/);
221
+ var ordered = line.match(/^\s*\d+\.\s+(.+)$/);
222
+ var unordered = line.match(/^\s*[-*]\s+(.+)$/);
223
+ if (heading) {
224
+ if (listOpen) {
225
+ html.push('</ul>');
226
+ listOpen = false;
227
+ }
228
+ html.push('<h' + heading[1].length + '>' + inlineFallbackMarkdown(heading[2]) + '</h' + heading[1].length + '>');
229
+ return;
230
+ }
231
+ if (ordered || unordered) {
232
+ if (!listOpen) {
233
+ html.push('<ul>');
234
+ listOpen = true;
235
+ }
236
+ html.push('<li>' + inlineFallbackMarkdown((ordered || unordered)[1]) + '</li>');
237
+ return;
238
+ }
239
+ if (listOpen) {
240
+ html.push('</ul>');
241
+ listOpen = false;
242
+ }
243
+ if (!line.trim()) {
244
+ html.push('');
245
+ return;
246
+ }
247
+ html.push('<p>' + inlineFallbackMarkdown(line) + '</p>');
248
+ });
249
+ if (listOpen) {
250
+ html.push('</ul>');
251
+ }
252
+ return html.join('');
253
+ }
254
+
255
+ function markdownToHtml(text) {
256
+ if (typeof window !== 'undefined' && window.markdownit) {
257
+ if (!window.__openYidaKnowledgeMarkdownIt) {
258
+ window.__openYidaKnowledgeMarkdownIt = window.markdownit({
259
+ html: false,
260
+ linkify: true,
261
+ breaks: true,
262
+ });
263
+ }
264
+ return window.__openYidaKnowledgeMarkdownIt.render(String(text || ''));
265
+ }
266
+ return fallbackMarkdownToHtml(text);
267
+ }
268
+
269
+ function sanitizeDomId(value) {
270
+ return String(value || 'doc').replace(/[^a-zA-Z0-9_-]+/g, '-').slice(0, 80) || 'doc';
271
+ }
272
+
273
+ function getBlockNoteHostId(docId) {
274
+ return 'oy-blocknote-host-' + sanitizeDomId(docId || _customState.docId || 'doc');
275
+ }
276
+
277
+ function getBlockNoteFrameId(docId) {
278
+ return 'oy-blocknote-frame-' + sanitizeDomId(docId || _customState.docId || 'doc');
279
+ }
280
+
281
+ function jsonForHtml(value) {
282
+ return JSON.stringify(value || {})
283
+ .replace(/</g, '\\u003c')
284
+ .replace(/>/g, '\\u003e')
285
+ .replace(/&/g, '\\u0026')
286
+ .replace(/\u2028/g, '\\u2028')
287
+ .replace(/\u2029/g, '\\u2029');
288
+ }
289
+
290
+ function createBlockNoteBlock(type, content, props) {
291
+ var text = normalizeText(content);
292
+ if (!text) {
293
+ return null;
294
+ }
295
+ return {
296
+ type: type || 'paragraph',
297
+ props: props || {},
298
+ content: text,
299
+ };
300
+ }
301
+
302
+ function markdownToBlockNoteBlocks(text) {
303
+ var lines = String(text || '').replace(/\r\n/g, '\n').split('\n');
304
+ var blocks = [];
305
+ var paragraph = [];
306
+ var codeLines = [];
307
+ var inCode = false;
308
+
309
+ function flushParagraph() {
310
+ if (!paragraph.length) {
311
+ return;
312
+ }
313
+ var block = createBlockNoteBlock('paragraph', paragraph.join('\n'));
314
+ if (block) {
315
+ blocks.push(block);
316
+ }
317
+ paragraph = [];
318
+ }
319
+
320
+ function flushCode() {
321
+ if (!codeLines.length) {
322
+ return;
323
+ }
324
+ var block = createBlockNoteBlock('codeBlock', codeLines.join('\n'));
325
+ if (block) {
326
+ blocks.push(block);
327
+ }
328
+ codeLines = [];
329
+ }
330
+
331
+ lines.forEach((rawLine) => {
332
+ var line = String(rawLine || '');
333
+ var trimmed = line.trim();
334
+ if (/^```/.test(trimmed)) {
335
+ if (inCode) {
336
+ flushCode();
337
+ inCode = false;
338
+ } else {
339
+ flushParagraph();
340
+ inCode = true;
341
+ }
342
+ return;
343
+ }
344
+ if (inCode) {
345
+ codeLines.push(line);
346
+ return;
347
+ }
348
+ if (!trimmed) {
349
+ flushParagraph();
350
+ return;
351
+ }
352
+ var heading = trimmed.match(/^(#{1,3})\s+(.+)$/);
353
+ var ordered = trimmed.match(/^\d+\.\s+(.+)$/);
354
+ var bullet = trimmed.match(/^[-*]\s+(.+)$/);
355
+ if (heading) {
356
+ flushParagraph();
357
+ blocks.push(createBlockNoteBlock('heading', heading[2], { level: heading[1].length }));
358
+ return;
359
+ }
360
+ if (ordered) {
361
+ flushParagraph();
362
+ blocks.push(createBlockNoteBlock('numberedListItem', ordered[1]));
363
+ return;
364
+ }
365
+ if (bullet) {
366
+ flushParagraph();
367
+ blocks.push(createBlockNoteBlock('bulletListItem', bullet[1]));
368
+ return;
369
+ }
370
+ if (/^>\s+/.test(trimmed)) {
371
+ flushParagraph();
372
+ blocks.push(createBlockNoteBlock('quote', trimmed.replace(/^>\s+/, '')));
373
+ return;
374
+ }
375
+ paragraph.push(trimmed);
376
+ });
377
+ if (inCode) {
378
+ flushCode();
379
+ }
380
+ flushParagraph();
381
+ return blocks.filter(Boolean).length ? blocks.filter(Boolean) : [createBlockNoteBlock('paragraph', '这条知识记录还没有正文内容。')];
382
+ }
383
+
384
+ function createBlockNoteSrcDoc(record) {
385
+ var blocks = markdownToBlockNoteBlocks(buildDocumentMarkdown(record));
386
+ var payload = {
387
+ frameId: getBlockNoteFrameId(record && record.id),
388
+ title: record && record.title ? record.title : 'YidaConnector 知识库',
389
+ blocks: blocks,
390
+ };
391
+ var moduleScript = [
392
+ "var notify = function(message) {",
393
+ " try { parent.postMessage(Object.assign({ source: 'yidaconnector-blocknote', frameId: data.frameId }, message), '*'); } catch (err) {}",
394
+ "};",
395
+ "window.addEventListener('error', function(event) { notify({ status: 'error', error: event && event.message ? event.message : 'BlockNote load failed' }); });",
396
+ "window.addEventListener('unhandledrejection', function(event) { notify({ status: 'error', error: event && event.reason && event.reason.message ? event.reason.message : 'BlockNote load failed' }); });",
397
+ "import React from '" + REACT2_ESM_URL + "';",
398
+ "import { createRoot } from '" + REACTDOM2_CLIENT_ESM_URL + "';",
399
+ "import { useCreateBlockNote } from '" + BLOCKNOTE_REACT_URL + "';",
400
+ "import { BlockNoteView } from '" + BLOCKNOTE_MANTINE_URL + "';",
401
+ "window.react2Module = React;",
402
+ "window.reactDom2Client = { createRoot: createRoot };",
403
+ "function resize() {",
404
+ " var height = Math.max(220, Math.ceil(document.documentElement.scrollHeight || document.body.scrollHeight || 220));",
405
+ " notify({ status: 'ready', height: height });",
406
+ "}",
407
+ "function App() {",
408
+ " var editor = useCreateBlockNote({ initialContent: data.blocks });",
409
+ " return React.createElement(BlockNoteView, { editor: editor, editable: false, theme: 'dark', formattingToolbar: false, sideMenu: false, slashMenu: false, emojiPicker: false, filePanel: false, tableHandles: false });",
410
+ "}",
411
+ "try {",
412
+ " createRoot(document.getElementById('root')).render(React.createElement(App));",
413
+ " if (window.ResizeObserver) { new ResizeObserver(resize).observe(document.body); }",
414
+ " setTimeout(resize, 160);",
415
+ " setTimeout(resize, 800);",
416
+ "} catch (err) {",
417
+ " notify({ status: 'error', error: err && err.message ? err.message : 'BlockNote render failed' });",
418
+ "}"
419
+ ].join('\n');
420
+ return [
421
+ '<!doctype html>',
422
+ '<html>',
423
+ '<head>',
424
+ '<meta charset="utf-8">',
425
+ '<meta name="viewport" content="width=device-width,initial-scale=1">',
426
+ '<link rel="stylesheet" href="' + BLOCKNOTE_CORE_CSS_URL + '">',
427
+ '<link rel="stylesheet" href="' + BLOCKNOTE_MANTINE_CSS_URL + '">',
428
+ '<style>',
429
+ 'html,body,#root{margin:0;min-height:220px;background:#050505;color:#f4f4f4;font-family:"-apple-system-body","ui-sans-serif","-apple-system","system-ui","Segoe UI","Helvetica","Arial","sans-serif";}',
430
+ 'body{overflow:hidden;}',
431
+ '.bn-container,.bn-editor{background:#050505!important;color:#f4f4f4!important;}',
432
+ '.bn-editor{padding:0!important;}',
433
+ '.bn-block-content{font-size:16px;line-height:1.82;}',
434
+ '.bn-block-content[data-content-type="heading"]{font-weight:700;color:#fff;}',
435
+ '.bn-default-styles{--bn-colors-editor-background:#050505;--bn-colors-menu-background:#171717;--bn-colors-tooltip-background:#242424;--bn-colors-hovered-background:#202020;--bn-colors-selected-background:#17253a;--bn-colors-text:#f4f4f4;--bn-colors-side-menu:#9b9b9b;}',
436
+ '</style>',
437
+ '</head>',
438
+ '<body>',
439
+ '<script src="' + REACT2_URL + '"></script>',
440
+ '<script src="' + REACTDOM2_URL + '"></script>',
441
+ '<script>window.react2=window.React;window.reactDom2=window.ReactDOM;</script>',
442
+ '<script id="bn-data" type="application/json">' + jsonForHtml(payload) + '</script>',
443
+ '<div id="root"></div>',
444
+ '<script type="module">var data = JSON.parse(document.getElementById("bn-data").textContent || "{}");\n' + moduleScript + '</script>',
445
+ '</body>',
446
+ '</html>'
447
+ ].join('');
448
+ }
449
+
450
+ function buildKnowledgeRecord(row) {
451
+ var formData = getRowFormData(row);
452
+ var rawContributors = formData[KNOWLEDGE_DATA_FIELDS.contributors];
453
+ var contributors = [];
454
+ if (Array.isArray(rawContributors)) {
455
+ contributors = rawContributors.map(function (item) {
456
+ if (typeof item === 'string') return item;
457
+ if (item && item.label) return item.label;
458
+ if (item && item.value) return item.value;
459
+ return '';
460
+ }).filter(Boolean);
461
+ } else if (rawContributors && typeof rawContributors === 'string') {
462
+ contributors = rawContributors.split(/[,,]/).map(function (s) { return s.trim(); }).filter(Boolean);
463
+ }
464
+ return {
465
+ id: getRowId(row),
466
+ title: normalizeKnowledgeValue(formData[KNOWLEDGE_DATA_FIELDS.title]) || '未命名资料',
467
+ type: normalizeKnowledgeValue(formData[KNOWLEDGE_DATA_FIELDS.type]) || '知识库',
468
+ keywords: normalizeKnowledgeValue(formData[KNOWLEDGE_DATA_FIELDS.keywords]),
469
+ summary: normalizeKnowledgeValue(formData[KNOWLEDGE_DATA_FIELDS.summary]),
470
+ body: normalizeKnowledgeValue(formData[KNOWLEDGE_DATA_FIELDS.body]),
471
+ source: normalizeKnowledgeValue(formData[KNOWLEDGE_DATA_FIELDS.source]) || 'YidaConnector 助手知识库',
472
+ status: normalizeKnowledgeValue(formData[KNOWLEDGE_DATA_FIELDS.status]),
473
+ updatedAt: formData[KNOWLEDGE_DATA_FIELDS.updatedAt],
474
+ contributors: contributors,
475
+ };
476
+ }
477
+
478
+ function canUseKnowledgeCache() {
479
+ if (typeof window === 'undefined' || !window.localStorage) {
480
+ return false;
481
+ }
482
+ try {
483
+ var probeKey = KNOWLEDGE_CACHE_KEY + '.probe';
484
+ window.localStorage.setItem(probeKey, '1');
485
+ window.localStorage.removeItem(probeKey);
486
+ return true;
487
+ } catch (err) {
488
+ return false;
489
+ }
490
+ }
491
+
492
+ function normalizeKnowledgeCacheRecord(record) {
493
+ var id = record && record.id ? String(record.id) : '';
494
+ if (!id) {
495
+ return null;
496
+ }
497
+ return {
498
+ id: id,
499
+ title: normalizeKnowledgeValue(record.title) || '未命名资料',
500
+ type: normalizeKnowledgeValue(record.type) || '知识库',
501
+ keywords: normalizeKnowledgeValue(record.keywords),
502
+ summary: normalizeKnowledgeValue(record.summary),
503
+ body: normalizeKnowledgeValue(record.body),
504
+ source: normalizeKnowledgeValue(record.source) || 'YidaConnector 助手知识库',
505
+ status: normalizeKnowledgeValue(record.status),
506
+ updatedAt: record.updatedAt || '',
507
+ };
508
+ }
509
+
510
+ function normalizeKnowledgeCacheRecords(records) {
511
+ return (records || []).map((record) => normalizeKnowledgeCacheRecord(record)).filter(Boolean);
512
+ }
513
+
514
+ function readKnowledgeCache(options) {
515
+ if (!canUseKnowledgeCache()) {
516
+ return null;
517
+ }
518
+ try {
519
+ var raw = window.localStorage.getItem(KNOWLEDGE_CACHE_KEY);
520
+ if (!raw) {
521
+ return null;
522
+ }
523
+ var payload = JSON.parse(raw);
524
+ var cachedAt = Number(payload && payload.cachedAt ? payload.cachedAt : 0);
525
+ var age = new Date().getTime() - cachedAt;
526
+ if (!payload || payload.formUuid !== KNOWLEDGE_DATA_FORM_UUID || !cachedAt || age > KNOWLEDGE_CACHE_STALE_TTL_MS) {
527
+ window.localStorage.removeItem(KNOWLEDGE_CACHE_KEY);
528
+ return null;
529
+ }
530
+ if (!(options && options.allowStale) && age > KNOWLEDGE_CACHE_TTL_MS) {
531
+ return null;
532
+ }
533
+ var records = normalizeKnowledgeCacheRecords(payload.records || []);
534
+ if (!records.length) {
535
+ return null;
536
+ }
537
+ return {
538
+ records: records,
539
+ cachedAt: cachedAt,
540
+ fresh: age <= KNOWLEDGE_CACHE_TTL_MS,
541
+ };
542
+ } catch (err) {
543
+ return null;
544
+ }
545
+ }
546
+
547
+ function writeKnowledgeCache(records) {
548
+ if (!canUseKnowledgeCache()) {
549
+ return;
550
+ }
551
+ var normalized = normalizeKnowledgeCacheRecords(records).slice(0, KNOWLEDGE_QUERY_PAGE_SIZE);
552
+ if (!normalized.length) {
553
+ return;
554
+ }
555
+ try {
556
+ window.localStorage.setItem(KNOWLEDGE_CACHE_KEY, JSON.stringify({
557
+ formUuid: KNOWLEDGE_DATA_FORM_UUID,
558
+ cachedAt: new Date().getTime(),
559
+ records: normalized,
560
+ }));
561
+ } catch (err) {
562
+ try {
563
+ window.localStorage.removeItem(KNOWLEDGE_CACHE_KEY);
564
+ } catch (removeErr) {}
565
+ }
566
+ }
567
+
568
+ function formatDate(value) {
569
+ if (!value) {
570
+ return '';
571
+ }
572
+ var date = null;
573
+ if (typeof value === 'number') {
574
+ date = new Date(value);
575
+ } else if (/^\d+$/.test(String(value))) {
576
+ date = new Date(Number(value));
577
+ } else {
578
+ date = new Date(value);
579
+ }
580
+ if (!date || isNaN(date.getTime())) {
581
+ return String(value);
582
+ }
583
+ var year = date.getFullYear();
584
+ var rawMonth = date.getMonth() + 1;
585
+ var rawDay = date.getDate();
586
+ var month = rawMonth < 10 ? '0' + rawMonth : String(rawMonth);
587
+ var day = rawDay < 10 ? '0' + rawDay : String(rawDay);
588
+ return year + '-' + month + '-' + day;
589
+ }
590
+
591
+ function buildDocumentMarkdown(record) {
592
+ if (!record) {
593
+ return '';
594
+ }
595
+ var body = normalizeText(record.body);
596
+ if (body) {
597
+ return body;
598
+ }
599
+ return normalizeText(record.summary) || '这条知识记录还没有正文内容。';
600
+ }
601
+
602
+ function canUseKnowledgeSearch(ctx) {
603
+ return !!(ctx && ctx.utils && ctx.utils.yida && ctx.utils.yida.searchFormDatas);
604
+ }
605
+
606
+ function findKnowledgeRecord(docs, docId) {
607
+ var record = null;
608
+ (docs || []).forEach((item) => {
609
+ if (docId && item && item.id === docId) {
610
+ record = item;
611
+ }
612
+ });
613
+ return record;
614
+ }
615
+
616
+ function buildDocumentState(docId, docs) {
617
+ if (!docId) {
618
+ return {
619
+ status: 'list',
620
+ docs: docs,
621
+ record: null,
622
+ error: '',
623
+ };
624
+ }
625
+ var record = findKnowledgeRecord(docs, docId);
626
+ if (!record) {
627
+ return {
628
+ status: 'error',
629
+ docs: docs,
630
+ record: null,
631
+ error: '没有找到这条资料,可能已停用或链接已失效。',
632
+ };
633
+ }
634
+ return {
635
+ status: 'ready',
636
+ docs: docs,
637
+ record: record,
638
+ error: '',
639
+ };
640
+ }
641
+
642
+ function updateDocumentTitle(record) {
643
+ if (typeof document === 'undefined') {
644
+ return;
645
+ }
646
+ var title = record && record.title ? record.title + ' - YidaConnector 知识库' : 'YidaConnector 知识库';
647
+ document.title = title;
648
+ }
649
+
650
+ export function getCustomState(key) {
651
+ if (key) {
652
+ return _customState[key];
653
+ }
654
+ return Object.assign({}, _customState);
655
+ }
656
+
657
+ export function setCustomState(newState) {
658
+ Object.keys(newState || {}).forEach((key) => {
659
+ _customState[key] = newState[key];
660
+ });
661
+ updateDocumentTitle(_customState.record);
662
+ this.forceUpdate();
663
+ if (_customState.status === 'ready') {
664
+ this.scheduleBlockNoteMount();
665
+ }
666
+ }
667
+
668
+ export function forceUpdate() {
669
+ this.setState({ timestamp: new Date().getTime() });
670
+ }
671
+
672
+ export function loadExternalScript(src) {
673
+ if (typeof window !== 'undefined' && window.markdownit) {
674
+ return Promise.resolve();
675
+ }
676
+ if (this.utils && this.utils.loadScript) {
677
+ return this.utils.loadScript(src);
678
+ }
679
+ return new Promise((resolve, reject) => {
680
+ if (typeof document === 'undefined') {
681
+ reject(new Error('document unavailable'));
682
+ return;
683
+ }
684
+ var existed = document.querySelector('script[src="' + src + '"]');
685
+ if (existed) {
686
+ resolve();
687
+ return;
688
+ }
689
+ var script = document.createElement('script');
690
+ script.src = src;
691
+ script.async = true;
692
+ script.onload = function() {
693
+ resolve();
694
+ };
695
+ script.onerror = function() {
696
+ reject(new Error('script load failed'));
697
+ };
698
+ document.head.appendChild(script);
699
+ });
700
+ }
701
+
702
+ export function loadMarkdownRenderer() {
703
+ var self = this;
704
+ return this.loadExternalScript(MARKDOWN_IT_URL).then(function() {
705
+ self.setCustomState({ markdownReady: true });
706
+ }).catch(function() {
707
+ self.setCustomState({ markdownReady: false });
708
+ });
709
+ }
710
+
711
+ export function scheduleBlockNoteMount() {
712
+ var self = this;
713
+ if (_blockNoteMountTimer) {
714
+ clearTimeout(_blockNoteMountTimer);
715
+ }
716
+ _blockNoteMountTimer = setTimeout(function() {
717
+ self.mountBlockNoteDocument();
718
+ }, 80);
719
+ }
720
+
721
+ export function handleBlockNoteMessage(event) {
722
+ var data = event && event.data ? event.data : null;
723
+ if (!data || data.source !== 'yidaconnector-blocknote' || !data.frameId || typeof document === 'undefined') {
724
+ return;
725
+ }
726
+ var frame = document.getElementById(data.frameId);
727
+ if (!frame) {
728
+ return;
729
+ }
730
+ var host = frame.parentNode;
731
+ if (data.status === 'ready') {
732
+ host.setAttribute('data-blocknote-ready', 'true');
733
+ if (data.height) {
734
+ frame.style.height = Math.max(220, Math.min(Number(data.height) || 220, 2400)) + 'px';
735
+ }
736
+ } else if (data.status === 'error') {
737
+ host.setAttribute('data-blocknote-ready', 'false');
738
+ host.setAttribute('data-blocknote-error', data.error || 'load-error');
739
+ }
740
+ }
741
+
742
+ export function mountBlockNoteDocument() {
743
+ if (typeof document === 'undefined' || !_customState.record || !_customState.record.id) {
744
+ return;
745
+ }
746
+ var record = _customState.record;
747
+ var host = document.getElementById(getBlockNoteHostId(record.id));
748
+ if (!host) {
749
+ return;
750
+ }
751
+ var mountKey = record.id + ':' + String(record.updatedAt || '') + ':' + String(record.body || record.summary || '').length;
752
+ if (host.getAttribute('data-blocknote-key') === mountKey) {
753
+ return;
754
+ }
755
+ var oldFrame = host.querySelector('iframe.oy-doc-blocknote-frame');
756
+ if (oldFrame && oldFrame.parentNode) {
757
+ oldFrame.parentNode.removeChild(oldFrame);
758
+ }
759
+ host.setAttribute('data-blocknote-key', mountKey);
760
+ host.setAttribute('data-blocknote-ready', 'false');
761
+ var frame = document.createElement('iframe');
762
+ frame.id = getBlockNoteFrameId(record.id);
763
+ frame.className = 'oy-doc-blocknote-frame';
764
+ frame.title = record.title || 'YidaConnector Knowledge';
765
+ frame.style.height = '260px';
766
+ frame.setAttribute('loading', 'lazy');
767
+ frame.srcdoc = createBlockNoteSrcDoc(record);
768
+ host.insertBefore(frame, host.firstChild);
769
+ _blockNoteMountKey = mountKey;
770
+ }
771
+
772
+ export function loadDocument(options) {
773
+ var self = this;
774
+ var docId = readDocIdFromLocation();
775
+ var forceRefresh = !!(options && options.forceRefresh);
776
+
777
+ if (!docId) {
778
+ this.setCustomState({
779
+ ready: true,
780
+ status: 'error',
781
+ docId: '',
782
+ error: '链接中没有指定文档 ID,请从 YidaConnector 助手的资料来源链接进入。',
783
+ });
784
+ return;
785
+ }
786
+
787
+ var cached = forceRefresh ? null : readKnowledgeCache({ allowStale: true });
788
+ if (cached && cached.records.length) {
789
+ var cachedRecord = findKnowledgeRecord(cached.records, docId);
790
+ if (cachedRecord) {
791
+ this.setCustomState({
792
+ ready: true,
793
+ status: 'ready',
794
+ docId: docId,
795
+ docs: cached.records,
796
+ record: cachedRecord,
797
+ error: '',
798
+ });
799
+ if (cached.fresh) {
800
+ return;
801
+ }
802
+ }
803
+ }
804
+
805
+ if (!canUseKnowledgeSearch(this)) {
806
+ if (!(_customState.status === 'ready' && _customState.record)) {
807
+ this.setCustomState({
808
+ ready: true,
809
+ status: 'error',
810
+ docId: docId,
811
+ error: '当前页面没有可用的宜搭知识库查询能力。',
812
+ });
813
+ }
814
+ return;
815
+ }
816
+
817
+ if (_customState.status !== 'ready') {
818
+ this.setCustomState({
819
+ ready: true,
820
+ status: 'loading',
821
+ docId: docId,
822
+ record: null,
823
+ error: '',
824
+ });
825
+ }
826
+
827
+ this.utils.yida.getFormDataById({
828
+ formUuid: KNOWLEDGE_DATA_FORM_UUID,
829
+ formInstId: docId,
830
+ }).then(function(res) {
831
+ var record = buildKnowledgeRecord(res);
832
+ if (!record || !record.id) {
833
+ self.setCustomState({
834
+ status: 'error',
835
+ docId: docId,
836
+ record: null,
837
+ error: '没有找到这条资料,可能已停用或链接已失效。',
838
+ });
839
+ return;
840
+ }
841
+ if (record.status === '停用') {
842
+ self.setCustomState({
843
+ status: 'error',
844
+ docId: docId,
845
+ record: null,
846
+ error: '这条资料已停用。',
847
+ });
848
+ return;
849
+ }
850
+ self.setCustomState({
851
+ status: 'ready',
852
+ docId: docId,
853
+ docs: [record],
854
+ record: record,
855
+ error: '',
856
+ });
857
+ }).catch(function(err) {
858
+ if (_customState.status === 'ready' && _customState.record) {
859
+ return;
860
+ }
861
+ self.setCustomState({
862
+ status: 'error',
863
+ docId: docId,
864
+ error: err && err.message ? err.message : '读取知识库文档失败。',
865
+ });
866
+ });
867
+ }
868
+
869
+ export function didMount() {
870
+ var self = this;
871
+ if (typeof window !== 'undefined') {
872
+ _blockNoteMessageHandler = function(event) {
873
+ self.handleBlockNoteMessage(event);
874
+ };
875
+ window.addEventListener('message', _blockNoteMessageHandler);
876
+ }
877
+ updateDocumentTitle();
878
+ this.loadMarkdownRenderer();
879
+ this.loadDocument();
880
+ }
881
+
882
+ export function didUnmount() {
883
+ if (_blockNoteMountTimer) {
884
+ clearTimeout(_blockNoteMountTimer);
885
+ _blockNoteMountTimer = null;
886
+ }
887
+ if (typeof window !== 'undefined' && _blockNoteMessageHandler) {
888
+ window.removeEventListener('message', _blockNoteMessageHandler);
889
+ _blockNoteMessageHandler = null;
890
+ }
891
+ }
892
+
893
+ export function goHome() {
894
+ if (typeof window !== 'undefined') {
895
+ window.location.href = getAppHomeUrl();
896
+ }
897
+ }
898
+
899
+ export function reloadDocument() {
900
+ this.loadDocument({ forceRefresh: true });
901
+ }
902
+
903
+ export function copyDocLink() {
904
+ var self = this;
905
+ var url = getDocUrl(_customState.docId || (_customState.record && _customState.record.id));
906
+ if (typeof navigator !== 'undefined' && navigator.clipboard && navigator.clipboard.writeText) {
907
+ navigator.clipboard.writeText(url).then(function() {
908
+ if (self.utils && self.utils.toast) {
909
+ self.utils.toast({ title: '链接已复制', type: 'success' });
910
+ }
911
+ }).catch(function() {});
912
+ }
913
+ }
914
+
915
+ export function enterEditMode() {
916
+ var record = _customState.record;
917
+ if (!record || !record.id) return;
918
+ _editState.editing = true;
919
+ _editState.submitting = false;
920
+ _editState.editTitle = record.title || '';
921
+ _editState.editCategory = record.type || '';
922
+ _editState.editKeywords = record.keywords || '';
923
+ _editState.editSummary = record.summary || '';
924
+ _editState.editBody = record.body || '';
925
+ _editState.editNote = '';
926
+ _editState.editError = '';
927
+ this.setState({ timestamp: Date.now() });
928
+ }
929
+
930
+ export function cancelEdit() {
931
+ _editState.editing = false;
932
+ _editState.submitting = false;
933
+ _editState.editError = '';
934
+ this.setState({ timestamp: Date.now() });
935
+ }
936
+
937
+ export function onEditFieldChange(field, value) {
938
+ _editState[field] = value;
939
+ this.setState({ timestamp: Date.now() });
940
+ }
941
+
942
+ export function submitEditSuggestion() {
943
+ var self = this;
944
+ var record = _customState.record;
945
+ if (!record || !record.id) return;
946
+
947
+ var hasChange = (
948
+ _editState.editTitle !== (record.title || '') ||
949
+ _editState.editCategory !== (record.type || '') ||
950
+ _editState.editKeywords !== (record.keywords || '') ||
951
+ _editState.editSummary !== (record.summary || '') ||
952
+ _editState.editBody !== (record.body || '')
953
+ );
954
+ if (!hasChange) {
955
+ _editState.editError = '没有修改任何内容,无需提交。';
956
+ this.setState({ timestamp: Date.now() });
957
+ return;
958
+ }
959
+ if (!_editState.editTitle.trim()) {
960
+ _editState.editError = '标题不能为空。';
961
+ this.setState({ timestamp: Date.now() });
962
+ return;
963
+ }
964
+
965
+ _editState.submitting = true;
966
+ _editState.editError = '';
967
+ this.setState({ timestamp: Date.now() });
968
+
969
+ var formData = {};
970
+ formData[EDIT_SUGGESTION_FIELDS.originalId] = record.id;
971
+ formData[EDIT_SUGGESTION_FIELDS.originalTitle] = record.title || '';
972
+ formData[EDIT_SUGGESTION_FIELDS.newTitle] = _editState.editTitle;
973
+ formData[EDIT_SUGGESTION_FIELDS.newCategory] = _editState.editCategory;
974
+ formData[EDIT_SUGGESTION_FIELDS.newKeywords] = _editState.editKeywords;
975
+ formData[EDIT_SUGGESTION_FIELDS.newSummary] = _editState.editSummary;
976
+ formData[EDIT_SUGGESTION_FIELDS.newBody] = _editState.editBody;
977
+ formData[EDIT_SUGGESTION_FIELDS.editNote] = _editState.editNote;
978
+
979
+ this.utils.yida.saveFormData({
980
+ formUuid: EDIT_SUGGESTION_FORM_UUID,
981
+ formDataJson: JSON.stringify(formData),
982
+ }).then(function () {
983
+ _editState.editing = false;
984
+ _editState.submitting = false;
985
+ _editState.editError = '';
986
+ if (self.utils && self.utils.toast) {
987
+ self.utils.toast({ title: '编辑建议已提交,等待管理员审批', type: 'success' });
988
+ }
989
+ self.setState({ timestamp: Date.now() });
990
+ }).catch(function (err) {
991
+ _editState.submitting = false;
992
+ _editState.editError = '提交失败:' + (err && err.message ? err.message : '请确认已登录后重试');
993
+ self.setState({ timestamp: Date.now() });
994
+ });
995
+ }
996
+
997
+ export function openDoc(record) {
998
+ if (!record || !record.id || typeof window === 'undefined') {
999
+ return;
1000
+ }
1001
+ window.location.href = getDocUrl(record.id);
1002
+ }
1003
+
1004
+ export function renderMarkdownContent(content) {
1005
+ return (
1006
+ <div
1007
+ className="oy-doc-markdown"
1008
+ style={styles.markdown}
1009
+ dangerouslySetInnerHTML={{ __html: markdownToHtml(content) }}
1010
+ />
1011
+ );
1012
+ }
1013
+
1014
+ export function renderBlockNoteContent(record) {
1015
+ var content = buildDocumentMarkdown(record);
1016
+ return this.renderMarkdownContent(content);
1017
+ }
1018
+
1019
+ export function renderHeader() {
1020
+ var record = _customState.record;
1021
+ return (
1022
+ <header style={styles.header}>
1023
+ <button type="button" onClick={(e) => { this.goHome(); }} style={styles.backButton}>返回 YidaConnector</button>
1024
+ <div style={styles.headerTitle}>
1025
+ <span style={styles.logoMark}><img src={YIDA_SOURCE_ICON_DATA_URI} alt="" style={styles.logoIcon} /></span>
1026
+ <span style={styles.headerName}>知识库文档</span>
1027
+ </div>
1028
+ <div style={styles.headerActions}>
1029
+ <button type="button" onClick={(e) => { this.reloadDocument(); }} style={styles.headerButton}>刷新</button>
1030
+ {record ? <button type="button" onClick={(e) => { this.copyDocLink(); }} style={styles.headerButton}>复制链接</button> : null}
1031
+ </div>
1032
+ </header>
1033
+ );
1034
+ }
1035
+
1036
+ export function renderLoading() {
1037
+ return (
1038
+ <main style={styles.centerStage}>
1039
+ <div style={styles.statusEyebrow}>YidaConnector Knowledge</div>
1040
+ <div style={styles.statusTitle}>正在读取资料</div>
1041
+ <div style={styles.statusText}>从宜搭知识库加载文档内容。</div>
1042
+ </main>
1043
+ );
1044
+ }
1045
+
1046
+ export function renderError() {
1047
+ return (
1048
+ <main style={styles.centerStage}>
1049
+ <div style={styles.statusEyebrow}>YidaConnector Knowledge</div>
1050
+ <div style={styles.statusTitle}>资料暂时不可用</div>
1051
+ <div style={styles.statusText}>{_customState.error || '请稍后重试。'}</div>
1052
+ <div style={styles.statusActions}>
1053
+ <button type="button" onClick={(e) => { this.reloadDocument(); }} style={styles.primaryButton}>重新读取</button>
1054
+ <button type="button" onClick={(e) => { this.goHome(); }} style={styles.secondaryButton}>返回 YidaConnector</button>
1055
+ </div>
1056
+ </main>
1057
+ );
1058
+ }
1059
+
1060
+ export function renderDocList() {
1061
+ var self = this;
1062
+ var docs = _customState.docs || [];
1063
+ return (
1064
+ <main style={styles.listStage}>
1065
+ <div style={styles.listInner}>
1066
+ <div style={styles.statusEyebrow}>YidaConnector Knowledge</div>
1067
+ <h1 style={styles.listTitle}>知识库文档</h1>
1068
+ <p style={styles.listSummary}>这些文档来自 YidaConnector 助手知识库,资料来源链接会打开对应的详情页。</p>
1069
+ <div style={styles.docList}>
1070
+ {docs.length ? docs.map((record) => (
1071
+ <button key={record.id} type="button" onClick={(e) => { self.openDoc(record); }} style={styles.docListItem}>
1072
+ <span style={styles.docListTop}>
1073
+ <span style={styles.docListTitle}>{record.title}</span>
1074
+ <span style={styles.docListType}>{record.type}</span>
1075
+ </span>
1076
+ <span style={styles.docListText}>{record.summary || record.source || 'YidaConnector 助手知识库'}</span>
1077
+ </button>
1078
+ )) : (
1079
+ <div style={styles.statusText}>当前没有已发布资料。</div>
1080
+ )}
1081
+ </div>
1082
+ </div>
1083
+ </main>
1084
+ );
1085
+ }
1086
+
1087
+ export function renderDocument() {
1088
+ var record = _customState.record;
1089
+ if (!record) {
1090
+ return this.renderError();
1091
+ }
1092
+ if (_editState.editing) {
1093
+ return this.renderEditMode(record);
1094
+ }
1095
+ var updatedAt = formatDate(record.updatedAt);
1096
+ var contributors = record.contributors || [];
1097
+ return (
1098
+ <main className="oy-doc-scroll" style={styles.documentScroll}>
1099
+ <article style={styles.article}>
1100
+ <div style={styles.breadcrumb}>YidaConnector 助手 / 知识库</div>
1101
+ <div style={styles.titleRow}>
1102
+ <h1 style={styles.title}>{record.title}</h1>
1103
+ <button type="button" onClick={(e) => { this.enterEditMode(); }} style={styles.editButton}>✏️ 编辑</button>
1104
+ </div>
1105
+ <div style={styles.metaRow}>
1106
+ <span style={styles.metaPill}>{record.type}</span>
1107
+ {updatedAt ? <span style={styles.metaText}>更新于 {updatedAt}</span> : null}
1108
+ {record.source ? <span style={styles.metaText}>来源:{record.source}</span> : null}
1109
+ </div>
1110
+ {contributors.length > 0 ? (
1111
+ <div style={styles.contributorRow}>
1112
+ <span style={styles.contributorLabel}>贡献者</span>
1113
+ {contributors.map(function (name) {
1114
+ return <span key={name} style={styles.contributorPill}>{name}</span>;
1115
+ })}
1116
+ </div>
1117
+ ) : null}
1118
+ {record.summary ? (
1119
+ <section style={styles.callout}>
1120
+ <div style={styles.calloutIcon}>i</div>
1121
+ <div style={styles.calloutText}>{record.summary}</div>
1122
+ </section>
1123
+ ) : null}
1124
+ {record.keywords ? (
1125
+ <div style={styles.keywordRow}>
1126
+ {record.keywords.split(/[、,,\s]+/).filter(Boolean).slice(0, 10).map((keyword) => (
1127
+ <span key={keyword} style={styles.keyword}>{keyword}</span>
1128
+ ))}
1129
+ </div>
1130
+ ) : null}
1131
+ {this.renderBlockNoteContent(record)}
1132
+ </article>
1133
+ </main>
1134
+ );
1135
+ }
1136
+
1137
+ export function renderEditMode(record) {
1138
+ var self = this;
1139
+ var categoryOptions = ['常见问答', '操作指南', '技术文档', '产品公告', '最佳实践'];
1140
+ var editKey = record.id + '-edit';
1141
+ return (
1142
+ <main className="oy-doc-scroll" style={styles.documentScroll}>
1143
+ <article style={styles.article}>
1144
+ <div style={styles.breadcrumb}>YidaConnector 助手 / 知识库 / 编辑模式</div>
1145
+ <div style={styles.titleRow}>
1146
+ <h1 style={styles.title}>编辑文档</h1>
1147
+ <div style={styles.editActions}>
1148
+ <button type="button" onClick={(e) => { self.cancelEdit(); }} style={styles.cancelButton} disabled={_editState.submitting}>取消</button>
1149
+ <button type="button" onClick={(e) => { self.submitEditSuggestion(); }} style={styles.submitButton} disabled={_editState.submitting}>
1150
+ {_editState.submitting ? '提交中...' : '提交编辑建议'}
1151
+ </button>
1152
+ </div>
1153
+ </div>
1154
+ {_editState.editError ? (
1155
+ <div style={styles.editErrorBanner}>{_editState.editError}</div>
1156
+ ) : null}
1157
+ <div style={styles.editField}>
1158
+ <label style={styles.editLabel}>标题</label>
1159
+ <input
1160
+ key={editKey + '-title'}
1161
+ type="text"
1162
+ defaultValue={_editState.editTitle}
1163
+ onChange={(e) => { _editState.editTitle = e.target.value; }}
1164
+ style={styles.editInput}
1165
+ disabled={_editState.submitting}
1166
+ />
1167
+ </div>
1168
+ <div style={styles.editField}>
1169
+ <label style={styles.editLabel}>分类</label>
1170
+ <select
1171
+ key={editKey + '-cat'}
1172
+ defaultValue={_editState.editCategory}
1173
+ onChange={(e) => { _editState.editCategory = e.target.value; }}
1174
+ style={styles.editSelect}
1175
+ disabled={_editState.submitting}
1176
+ >
1177
+ {categoryOptions.map((opt) => <option key={opt} value={opt}>{opt}</option>)}
1178
+ </select>
1179
+ </div>
1180
+ <div style={styles.editField}>
1181
+ <label style={styles.editLabel}>关键词</label>
1182
+ <input
1183
+ key={editKey + '-kw'}
1184
+ type="text"
1185
+ defaultValue={_editState.editKeywords}
1186
+ onChange={(e) => { _editState.editKeywords = e.target.value; }}
1187
+ style={styles.editInput}
1188
+ placeholder="多个关键词用 | 分隔"
1189
+ disabled={_editState.submitting}
1190
+ />
1191
+ </div>
1192
+ <div style={styles.editField}>
1193
+ <label style={styles.editLabel}>摘要</label>
1194
+ <textarea
1195
+ key={editKey + '-summary'}
1196
+ defaultValue={_editState.editSummary}
1197
+ onChange={(e) => { _editState.editSummary = e.target.value; }}
1198
+ style={styles.editTextareaShort}
1199
+ rows={3}
1200
+ disabled={_editState.submitting}
1201
+ />
1202
+ </div>
1203
+ <div style={styles.editField}>
1204
+ <label style={styles.editLabel}>正文(Markdown)</label>
1205
+ <textarea
1206
+ key={editKey + '-body'}
1207
+ defaultValue={_editState.editBody}
1208
+ onChange={(e) => { _editState.editBody = e.target.value; }}
1209
+ style={styles.editTextarea}
1210
+ rows={16}
1211
+ disabled={_editState.submitting}
1212
+ />
1213
+ </div>
1214
+ <div style={styles.editField}>
1215
+ <label style={styles.editLabel}>修改说明(可选,便于管理员审批)</label>
1216
+ <input
1217
+ key={editKey + '-note'}
1218
+ type="text"
1219
+ defaultValue={_editState.editNote}
1220
+ onChange={(e) => { _editState.editNote = e.target.value; }}
1221
+ style={styles.editInput}
1222
+ placeholder="简要说明修改了什么"
1223
+ disabled={_editState.submitting}
1224
+ />
1225
+ </div>
1226
+ <div style={styles.editHint}>提交后将由管理员审批,通过后才会更新到知识库。</div>
1227
+ </article>
1228
+ </main>
1229
+ );
1230
+ }
1231
+
1232
+ export function renderJsx() {
1233
+ var timestamp = this.state && this.state.timestamp;
1234
+ var body = null;
1235
+ if (_customState.status === 'ready') {
1236
+ body = this.renderDocument();
1237
+ } else if (_customState.status === 'list') {
1238
+ body = this.renderDocList();
1239
+ } else if (_customState.status === 'error') {
1240
+ body = this.renderError();
1241
+ } else {
1242
+ body = this.renderLoading();
1243
+ }
1244
+ return (
1245
+ <div style={styles.page}>
1246
+ <div style={{ display: 'none' }}>{timestamp}</div>
1247
+ <style>{DOC_CSS}</style>
1248
+ {this.renderHeader()}
1249
+ {body}
1250
+ </div>
1251
+ );
1252
+ }
1253
+
1254
+ var styles = {
1255
+ page: {
1256
+ minHeight: '100vh',
1257
+ height: '100vh',
1258
+ overflow: 'hidden',
1259
+ background: '#050505',
1260
+ color: '#f5f5f5',
1261
+ fontFamily: '"-apple-system-body","ui-sans-serif","-apple-system","system-ui","Segoe UI","Helvetica","Arial","sans-serif"',
1262
+ },
1263
+ header: {
1264
+ height: 58,
1265
+ boxSizing: 'border-box',
1266
+ display: 'grid',
1267
+ gridTemplateColumns: '180px minmax(0,1fr) 220px',
1268
+ alignItems: 'center',
1269
+ gap: 16,
1270
+ padding: '0 22px',
1271
+ borderBottom: '1px solid rgba(255,255,255,0.1)',
1272
+ background: '#050505',
1273
+ },
1274
+ backButton: {
1275
+ appearance: 'none',
1276
+ border: 0,
1277
+ background: 'transparent',
1278
+ color: '#f4f4f4',
1279
+ cursor: 'pointer',
1280
+ textAlign: 'left',
1281
+ fontSize: 14,
1282
+ fontWeight: 600,
1283
+ },
1284
+ headerTitle: {
1285
+ minWidth: 0,
1286
+ display: 'flex',
1287
+ alignItems: 'center',
1288
+ justifyContent: 'center',
1289
+ gap: 10,
1290
+ },
1291
+ logoMark: {
1292
+ display: 'flex',
1293
+ width: 24,
1294
+ height: 24,
1295
+ alignItems: 'center',
1296
+ justifyContent: 'center',
1297
+ },
1298
+ logoIcon: {
1299
+ width: 19,
1300
+ height: 19,
1301
+ display: 'block',
1302
+ },
1303
+ headerName: {
1304
+ minWidth: 0,
1305
+ overflow: 'hidden',
1306
+ textOverflow: 'ellipsis',
1307
+ whiteSpace: 'nowrap',
1308
+ fontSize: 15,
1309
+ fontWeight: 650,
1310
+ color: '#ffffff',
1311
+ },
1312
+ headerActions: {
1313
+ display: 'flex',
1314
+ justifyContent: 'flex-end',
1315
+ gap: 8,
1316
+ },
1317
+ headerButton: {
1318
+ appearance: 'none',
1319
+ border: '1px solid rgba(255,255,255,0.12)',
1320
+ background: '#151515',
1321
+ color: '#f4f4f4',
1322
+ cursor: 'pointer',
1323
+ borderRadius: 8,
1324
+ height: 32,
1325
+ padding: '0 12px',
1326
+ fontSize: 13,
1327
+ fontWeight: 600,
1328
+ },
1329
+ centerStage: {
1330
+ height: 'calc(100vh - 58px)',
1331
+ boxSizing: 'border-box',
1332
+ display: 'flex',
1333
+ flexDirection: 'column',
1334
+ alignItems: 'center',
1335
+ justifyContent: 'center',
1336
+ padding: 24,
1337
+ textAlign: 'center',
1338
+ },
1339
+ statusEyebrow: {
1340
+ color: '#8fc8ff',
1341
+ fontSize: 13,
1342
+ fontWeight: 700,
1343
+ marginBottom: 14,
1344
+ },
1345
+ statusTitle: {
1346
+ color: '#ffffff',
1347
+ fontSize: 30,
1348
+ lineHeight: 1.25,
1349
+ fontWeight: 650,
1350
+ marginBottom: 12,
1351
+ },
1352
+ statusText: {
1353
+ maxWidth: 560,
1354
+ color: '#bdbdbd',
1355
+ fontSize: 15,
1356
+ lineHeight: 1.75,
1357
+ },
1358
+ statusActions: {
1359
+ display: 'flex',
1360
+ gap: 10,
1361
+ marginTop: 22,
1362
+ },
1363
+ primaryButton: {
1364
+ appearance: 'none',
1365
+ border: 0,
1366
+ background: '#f4f4f4',
1367
+ color: '#111',
1368
+ cursor: 'pointer',
1369
+ borderRadius: 10,
1370
+ height: 38,
1371
+ padding: '0 16px',
1372
+ fontSize: 14,
1373
+ fontWeight: 650,
1374
+ },
1375
+ secondaryButton: {
1376
+ appearance: 'none',
1377
+ border: '1px solid rgba(255,255,255,0.14)',
1378
+ background: '#151515',
1379
+ color: '#f4f4f4',
1380
+ cursor: 'pointer',
1381
+ borderRadius: 10,
1382
+ height: 38,
1383
+ padding: '0 16px',
1384
+ fontSize: 14,
1385
+ fontWeight: 650,
1386
+ },
1387
+ documentScroll: {
1388
+ height: 'calc(100vh - 58px)',
1389
+ overflowY: 'auto',
1390
+ boxSizing: 'border-box',
1391
+ padding: '56px 24px 92px',
1392
+ },
1393
+ article: {
1394
+ width: 'min(820px, 100%)',
1395
+ margin: '0 auto',
1396
+ },
1397
+ breadcrumb: {
1398
+ color: '#9b9b9b',
1399
+ fontSize: 13,
1400
+ lineHeight: 1.5,
1401
+ marginBottom: 18,
1402
+ },
1403
+ titleRow: {
1404
+ display: 'flex',
1405
+ alignItems: 'flex-start',
1406
+ justifyContent: 'space-between',
1407
+ gap: 16,
1408
+ },
1409
+ title: {
1410
+ margin: 0,
1411
+ color: '#fff',
1412
+ fontSize: 40,
1413
+ lineHeight: 1.18,
1414
+ fontWeight: 700,
1415
+ letterSpacing: 0,
1416
+ flex: 1,
1417
+ minWidth: 0,
1418
+ },
1419
+ editButton: {
1420
+ appearance: 'none',
1421
+ border: '1px solid rgba(0,137,255,0.35)',
1422
+ background: 'rgba(0,137,255,0.1)',
1423
+ color: '#9dccff',
1424
+ cursor: 'pointer',
1425
+ borderRadius: 8,
1426
+ height: 36,
1427
+ padding: '0 14px',
1428
+ fontSize: 14,
1429
+ fontWeight: 650,
1430
+ whiteSpace: 'nowrap',
1431
+ flexShrink: 0,
1432
+ marginTop: 6,
1433
+ },
1434
+ contributorRow: {
1435
+ display: 'flex',
1436
+ alignItems: 'center',
1437
+ flexWrap: 'wrap',
1438
+ gap: 8,
1439
+ marginBottom: 20,
1440
+ },
1441
+ contributorLabel: {
1442
+ color: '#9b9b9b',
1443
+ fontSize: 13,
1444
+ fontWeight: 600,
1445
+ },
1446
+ contributorPill: {
1447
+ display: 'inline-flex',
1448
+ alignItems: 'center',
1449
+ height: 24,
1450
+ borderRadius: 999,
1451
+ background: 'rgba(76,175,80,0.14)',
1452
+ color: '#a5d6a7',
1453
+ padding: '0 10px',
1454
+ fontSize: 12,
1455
+ fontWeight: 650,
1456
+ },
1457
+ editActions: {
1458
+ display: 'flex',
1459
+ gap: 8,
1460
+ flexShrink: 0,
1461
+ marginTop: 6,
1462
+ },
1463
+ cancelButton: {
1464
+ appearance: 'none',
1465
+ border: '1px solid rgba(255,255,255,0.14)',
1466
+ background: '#151515',
1467
+ color: '#f4f4f4',
1468
+ cursor: 'pointer',
1469
+ borderRadius: 8,
1470
+ height: 36,
1471
+ padding: '0 14px',
1472
+ fontSize: 14,
1473
+ fontWeight: 650,
1474
+ },
1475
+ submitButton: {
1476
+ appearance: 'none',
1477
+ border: 0,
1478
+ background: '#0089ff',
1479
+ color: '#fff',
1480
+ cursor: 'pointer',
1481
+ borderRadius: 8,
1482
+ height: 36,
1483
+ padding: '0 16px',
1484
+ fontSize: 14,
1485
+ fontWeight: 650,
1486
+ },
1487
+ editErrorBanner: {
1488
+ margin: '12px 0 18px',
1489
+ padding: '10px 14px',
1490
+ borderRadius: 8,
1491
+ background: 'rgba(244,67,54,0.12)',
1492
+ border: '1px solid rgba(244,67,54,0.3)',
1493
+ color: '#ff8a80',
1494
+ fontSize: 14,
1495
+ },
1496
+ editField: {
1497
+ marginBottom: 20,
1498
+ },
1499
+ editLabel: {
1500
+ display: 'block',
1501
+ color: '#bdbdbd',
1502
+ fontSize: 13,
1503
+ fontWeight: 600,
1504
+ marginBottom: 6,
1505
+ },
1506
+ editInput: {
1507
+ display: 'block',
1508
+ width: '100%',
1509
+ boxSizing: 'border-box',
1510
+ height: 40,
1511
+ padding: '0 12px',
1512
+ border: '1px solid rgba(255,255,255,0.14)',
1513
+ borderRadius: 8,
1514
+ background: '#101010',
1515
+ color: '#f4f4f4',
1516
+ fontSize: 15,
1517
+ outline: 'none',
1518
+ },
1519
+ editSelect: {
1520
+ display: 'block',
1521
+ width: '100%',
1522
+ boxSizing: 'border-box',
1523
+ height: 40,
1524
+ padding: '0 10px',
1525
+ border: '1px solid rgba(255,255,255,0.14)',
1526
+ borderRadius: 8,
1527
+ background: '#101010',
1528
+ color: '#f4f4f4',
1529
+ fontSize: 15,
1530
+ outline: 'none',
1531
+ },
1532
+ editTextareaShort: {
1533
+ display: 'block',
1534
+ width: '100%',
1535
+ boxSizing: 'border-box',
1536
+ minHeight: 80,
1537
+ padding: '10px 12px',
1538
+ border: '1px solid rgba(255,255,255,0.14)',
1539
+ borderRadius: 8,
1540
+ background: '#101010',
1541
+ color: '#f4f4f4',
1542
+ fontSize: 15,
1543
+ lineHeight: 1.6,
1544
+ resize: 'vertical',
1545
+ outline: 'none',
1546
+ },
1547
+ editTextarea: {
1548
+ display: 'block',
1549
+ width: '100%',
1550
+ boxSizing: 'border-box',
1551
+ minHeight: 300,
1552
+ padding: '12px 14px',
1553
+ border: '1px solid rgba(255,255,255,0.14)',
1554
+ borderRadius: 8,
1555
+ background: '#101010',
1556
+ color: '#f4f4f4',
1557
+ fontSize: 15,
1558
+ lineHeight: 1.6,
1559
+ fontFamily: 'Menlo, Consolas, monospace',
1560
+ resize: 'vertical',
1561
+ outline: 'none',
1562
+ },
1563
+ editHint: {
1564
+ marginTop: 8,
1565
+ color: '#777',
1566
+ fontSize: 13,
1567
+ },
1568
+ metaRow: {
1569
+ display: 'flex',
1570
+ alignItems: 'center',
1571
+ flexWrap: 'wrap',
1572
+ gap: 10,
1573
+ marginTop: 18,
1574
+ marginBottom: 28,
1575
+ },
1576
+ metaPill: {
1577
+ display: 'inline-flex',
1578
+ alignItems: 'center',
1579
+ height: 26,
1580
+ borderRadius: 999,
1581
+ background: 'rgba(0,137,255,0.16)',
1582
+ color: '#aad5ff',
1583
+ padding: '0 10px',
1584
+ fontSize: 12,
1585
+ fontWeight: 700,
1586
+ },
1587
+ metaText: {
1588
+ color: '#a9a9a9',
1589
+ fontSize: 13,
1590
+ },
1591
+ callout: {
1592
+ display: 'grid',
1593
+ gridTemplateColumns: '24px minmax(0,1fr)',
1594
+ gap: 12,
1595
+ margin: '0 0 26px',
1596
+ padding: '15px 16px',
1597
+ borderRadius: 8,
1598
+ background: '#111820',
1599
+ border: '1px solid rgba(0,137,255,0.22)',
1600
+ },
1601
+ calloutIcon: {
1602
+ width: 22,
1603
+ height: 22,
1604
+ borderRadius: 999,
1605
+ display: 'flex',
1606
+ alignItems: 'center',
1607
+ justifyContent: 'center',
1608
+ background: '#0089ff',
1609
+ color: '#fff',
1610
+ fontSize: 13,
1611
+ fontWeight: 800,
1612
+ fontFamily: 'Georgia,serif',
1613
+ },
1614
+ calloutText: {
1615
+ color: '#dcecff',
1616
+ fontSize: 14,
1617
+ lineHeight: 1.75,
1618
+ },
1619
+ keywordRow: {
1620
+ display: 'flex',
1621
+ flexWrap: 'wrap',
1622
+ gap: 8,
1623
+ marginBottom: 30,
1624
+ },
1625
+ keyword: {
1626
+ display: 'inline-flex',
1627
+ alignItems: 'center',
1628
+ height: 26,
1629
+ borderRadius: 6,
1630
+ background: '#202020',
1631
+ color: '#d7d7d7',
1632
+ padding: '0 9px',
1633
+ fontSize: 12,
1634
+ fontWeight: 600,
1635
+ },
1636
+ blockNoteHost: {
1637
+ minHeight: 220,
1638
+ background: '#050505',
1639
+ },
1640
+ markdown: {
1641
+ color: '#f4f4f4',
1642
+ },
1643
+ listStage: {
1644
+ height: 'calc(100vh - 58px)',
1645
+ overflowY: 'auto',
1646
+ boxSizing: 'border-box',
1647
+ padding: '60px 24px 90px',
1648
+ },
1649
+ listInner: {
1650
+ width: 'min(880px, 100%)',
1651
+ margin: '0 auto',
1652
+ },
1653
+ listTitle: {
1654
+ margin: 0,
1655
+ color: '#fff',
1656
+ fontSize: 38,
1657
+ lineHeight: 1.2,
1658
+ fontWeight: 700,
1659
+ letterSpacing: 0,
1660
+ },
1661
+ listSummary: {
1662
+ margin: '14px 0 26px',
1663
+ color: '#bdbdbd',
1664
+ fontSize: 15,
1665
+ lineHeight: 1.75,
1666
+ },
1667
+ docList: {
1668
+ display: 'flex',
1669
+ flexDirection: 'column',
1670
+ gap: 10,
1671
+ },
1672
+ docListItem: {
1673
+ appearance: 'none',
1674
+ border: '1px solid rgba(255,255,255,0.11)',
1675
+ background: '#101010',
1676
+ color: '#f4f4f4',
1677
+ cursor: 'pointer',
1678
+ borderRadius: 8,
1679
+ padding: '16px 18px',
1680
+ textAlign: 'left',
1681
+ },
1682
+ docListTop: {
1683
+ display: 'flex',
1684
+ alignItems: 'center',
1685
+ gap: 10,
1686
+ marginBottom: 8,
1687
+ },
1688
+ docListTitle: {
1689
+ minWidth: 0,
1690
+ overflow: 'hidden',
1691
+ textOverflow: 'ellipsis',
1692
+ whiteSpace: 'nowrap',
1693
+ color: '#fff',
1694
+ fontSize: 16,
1695
+ fontWeight: 650,
1696
+ },
1697
+ docListType: {
1698
+ display: 'inline-flex',
1699
+ alignItems: 'center',
1700
+ height: 22,
1701
+ borderRadius: 999,
1702
+ background: 'rgba(0,137,255,0.14)',
1703
+ color: '#a9d5ff',
1704
+ padding: '0 8px',
1705
+ fontSize: 12,
1706
+ fontWeight: 650,
1707
+ },
1708
+ docListText: {
1709
+ display: 'block',
1710
+ color: '#bdbdbd',
1711
+ fontSize: 13,
1712
+ lineHeight: 1.65,
1713
+ },
1714
+ };