@houaoran/designer 1.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.
Files changed (126) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/dist/components.es.js +11424 -0
  4. package/dist/components.umd.js +878 -0
  5. package/dist/index.es.js +39113 -0
  6. package/dist/index.umd.js +1187 -0
  7. package/package.json +96 -0
  8. package/src/components/DragBox.vue +49 -0
  9. package/src/components/DragTool.vue +235 -0
  10. package/src/components/EventConfig.vue +557 -0
  11. package/src/components/FcDesigner.vue +2569 -0
  12. package/src/components/FcTitle.vue +69 -0
  13. package/src/components/FetchConfig.vue +415 -0
  14. package/src/components/FieldInput.vue +371 -0
  15. package/src/components/FnConfig.vue +315 -0
  16. package/src/components/FnEditor.vue +327 -0
  17. package/src/components/FnInput.vue +103 -0
  18. package/src/components/FormLabel.vue +47 -0
  19. package/src/components/HtmlEditor.vue +125 -0
  20. package/src/components/JsonPreview.vue +146 -0
  21. package/src/components/OptionsTextInput.vue +151 -0
  22. package/src/components/PropsInput.vue +72 -0
  23. package/src/components/Required.vue +75 -0
  24. package/src/components/Row.vue +26 -0
  25. package/src/components/SignaturePad.vue +176 -0
  26. package/src/components/Struct.vue +153 -0
  27. package/src/components/StructEditor.vue +121 -0
  28. package/src/components/StructTree.vue +209 -0
  29. package/src/components/TableOptions.vue +164 -0
  30. package/src/components/TreeOptions.vue +167 -0
  31. package/src/components/TypeSelect.vue +144 -0
  32. package/src/components/Validate.vue +302 -0
  33. package/src/components/ValueInput.vue +89 -0
  34. package/src/components/Warning.vue +46 -0
  35. package/src/components/ai/AiPanel.vue +1122 -0
  36. package/src/components/ai/MarkdownRenderer.vue +548 -0
  37. package/src/components/language/LanguageConfig.vue +174 -0
  38. package/src/components/language/LanguageInput.vue +191 -0
  39. package/src/components/style/BackgroundInput.vue +315 -0
  40. package/src/components/style/BorderInput.vue +242 -0
  41. package/src/components/style/BoxSizeInput.vue +166 -0
  42. package/src/components/style/BoxSpaceInput.vue +269 -0
  43. package/src/components/style/ColorInput.vue +90 -0
  44. package/src/components/style/ConfigItem.vue +118 -0
  45. package/src/components/style/FontInput.vue +197 -0
  46. package/src/components/style/PositionInput.vue +146 -0
  47. package/src/components/style/RadiusInput.vue +164 -0
  48. package/src/components/style/ShadowContent.vue +335 -0
  49. package/src/components/style/ShadowInput.vue +91 -0
  50. package/src/components/style/SizeInput.vue +118 -0
  51. package/src/components/style/StyleConfig.vue +307 -0
  52. package/src/components/table/Table.vue +252 -0
  53. package/src/components/table/TableView.vue +1058 -0
  54. package/src/components/tableForm/TableForm.vue +471 -0
  55. package/src/components/tableForm/TableFormColumnView.vue +103 -0
  56. package/src/components/tableForm/TableFormView.vue +46 -0
  57. package/src/components/tree/FcTree.vue +713 -0
  58. package/src/components/tree/FcTreeNode.vue +216 -0
  59. package/src/config/base/field.js +43 -0
  60. package/src/config/base/form.js +132 -0
  61. package/src/config/base/style.js +26 -0
  62. package/src/config/base/validate.js +15 -0
  63. package/src/config/index.js +70 -0
  64. package/src/config/menu.js +24 -0
  65. package/src/config/rule/alert.js +45 -0
  66. package/src/config/rule/button.js +49 -0
  67. package/src/config/rule/card.js +40 -0
  68. package/src/config/rule/cascader.js +121 -0
  69. package/src/config/rule/checkbox.js +68 -0
  70. package/src/config/rule/col.js +86 -0
  71. package/src/config/rule/collapse.js +30 -0
  72. package/src/config/rule/collapseItem.js +36 -0
  73. package/src/config/rule/color.js +53 -0
  74. package/src/config/rule/date.js +66 -0
  75. package/src/config/rule/dateRange.js +60 -0
  76. package/src/config/rule/divider.js +31 -0
  77. package/src/config/rule/editor.js +31 -0
  78. package/src/config/rule/group.js +86 -0
  79. package/src/config/rule/html.js +43 -0
  80. package/src/config/rule/image.js +32 -0
  81. package/src/config/rule/input.js +62 -0
  82. package/src/config/rule/number.js +49 -0
  83. package/src/config/rule/password.js +52 -0
  84. package/src/config/rule/radio.js +43 -0
  85. package/src/config/rule/rate.js +44 -0
  86. package/src/config/rule/row.js +46 -0
  87. package/src/config/rule/select.js +70 -0
  88. package/src/config/rule/signaturePad.js +59 -0
  89. package/src/config/rule/slider.js +53 -0
  90. package/src/config/rule/space.js +44 -0
  91. package/src/config/rule/subForm.js +47 -0
  92. package/src/config/rule/switch.js +46 -0
  93. package/src/config/rule/tabPane.js +29 -0
  94. package/src/config/rule/table.js +37 -0
  95. package/src/config/rule/tableForm.js +115 -0
  96. package/src/config/rule/tableFormColumn.js +55 -0
  97. package/src/config/rule/tabs.js +38 -0
  98. package/src/config/rule/tag.js +69 -0
  99. package/src/config/rule/text.js +41 -0
  100. package/src/config/rule/textarea.js +63 -0
  101. package/src/config/rule/time.js +58 -0
  102. package/src/config/rule/timeRange.js +49 -0
  103. package/src/config/rule/title.js +37 -0
  104. package/src/config/rule/transfer.js +59 -0
  105. package/src/config/rule/tree.js +70 -0
  106. package/src/config/rule/treeSelect.js +77 -0
  107. package/src/config/rule/upload.js +107 -0
  108. package/src/form/index.js +19 -0
  109. package/src/index.js +173 -0
  110. package/src/locale/en.js +981 -0
  111. package/src/locale/zh-cn.js +983 -0
  112. package/src/style/fonts/fc-icons.woff +0 -0
  113. package/src/style/icon.css +1052 -0
  114. package/src/style/index.css +836 -0
  115. package/src/utils/form.js +9 -0
  116. package/src/utils/highlight/highlight.min.js +307 -0
  117. package/src/utils/highlight/javascript.min.js +80 -0
  118. package/src/utils/highlight/style.css +1 -0
  119. package/src/utils/highlight/xml.min.js +29 -0
  120. package/src/utils/hintStubs.js +120 -0
  121. package/src/utils/index.js +544 -0
  122. package/src/utils/jsonDiff.js +173 -0
  123. package/src/utils/locale.js +23 -0
  124. package/src/utils/message.js +19 -0
  125. package/src/utils/template.js +105 -0
  126. package/types/index.d.ts +575 -0
@@ -0,0 +1,548 @@
1
+ <template>
2
+ <div class="_fd-markdown-renderer" v-html="renderedMarkdown"></div>
3
+ </template>
4
+
5
+ <script>
6
+ import {marked} from 'marked';
7
+ import hljs from '../../utils/highlight/highlight.min';
8
+ import {copyTextToClipboard} from '../../utils';
9
+ import viewForm from '../../utils/form';
10
+ import {generateLineDiff} from '../../utils/jsonDiff';
11
+
12
+ export default {
13
+ name: 'MarkdownRenderer',
14
+ inject: ['designer'],
15
+ props: {
16
+ content: {
17
+ type: String,
18
+ required: true,
19
+ },
20
+ },
21
+ data() {
22
+ return {};
23
+ },
24
+ computed: {
25
+ t() {
26
+ return this.designer.setupState.t;
27
+ },
28
+ renderedMarkdown() {
29
+ if (!this.content) return '';
30
+
31
+ // 配置 marked
32
+ const renderer = new marked.Renderer();
33
+
34
+ // 重写代码块渲染器
35
+ renderer.code = ({text, lang}) => {
36
+ // 如果是 diff 语言,使用特殊的差异渲染
37
+ if (lang === 'fcRuleDiff') {
38
+ return this.renderDiffCode(text, lang);
39
+ }
40
+
41
+ const highlighted = this.highlightCode(text, lang);
42
+ return `<pre><code class="language-${lang || 'text'}">${highlighted}</code></pre>`;
43
+ };
44
+
45
+ // 重写链接渲染器,让链接在新窗口打开
46
+ renderer.link = ({href, title, text}) => {
47
+ const titleAttr = title ? ` title="${title}"` : '';
48
+ return `<a href="${href}"${titleAttr} target="_blank" rel="noopener noreferrer">${text}</a>`;
49
+ };
50
+
51
+ // 配置 marked 选项
52
+ marked.setOptions({
53
+ renderer: renderer,
54
+ breaks: true,
55
+ gfm: true,
56
+ });
57
+
58
+ // 渲染 markdown
59
+ const html = marked.parse(this.content);
60
+
61
+ // 后处理,添加交互功能
62
+ return this.postprocessHtml(html);
63
+ },
64
+ },
65
+ methods: {
66
+ // 后处理HTML,添加复制功能
67
+ postprocessHtml(html) {
68
+ // 为代码块添加复制按钮和语言显示
69
+ return html.replace(/<pre><code[^>]*class="([^"]*)"[^>]*>([\s\S]*?)<\/code><\/pre>/g, (match, className, codeContent) => {
70
+ const blockId = this.generateBlockId();
71
+
72
+ // 从 className 中提取语言信息
73
+ const languageMatch = className.match(/language-(\w+)/);
74
+ const language = languageMatch ? languageMatch[1] : 'text';
75
+ return `
76
+ <div class="code-block-container" data-block-id="${blockId}">
77
+ <div class="code-block-header">
78
+ <span class="code-language">${language}</span>
79
+ <div class="code-block-actions">
80
+ <div class="code-action-item" onclick="_fd_copyCode('${blockId}')">
81
+ <i class="fc-icon icon-group"></i>
82
+ <span class="code-action-text">${this.t('props.copy')}</span>
83
+ </div>
84
+ ${
85
+ language === 'fcRule'
86
+ ? `<div class="code-action-item is-primary" onclick="_fd_importCode('${blockId}')">
87
+ <i class="fc-icon icon-upload"></i>
88
+ <span class="code-action-text">${this.t('props.import')}</span>
89
+ </div>`
90
+ : ''
91
+ }
92
+ </div>
93
+ </div>
94
+ <pre><code class="${className}">${codeContent}</code></pre>
95
+ </div>
96
+ `;
97
+ });
98
+ },
99
+
100
+ // 代码高亮
101
+ highlightCode(code, language) {
102
+ if (language && hljs.getLanguage(language)) {
103
+ try {
104
+ return hljs.highlight(code, {language}).value;
105
+ } catch (err) {
106
+ console.warn('代码高亮失败:', err);
107
+ }
108
+ }
109
+ return hljs.highlightAuto(code).value;
110
+ },
111
+
112
+ // 生成唯一的代码块ID
113
+ generateBlockId() {
114
+ return 'code-block-' + Math.random().toString(36).substr(2, 9);
115
+ },
116
+
117
+ // 复制代码
118
+ copyCode(blockId) {
119
+ const container = document.querySelector(`[data-block-id="${blockId}"]`);
120
+ if (container) {
121
+ const codeElement = container.querySelector('code');
122
+ if (codeElement) {
123
+ copyTextToClipboard(codeElement.innerText);
124
+ }
125
+ }
126
+ },
127
+
128
+ // 导入数据
129
+ importCode(blockId) {
130
+ const container = document.querySelector(`[data-block-id="${blockId}"]`);
131
+ if (container) {
132
+ const codeElement = container.querySelector('code');
133
+ if (codeElement) {
134
+ const rule = viewForm.parseJson(codeElement.innerText);
135
+ if (Array.isArray(rule)) {
136
+ this.designer.setupState.setRule(rule);
137
+ } else if (rule.rule) {
138
+ this.designer.setupState.setRule(rule.rule);
139
+ }
140
+ }
141
+ }
142
+ },
143
+
144
+ // 渲染差异代码
145
+ renderDiffCode(text, lang) {
146
+ try {
147
+ // 尝试解析 JSON 差异数据
148
+ const diffData = JSON.parse(text);
149
+
150
+ if (diffData.oldJson && diffData.newJson) {
151
+ // 生成差异信息
152
+ const lineDiff = generateLineDiff(JSON.parse(diffData.oldJson), JSON.parse(diffData.newJson));
153
+
154
+ // 生成差异 HTML
155
+ return this.generateDiffHtml(lineDiff, diffData.newJson);
156
+ }
157
+ } catch (e) {
158
+ // 如果不是有效的 JSON,按普通代码处理
159
+ console.warn('解析差异数据失败:', e);
160
+ }
161
+
162
+ // 回退到普通代码渲染
163
+ const highlighted = this.highlightCode(text, 'text');
164
+ return `<pre><code class="language-text">${highlighted}</code></pre>`;
165
+ },
166
+
167
+ // 生成差异 HTML
168
+ generateDiffHtml(lineDiff, newJSON) {
169
+ const blockId = this.generateBlockId();
170
+
171
+ let html = `
172
+ <div class="code-block-container" data-block-id="${blockId}">
173
+ <div class="code-block-header">
174
+ <span class="code-language">DIFF</span>
175
+ <div class="code-block-actions">
176
+ <div class="code-action-item" onclick="_fd_copyCode('${blockId}')">
177
+ <i class="fc-icon icon-group"></i>
178
+ <span class="code-action-text">${this.t('props.copy')}</span>
179
+ </div>
180
+ <div class="code-action-item is-primary" onclick="_fd_importCode('${blockId}')">
181
+ <i class="fc-icon icon-upload"></i>
182
+ <span class="code-action-text">${this.t('props.import')}</span>
183
+ </div>
184
+ </div>
185
+ </div>
186
+ <div class="diff-content">
187
+ <div class="diff-view diff-line-view" id="diff-line-${blockId}">
188
+ ${this.generateLineDiffHtml(lineDiff)}
189
+ </div>
190
+ </div>
191
+ <code style="display: none;">${newJSON}</code>
192
+ </div>
193
+ `;
194
+
195
+ return html;
196
+ },
197
+
198
+ // 生成行级差异 HTML
199
+ generateLineDiffHtml(lineDiff) {
200
+ let html = '<div class="diff-lines">';
201
+
202
+ lineDiff.forEach((line, index) => {
203
+ let lineClass = `diff-line diff-line-${line.type}`;
204
+
205
+ // 如果是上下文行,添加特殊样式
206
+ if (line.isContext) {
207
+ lineClass += ' diff-context';
208
+ }
209
+
210
+ const lineNumber = line.lineNumber;
211
+
212
+ // 如果是相同内容,只显示一行
213
+ if (line.isSame) {
214
+ html += `
215
+ <div class="${lineClass}">
216
+ <div class="diff-line-number">${lineNumber}</div>
217
+ <div class="diff-line-content">
218
+ <div class="diff-same-line">${this.escapeHtml(line.oldLine)}</div>
219
+ </div>
220
+ </div>
221
+ `;
222
+ } else {
223
+ // 有差异的内容,显示两行
224
+ html += `
225
+ <div class="${lineClass}">
226
+ <div class="diff-line-number">${lineNumber}</div>
227
+ <div class="diff-line-content">
228
+ ${line.oldLine ? `<div class="diff-old-line">${this.escapeHtml(line.oldLine)}</div>` : ''}
229
+ ${line.newLine ? `<div class="diff-new-line">${this.escapeHtml(line.newLine)}</div>` : ''}
230
+ </div>
231
+ </div>
232
+ `;
233
+ }
234
+ });
235
+
236
+ html += '</div>';
237
+ return html;
238
+ },
239
+
240
+ // HTML 转义
241
+ escapeHtml(text) {
242
+ const div = document.createElement('div');
243
+ div.textContent = text;
244
+ return div.innerHTML;
245
+ },
246
+ },
247
+
248
+ mounted() {
249
+ // 将方法绑定到全局,供HTML中的onclick使用
250
+ window._fd_copyCode = this.copyCode;
251
+ window._fd_importCode = this.importCode;
252
+ },
253
+ };
254
+ </script>
255
+
256
+ <style scoped>
257
+ ._fd-markdown-renderer {
258
+ line-height: 1.6;
259
+ color: #262626;
260
+ }
261
+
262
+ /* 标题样式 */
263
+ ._fd-markdown-renderer :deep(h1),
264
+ ._fd-markdown-renderer :deep(h2),
265
+ ._fd-markdown-renderer :deep(h3),
266
+ ._fd-markdown-renderer :deep(h4),
267
+ ._fd-markdown-renderer :deep(h5),
268
+ ._fd-markdown-renderer :deep(h6) {
269
+ margin: 16px 0 8px 0;
270
+ font-weight: 600;
271
+ color: #262626;
272
+ }
273
+
274
+ ._fd-markdown-renderer :deep(h1) {
275
+ font-size: 24px;
276
+ }
277
+
278
+ ._fd-markdown-renderer :deep(h2) {
279
+ font-size: 20px;
280
+ }
281
+
282
+ ._fd-markdown-renderer :deep(h3) {
283
+ font-size: 18px;
284
+ }
285
+
286
+ ._fd-markdown-renderer :deep(h4) {
287
+ font-size: 16px;
288
+ }
289
+
290
+ ._fd-markdown-renderer :deep(h5) {
291
+ font-size: 14px;
292
+ }
293
+
294
+ ._fd-markdown-renderer :deep(h6) {
295
+ font-size: 12px;
296
+ }
297
+
298
+ /* 基础文本样式 */
299
+ ._fd-markdown-renderer :deep(p) {
300
+ margin: 8px 0;
301
+ }
302
+
303
+ ._fd-markdown-renderer :deep(ul),
304
+ ._fd-markdown-renderer :deep(ol) {
305
+ margin: 8px 0;
306
+ padding-left: 24px;
307
+ }
308
+
309
+ ._fd-markdown-renderer :deep(ul) {
310
+ list-style-type: disc;
311
+ }
312
+
313
+ ._fd-markdown-renderer :deep(ol) {
314
+ list-style-type: decimal;
315
+ }
316
+
317
+ ._fd-markdown-renderer :deep(li) {
318
+ margin: 4px 0;
319
+ }
320
+
321
+ /* 引用样式 */
322
+ ._fd-markdown-renderer :deep(blockquote) {
323
+ margin: 16px 0;
324
+ padding: 12px 16px;
325
+ border-left: 4px solid #2e73ff;
326
+ background: #f5f5f5;
327
+ border-radius: 0 8px 8px 0;
328
+ }
329
+
330
+ ._fd-markdown-renderer :deep(blockquote p) {
331
+ margin: 0;
332
+ color: #666666;
333
+ }
334
+
335
+ /* 表格样式 */
336
+ ._fd-markdown-renderer :deep(table) {
337
+ width: 100%;
338
+ border-collapse: collapse;
339
+ margin: 16px 0;
340
+ }
341
+
342
+ ._fd-markdown-renderer :deep(th),
343
+ ._fd-markdown-renderer :deep(td) {
344
+ border: 1px solid #ececec;
345
+ padding: 8px 12px;
346
+ text-align: left;
347
+ }
348
+
349
+ ._fd-markdown-renderer :deep(th) {
350
+ background: #f5f5f5;
351
+ font-weight: 600;
352
+ }
353
+
354
+ /* 行内代码样式 */
355
+ ._fd-markdown-renderer :deep(code) {
356
+ background: #f5f5f5;
357
+ padding: 2px 6px;
358
+ border-radius: 4px;
359
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
360
+ font-size: 13px;
361
+ color: #2e73ff;
362
+ }
363
+
364
+ /* 代码块样式 */
365
+ ._fd-markdown-renderer :deep(.code-block-container) {
366
+ position: relative;
367
+ border-radius: 8px;
368
+ border: 1px solid #ececec;
369
+ background: #ececec;
370
+ }
371
+
372
+ /* 代码块样式 */
373
+ ._fd-markdown-renderer :deep(.code-block-container pre) {
374
+ margin: 0;
375
+ padding: 16px;
376
+ background: #ececec;
377
+ max-height: 800px;
378
+ overflow: auto;
379
+ }
380
+
381
+ ._fd-markdown-renderer :deep(.code-block-container code) {
382
+ background: none;
383
+ padding: 0;
384
+ color: #262626;
385
+ font-size: 13px;
386
+ line-height: 1.5;
387
+ }
388
+
389
+ ._fd-markdown-renderer :deep(.code-block-header) {
390
+ position: sticky;
391
+ top: 0;
392
+ z-index: 10;
393
+ display: flex;
394
+ align-items: center;
395
+ justify-content: space-between;
396
+ gap: 8px;
397
+ padding: 8px 12px;
398
+ background: #ececec;
399
+ border-bottom: 1px solid #ececec;
400
+ height: 40px;
401
+ box-sizing: border-box;
402
+ border-radius: 8px 8px 0 0;
403
+ }
404
+
405
+ ._fd-markdown-renderer :deep(.code-block-actions) {
406
+ display: flex;
407
+ align-items: center;
408
+ gap: 4px;
409
+ }
410
+
411
+ ._fd-markdown-renderer :deep(.code-language) {
412
+ font-size: 12px;
413
+ font-weight: 500;
414
+ color: #666666;
415
+ text-transform: uppercase;
416
+ letter-spacing: 0.5px;
417
+ }
418
+
419
+ ._fd-markdown-renderer :deep(.code-action-item) {
420
+ display: flex;
421
+ align-items: center;
422
+ gap: 4px;
423
+ padding: 2px 8px;
424
+ border: none;
425
+ background: transparent;
426
+ border-radius: 4px;
427
+ color: #666666;
428
+ cursor: pointer;
429
+ transition: all 0.2s ease;
430
+ font-size: 12px;
431
+ }
432
+
433
+ ._fd-markdown-renderer :deep(.code-action-item:hover) {
434
+ background: #ffffff;
435
+ color: #262626;
436
+ }
437
+
438
+ ._fd-markdown-renderer :deep(.code-action-item.is-primary) {
439
+ color: #2e73ff;
440
+ }
441
+
442
+ ._fd-markdown-renderer :deep(.code-action-item.is-primary:hover) {
443
+ background: #2e73ff;
444
+ color: white;
445
+ }
446
+
447
+ ._fd-markdown-renderer :deep(.code-action-text) {
448
+ font-size: 12px;
449
+ font-weight: 500;
450
+ }
451
+
452
+ /* 代码高亮样式 */
453
+ ._fd-markdown-renderer :deep(.hljs) {
454
+ background: #ffffff !important;
455
+ color: #262626 !important;
456
+ }
457
+
458
+ /* 链接样式 */
459
+ ._fd-markdown-renderer :deep(a) {
460
+ color: #2e73ff;
461
+ text-decoration: none;
462
+ }
463
+
464
+ ._fd-markdown-renderer :deep(a:hover) {
465
+ text-decoration: underline;
466
+ }
467
+
468
+ /* 强调样式 */
469
+ ._fd-markdown-renderer :deep(strong) {
470
+ font-weight: 600;
471
+ color: #262626;
472
+ }
473
+
474
+ ._fd-markdown-renderer :deep(em) {
475
+ font-style: italic;
476
+ color: #666666;
477
+ }
478
+
479
+ /* 行级差异样式 */
480
+ ._fd-markdown-renderer :deep(.diff-lines) {
481
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
482
+ font-size: 13px;
483
+ line-height: 1.5;
484
+ }
485
+
486
+ ._fd-markdown-renderer :deep(.diff-line) {
487
+ display: flex;
488
+ }
489
+
490
+ ._fd-markdown-renderer :deep(.diff-line-number) {
491
+ width: 30px;
492
+ padding: 4px;
493
+ background: #ececec;
494
+ color: #aaaaaa;
495
+ text-align: right;
496
+ font-size: 11px;
497
+ border-right: 1px solid #ececec;
498
+ flex-shrink: 0;
499
+ }
500
+
501
+ ._fd-markdown-renderer :deep(.diff-line-content) {
502
+ flex: 1;
503
+ word-break: break-all;
504
+ }
505
+
506
+ ._fd-markdown-renderer :deep(.diff-old-line) {
507
+ background: rgba(239, 68, 68, 0.1);
508
+ color: #ef4444;
509
+ padding: 2px 4px;
510
+ }
511
+
512
+ ._fd-markdown-renderer :deep(.diff-new-line) {
513
+ background: rgba(34, 197, 94, 0.1);
514
+ color: #22c55e;
515
+ padding: 2px 4px;
516
+ }
517
+
518
+ ._fd-markdown-renderer :deep(.diff-same-line) {
519
+ color: #262626;
520
+ padding: 2px 4px;
521
+ }
522
+
523
+ ._fd-markdown-renderer :deep(.diff-line-added) {
524
+ background: rgba(34, 197, 94, 0.05);
525
+ }
526
+
527
+ ._fd-markdown-renderer :deep(.diff-line-removed) {
528
+ background: rgba(239, 68, 68, 0.05);
529
+ }
530
+
531
+ ._fd-markdown-renderer :deep(.diff-line-modified) {
532
+ background: rgba(245, 158, 11, 0.05);
533
+ }
534
+
535
+ ._fd-markdown-renderer :deep(.diff-line-unchanged) {
536
+ background: transparent;
537
+ }
538
+
539
+ ._fd-markdown-renderer :deep(.diff-context) {
540
+ background: rgba(107, 114, 128, 0.05);
541
+ opacity: 0.7;
542
+ }
543
+
544
+ ._fd-markdown-renderer :deep(.diff-context .diff-line-number) {
545
+ color: #aaaaaa;
546
+ opacity: 0.6;
547
+ }
548
+ </style>